|
@@ -21,7 +21,7 @@ __C_task void main(void)
|
|
|
INDCTR_COMMON_PORT = ~INDCTR_COMMON_ALL; // off all indikators
|
|
|
|
|
|
for(i=0; i<INDCTR_NUMS; i++) {
|
|
|
- Display[i] = IndctrNums[i];
|
|
|
+ Display[i] = Sym_minus;
|
|
|
}
|
|
|
|
|
|
Flag.needDot = 0;
|
|
@@ -31,10 +31,8 @@ __C_task void main(void)
|
|
|
TCNT0 = TIM0_CNT; // load timer
|
|
|
TIMSK |= 1<<TOIE0; // enable TIM0_OVF interrupt
|
|
|
|
|
|
- /* Timer0 every 4 ms switch showing LED */
|
|
|
- TCCR0 = TIM0_PRESCALER;
|
|
|
- TCNT0 = TIM0_CNT; // load timer
|
|
|
- TIMSK |= 1<<TOIE0; // enable TIM0_OVF interrupt
|
|
|
+ /* Timer1 ticks with 1 MHz frequency for DS18B20 delays */
|
|
|
+ TCCR1B = TIM1_PRESCALER;
|
|
|
|
|
|
/* ADC init */
|
|
|
resultADC = 0;
|
|
@@ -51,11 +49,13 @@ __C_task void main(void)
|
|
|
|
|
|
// Tasks for sheduler
|
|
|
RTOS_SetTask(startADC,0,50);
|
|
|
- RTOS_SetTask(getTime,0,500);
|
|
|
+ RTOS_SetTask(getTime,4,500);
|
|
|
+ RTOS_SetTask(ds18b20_StartMeasure,8,10000);
|
|
|
|
|
|
/* Get time */
|
|
|
|
|
|
while(1) {
|
|
|
+ /*
|
|
|
if (1 == Flag.newTime) {
|
|
|
Flag.newTime = 0;
|
|
|
|
|
@@ -64,6 +64,20 @@ __C_task void main(void)
|
|
|
Display[2] = IndctrNums[(0x0F & (Clock.minutes>>4))];
|
|
|
Display[3] = IndctrNums[(0x0F & Clock.minutes)];
|
|
|
}
|
|
|
+ */
|
|
|
+
|
|
|
+ if (1 == Flag.newTemp) {
|
|
|
+ Flag.newTemp = 0;
|
|
|
+
|
|
|
+ if (Temperature < 0) {
|
|
|
+ Display[0] = Sym_minus;
|
|
|
+ } else {
|
|
|
+ Display[0] = Sym_blank;
|
|
|
+ }
|
|
|
+ Display[1] = IndctrNums[(0x0F & (Temperature>>4))];
|
|
|
+ Display[2] = IndctrNums[(0x0F & Temperature)];
|
|
|
+ Display[3] = Sym_gradus;
|
|
|
+ }
|
|
|
|
|
|
if (1 == Flag.newBTN) {
|
|
|
Flag.newBTN = 0;
|
|
@@ -160,6 +174,177 @@ static void setTime(void) {
|
|
|
TWI_SendData(twi_buf, 5);
|
|
|
}
|
|
|
|
|
|
+static uint8_t ds18b20_Reset(void) {
|
|
|
+ uint8_t i;
|
|
|
+
|
|
|
+ /* Pull line low and wait for 480uS */
|
|
|
+ DS18B20_LOW;
|
|
|
+ DS18B20_OUTPUT_MODE;
|
|
|
+
|
|
|
+ //ds18b20_delay(us(480));
|
|
|
+ Flag.T1OC = 0;
|
|
|
+ TCNT1 = 0;
|
|
|
+ OCR1A = 480;
|
|
|
+ TIMSK |= (1<<OCF1A);
|
|
|
+ while (0 == Flag.T1OC) {
|
|
|
+ MCUCR = 1<<SE;
|
|
|
+ __sleep();
|
|
|
+ }
|
|
|
+ Flag.T1OC = 0;
|
|
|
+
|
|
|
+ /* Release line and wait for 60uS */
|
|
|
+ DS18B20_INPUT_MODE;
|
|
|
+ //ds18b20_delay(us(60));
|
|
|
+ TCNT1 = 0;
|
|
|
+ OCR1A = 60;
|
|
|
+ OCR1B = 420;
|
|
|
+ TIMSK |= (1<<OCF1B);
|
|
|
+ while (0 == Flag.T1OC) {
|
|
|
+ MCUCR = 1<<SE;
|
|
|
+ __sleep();
|
|
|
+ }
|
|
|
+ Flag.T1OC = 0;
|
|
|
+
|
|
|
+ /* Store line value and wait until the completion of 480uS period */
|
|
|
+ i = DS18B20_VALUE;
|
|
|
+ //ds18b20_delay(us(420));
|
|
|
+ while (0 == Flag.T1OC) {
|
|
|
+ MCUCR = 1<<SE;
|
|
|
+ __sleep();
|
|
|
+ }
|
|
|
+ TIMSK &= ~((1<<OCF1A) | (1<<OCF1B));
|
|
|
+
|
|
|
+ /* Return the value read from the presence pulse (0=OK, else=WRONG) */
|
|
|
+ return i;
|
|
|
+}
|
|
|
+
|
|
|
+static void ds18b20_WriteBit(uint8_t bit) {
|
|
|
+ /* Pull line low for 1uS */
|
|
|
+ DS18B20_LOW;
|
|
|
+ DS18B20_OUTPUT_MODE;
|
|
|
+ //ds18b20_delay(us(1));
|
|
|
+ __delay_cycles(8);
|
|
|
+
|
|
|
+ /* If we want to write 1, release the line (if not will keep low) */
|
|
|
+ if(1 == bit) {
|
|
|
+ DS18B20_INPUT_MODE;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Wait for 60uS and release the line */
|
|
|
+ //ds18b20_delay(us(60));
|
|
|
+ Flag.T1OC = 0;
|
|
|
+ TCNT1 = 0;
|
|
|
+ OCR1A = 60;
|
|
|
+ TIMSK |= (1<<OCF1A);
|
|
|
+ while (0 == Flag.T1OC) {
|
|
|
+ MCUCR = 1<<SE;
|
|
|
+ __sleep();
|
|
|
+ }
|
|
|
+ TIMSK &= ~(1<<OCF1A);
|
|
|
+
|
|
|
+ DS18B20_INPUT_MODE;
|
|
|
+}
|
|
|
+
|
|
|
+static uint8_t ds18b20_ReadBit(void) {
|
|
|
+ uint8_t bit=0;
|
|
|
+
|
|
|
+ /* Pull line low for 1uS */
|
|
|
+ DS18B20_LOW;
|
|
|
+ DS18B20_OUTPUT_MODE;
|
|
|
+ //ds18b20_delay(us(1));
|
|
|
+ __delay_cycles(8);
|
|
|
+
|
|
|
+ /* Release line and wait for 14uS */
|
|
|
+ DS18B20_INPUT_MODE;
|
|
|
+ //ds18b20_delay(us(14));
|
|
|
+ Flag.T1OC = 0;
|
|
|
+ TCNT1 = 0;
|
|
|
+ OCR1A = 14;
|
|
|
+ OCR1B = 45;
|
|
|
+ TIMSK |= (1<<OCF1A) | (1<<OCF1B);
|
|
|
+ while (0 == Flag.T1OC) {
|
|
|
+ MCUCR = 1<<SE;
|
|
|
+ __sleep();
|
|
|
+ }
|
|
|
+ Flag.T1OC = 0;
|
|
|
+
|
|
|
+ /* Read line value */
|
|
|
+ if (DS18B20_VALUE != 0) {
|
|
|
+ bit = 0x80;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Wait for 45uS to end and return read value */
|
|
|
+ //ds18b20_delay(us(45));
|
|
|
+ while (0 == Flag.T1OC) {
|
|
|
+ MCUCR = 1<<SE;
|
|
|
+ __sleep();
|
|
|
+ }
|
|
|
+ TIMSK &= ~((1<<OCF1A) | (1<<OCF1B));
|
|
|
+
|
|
|
+ return bit;
|
|
|
+}
|
|
|
+
|
|
|
+static uint8_t ds18b20_ReadByte(void) {
|
|
|
+ uint8_t i=8, n=0;
|
|
|
+
|
|
|
+ while (i--) {
|
|
|
+ /* Shift one position right and store read value */
|
|
|
+ n >>= 1;
|
|
|
+ n |= ds18b20_ReadBit();
|
|
|
+ }
|
|
|
+ return n;
|
|
|
+}
|
|
|
+
|
|
|
+static void ds18b20_WriteByte(uint8_t byte) {
|
|
|
+ uint8_t i=8;
|
|
|
+
|
|
|
+ while (i--) {
|
|
|
+ /* Write actual bit and shift one position right to make the next bit ready */
|
|
|
+ ds18b20_WriteBit(byte & 0x01);
|
|
|
+ byte >>= 1;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+static void ds18b20_StartMeasure(void) {
|
|
|
+ /* Reset, skip ROM and start temperature conversion */
|
|
|
+ if (ds18b20_Reset() != 0) {
|
|
|
+ Temperature = -99;
|
|
|
+ Flag.newTemp = 1;
|
|
|
+ } else {
|
|
|
+ ds18b20_WriteByte(DS18B20_CMD_SKIPROM);
|
|
|
+ ds18b20_WriteByte(DS18B20_CMD_CONVERTTEMP);
|
|
|
+ RTOS_SetTask(ds18b20_ReadTemperature, 750, 0);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+static void ds18b20_ReadTemperature(void) {
|
|
|
+ uint8_t temperature[2];
|
|
|
+ int8_t digit;
|
|
|
+
|
|
|
+ /* Reset, skip ROM and send command to read Scratchpad */
|
|
|
+ if (ds18b20_Reset() != 0) {
|
|
|
+ Temperature = -98;
|
|
|
+ } else {
|
|
|
+ ds18b20_WriteByte(DS18B20_CMD_SKIPROM);
|
|
|
+ ds18b20_WriteByte(DS18B20_CMD_RSCRATCHPAD);
|
|
|
+
|
|
|
+ /* Read Scratchpad (only 2 first bytes) */
|
|
|
+ temperature[0]=ds18b20_ReadByte();
|
|
|
+ temperature[1]=ds18b20_ReadByte();
|
|
|
+
|
|
|
+ //ds18b20_reset();
|
|
|
+
|
|
|
+ /* Store temperature integer digits */
|
|
|
+ digit=temperature[0]>>4;
|
|
|
+ digit|=(temperature[1]&0x7)<<4;
|
|
|
+
|
|
|
+ /* Get only integer part of temperature */
|
|
|
+ Temperature = digit / 16;
|
|
|
+ }
|
|
|
+
|
|
|
+ Flag.newTemp = 1;
|
|
|
+}
|
|
|
+
|
|
|
|
|
|
/**
|
|
|
* I n t e r r u p t h a n d l e r s
|
|
@@ -206,6 +391,16 @@ __interrupt void TIMER0_OVF_ISR(void) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+#pragma vector=TIMER1_COMPA_vect
|
|
|
+__interrupt void TIMER1_COMPA_ISR(void) {
|
|
|
+ Flag.T1OC = 1;
|
|
|
+}
|
|
|
+
|
|
|
+#pragma vector=TIMER1_COMPB_vect
|
|
|
+__interrupt void TIMER1_COMPB_ISR(void) {
|
|
|
+ Flag.T1OC = 1;
|
|
|
+}
|
|
|
+
|
|
|
#pragma vector=ADC_vect
|
|
|
__interrupt void ADC_ISR(void) {
|
|
|
resultADC = ADCH;
|