|
@@ -52,51 +52,96 @@ __C_task void main(void)
|
|
// Tasks for sheduler
|
|
// Tasks for sheduler
|
|
RTOS_SetTask(startADC,0,50);
|
|
RTOS_SetTask(startADC,0,50);
|
|
RTOS_SetTask(getTime,4,500);
|
|
RTOS_SetTask(getTime,4,500);
|
|
- RTOS_SetTask(ds18b20_StartMeasure,8,10000);
|
|
|
|
|
|
+ RTOS_SetTask(showHHMM,8,500);
|
|
|
|
+ RTOS_SetTask(ds18b20_StartMeasure,12,10000);
|
|
|
|
|
|
- /* Get time */
|
|
|
|
|
|
+ State = show_HHMM;
|
|
|
|
|
|
while(1) {
|
|
while(1) {
|
|
- /*
|
|
|
|
- if (1 == Flag.newTime) {
|
|
|
|
- Flag.newTime = 0;
|
|
|
|
-
|
|
|
|
- Display[0] = IndctrNums[(0x0F & (Clock.hours>>4))];
|
|
|
|
- Display[1] = IndctrNums[(0x0F & Clock.hours)];
|
|
|
|
- Display[2] = IndctrNums[(0x0F & (Clock.minutes>>4))];
|
|
|
|
- Display[3] = IndctrNums[(0x0F & Clock.minutes)];
|
|
|
|
- }
|
|
|
|
- */
|
|
|
|
-
|
|
|
|
- if (1 == Flag.newTemp) {
|
|
|
|
- Flag.newTemp = 0;
|
|
|
|
|
|
|
|
- Display[0] = Sym_blank;
|
|
|
|
- Display[1] = IndctrNums[(0x0F & (Temperature>>4))];
|
|
|
|
- Display[2] = IndctrNums[(0x0F & Temperature)];
|
|
|
|
- Display[3] = Sym_gradus;
|
|
|
|
|
|
+ /* check time */
|
|
|
|
+ if (1 == Flag.newTime) {
|
|
|
|
+ Flag.newTime = 0;
|
|
|
|
+
|
|
|
|
+ if (show_HHMM == State) {
|
|
|
|
+ // every 25 and 55 seconds shoe temperature for 5 seconds
|
|
|
|
+ if ((25 == Clock.seconds) || (55 == Clock.seconds)) {
|
|
|
|
+ RTOS_SetTask(showHHMM,5000,500);
|
|
|
|
+ RTOS_SetTask(showTEMP,0,1000);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /* check buttons */
|
|
if (1 == Flag.newBTN) {
|
|
if (1 == Flag.newBTN) {
|
|
Flag.newBTN = 0;
|
|
Flag.newBTN = 0;
|
|
|
|
|
|
btn_t btn = getBTN();
|
|
btn_t btn = getBTN();
|
|
- if (btn == btn_1) {
|
|
|
|
- LED_ON(LED_1);
|
|
|
|
- } else if (btn == btn_2) {
|
|
|
|
- LED_ON(LED_2);
|
|
|
|
- } else if (btn == btn_3) {
|
|
|
|
- LED_OFF(LED_1);
|
|
|
|
- } else if (btn == btn_4) {
|
|
|
|
- LED_OFF(LED_2);
|
|
|
|
- } else if (btn == btn_5) {
|
|
|
|
- LED_ON(LED_1);
|
|
|
|
- LED_ON(LED_2);
|
|
|
|
- } else if (btn == btn_6) {
|
|
|
|
- LED_OFF(LED_1);
|
|
|
|
- LED_OFF(LED_2);
|
|
|
|
|
|
+ switch (btn) {
|
|
|
|
+ case btn_1:
|
|
|
|
+ // show HH:MM
|
|
|
|
+ State = show_HHMM;
|
|
|
|
+ RTOS_SetTask(showHHMM,0,500);
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case btn_2:
|
|
|
|
+ // show MM SS
|
|
|
|
+ State = show_MMSS;
|
|
|
|
+ Flag.needDot = 0;
|
|
|
|
+ RTOS_SetTask(showMMSS,0,500);
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case btn_3:
|
|
|
|
+ // show temperature
|
|
|
|
+ State = show_TEMP;
|
|
|
|
+ Flag.needDot = 0;
|
|
|
|
+ RTOS_SetTask(showTEMP,0,1000);
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case btn_4:
|
|
|
|
+ // time --
|
|
|
|
+ if (Clock.minutes > 0) {
|
|
|
|
+ Clock.minutes --;
|
|
|
|
+ } else {
|
|
|
|
+ Clock.minutes = 59;
|
|
|
|
+ if (Clock.hours > 0) {
|
|
|
|
+ Clock.hours --;
|
|
|
|
+ } else {
|
|
|
|
+ Clock.hours = 23;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case btn_5:
|
|
|
|
+ // time ++
|
|
|
|
+ Clock.minutes ++;
|
|
|
|
+ if (Clock.minutes > 59) {
|
|
|
|
+ Clock.minutes = 0;
|
|
|
|
+ Clock.hours ++;
|
|
|
|
+ if (Clock.hours > 23) {
|
|
|
|
+ Clock.hours = 0;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case btn_6:
|
|
|
|
+ // save new time
|
|
|
|
+ Flag.blankIndktr = 0;
|
|
|
|
+ setTime();
|
|
|
|
+ RTOS_SetTask(getTime,4,500);
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case btn_7:
|
|
|
|
+ // time set
|
|
|
|
+ Flag.blankIndktr = 1;
|
|
|
|
+ RTOS_SetTask(getTime,0,0);
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ default:
|
|
|
|
+ break;
|
|
}
|
|
}
|
|
- }
|
|
|
|
|
|
+
|
|
|
|
+ } // end of new BTN
|
|
|
|
|
|
tdelay_ms(10); // sleep and rotate dispatcher
|
|
tdelay_ms(10); // sleep and rotate dispatcher
|
|
} // end of while(1)
|
|
} // end of while(1)
|
|
@@ -105,6 +150,40 @@ __C_task void main(void)
|
|
/**
|
|
/**
|
|
* S u b r o u t i n e s
|
|
* S u b r o u t i n e s
|
|
*/
|
|
*/
|
|
|
|
+static void showHHMM(void) {
|
|
|
|
+ State = show_HHMM;
|
|
|
|
+ Display[0] = IndctrNums[(0x0F & (Clock.hours>>4))];
|
|
|
|
+ Display[1] = IndctrNums[(0x0F & Clock.hours)];
|
|
|
|
+ Display[2] = IndctrNums[(0x0F & (Clock.minutes>>4))];
|
|
|
|
+ Display[3] = IndctrNums[(0x0F & Clock.minutes)];
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void showMMSS(void) {
|
|
|
|
+ Display[0] = IndctrNums[(0x0F & (Clock.minutes>>4))];
|
|
|
|
+ Display[1] = IndctrNums[(0x0F & Clock.minutes)];
|
|
|
|
+ Display[2] = IndctrNums[(0x0F & (Clock.seconds>>4))];
|
|
|
|
+ Display[3] = IndctrNums[(0x0F & Clock.seconds)];
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void showTEMP(void) {
|
|
|
|
+ int8_t t = Temperature;
|
|
|
|
+
|
|
|
|
+ if (t < 0) {
|
|
|
|
+ Display[0] = Sym_blank;
|
|
|
|
+ t = -t;
|
|
|
|
+ } else {
|
|
|
|
+ Display[0] = Sym_minus;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // convert to BCD
|
|
|
|
+ t = ((t/10)<<4)|(t%10);
|
|
|
|
+
|
|
|
|
+ Display[1] = IndctrNums[(0x0F & (t>>4))];
|
|
|
|
+ Display[2] = IndctrNums[(0x0F & t)];
|
|
|
|
+ Display[3] = Sym_gradus;
|
|
|
|
+
|
|
|
|
+ Flag.needDot = 0;
|
|
|
|
+}
|
|
|
|
|
|
static void startADC(void) {
|
|
static void startADC(void) {
|
|
// enable interrupt and start conversion
|
|
// enable interrupt and start conversion
|
|
@@ -135,6 +214,10 @@ static btn_t getBTN(void) {
|
|
static void getTime(void) {
|
|
static void getTime(void) {
|
|
static uint8_t old_sec;
|
|
static uint8_t old_sec;
|
|
|
|
|
|
|
|
+ /* Sync with indicators */
|
|
|
|
+ Flag.waitIndktr = 1;
|
|
|
|
+ while (Flag.waitIndktr == 1);
|
|
|
|
+
|
|
/*устанавливаем указатель DS1307 на нулевой адрес*/
|
|
/*устанавливаем указатель DS1307 на нулевой адрес*/
|
|
twi_buf[0] = (DS1307_ADR<<1)|0; //адресный пакет
|
|
twi_buf[0] = (DS1307_ADR<<1)|0; //адресный пакет
|
|
twi_buf[1] = 0; //адрес регистра
|
|
twi_buf[1] = 0; //адрес регистра
|
|
@@ -150,25 +233,32 @@ static void getTime(void) {
|
|
Clock.seconds = twi_buf[1];
|
|
Clock.seconds = twi_buf[1];
|
|
Clock.minutes = twi_buf[2];
|
|
Clock.minutes = twi_buf[2];
|
|
Clock.hours = twi_buf[3];
|
|
Clock.hours = twi_buf[3];
|
|
-
|
|
|
|
- if (old_sec != Clock.seconds) {
|
|
|
|
- Flag.needDot = 1;
|
|
|
|
- old_sec = Clock.seconds;
|
|
|
|
- } else {
|
|
|
|
- Flag.needDot = 0;
|
|
|
|
|
|
+
|
|
|
|
+ if (show_HHMM == State) {
|
|
|
|
+ if (old_sec != Clock.seconds) {
|
|
|
|
+ Flag.needDot = 1;
|
|
|
|
+ } else {
|
|
|
|
+ Flag.needDot = 0;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ old_sec = Clock.seconds;
|
|
Flag.newTime = 1;
|
|
Flag.newTime = 1;
|
|
}
|
|
}
|
|
|
|
|
|
static void setTime(void) {
|
|
static void setTime(void) {
|
|
- /*подготавливаем сообщение*/
|
|
|
|
|
|
+ /* Sync with indicators */
|
|
|
|
+ Flag.waitIndktr = 1;
|
|
|
|
+ while (Flag.waitIndktr == 1);
|
|
|
|
+
|
|
|
|
+ /* prepare new time */
|
|
twi_buf[0] = (DS1307_ADR<<1)|0; //адресный пакет
|
|
twi_buf[0] = (DS1307_ADR<<1)|0; //адресный пакет
|
|
twi_buf[1] = 0; //адрес регистра
|
|
twi_buf[1] = 0; //адрес регистра
|
|
- twi_buf[2] = Clock.seconds; //значение секунд
|
|
|
|
|
|
+ twi_buf[2] = 0; //значение секунд
|
|
twi_buf[3] = Clock.minutes; //значение минут
|
|
twi_buf[3] = Clock.minutes; //значение минут
|
|
twi_buf[4] = Clock.hours; //значение часов
|
|
twi_buf[4] = Clock.hours; //значение часов
|
|
|
|
|
|
- /*отправляем его*/
|
|
|
|
|
|
+ /* senr to rtc */
|
|
TWI_SendData(twi_buf, 5);
|
|
TWI_SendData(twi_buf, 5);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -279,6 +369,10 @@ static void ds18b20_WriteByte(uint8_t byte) {
|
|
}
|
|
}
|
|
|
|
|
|
static void ds18b20_StartMeasure(void) {
|
|
static void ds18b20_StartMeasure(void) {
|
|
|
|
+ /* Sync with indicators */
|
|
|
|
+ Flag.waitIndktr = 1;
|
|
|
|
+ while (Flag.waitIndktr == 1);
|
|
|
|
+
|
|
/* Reset, skip ROM and start temperature conversion */
|
|
/* Reset, skip ROM and start temperature conversion */
|
|
if (ds18b20_Reset() != 0) {
|
|
if (ds18b20_Reset() != 0) {
|
|
Temperature = -99;
|
|
Temperature = -99;
|
|
@@ -292,7 +386,12 @@ static void ds18b20_StartMeasure(void) {
|
|
|
|
|
|
static void ds18b20_ReadTemperature(void) {
|
|
static void ds18b20_ReadTemperature(void) {
|
|
uint8_t temperature[2];
|
|
uint8_t temperature[2];
|
|
|
|
+ uint8_t decimal;
|
|
|
|
|
|
|
|
+ /* Sync with indicators */
|
|
|
|
+ Flag.waitIndktr = 1;
|
|
|
|
+ while (Flag.waitIndktr == 1);
|
|
|
|
+
|
|
/* Reset, skip ROM and send command to read Scratchpad */
|
|
/* Reset, skip ROM and send command to read Scratchpad */
|
|
if (ds18b20_Reset() != 0) {
|
|
if (ds18b20_Reset() != 0) {
|
|
Temperature = -98;
|
|
Temperature = -98;
|
|
@@ -309,20 +408,19 @@ static void ds18b20_ReadTemperature(void) {
|
|
/* Store temperature integer digits */
|
|
/* Store temperature integer digits */
|
|
Temperature = ((temperature[1]&0x7)<<4) | (temperature[0]>>4);
|
|
Temperature = ((temperature[1]&0x7)<<4) | (temperature[0]>>4);
|
|
|
|
|
|
- /* Get only integer part of temperature */
|
|
|
|
-// Temperature = (int8_t)digit;
|
|
|
|
-
|
|
|
|
- //выделяем с помощью битовой маски дробную часть
|
|
|
|
- tempDecimals = (temperature[0] & 15);
|
|
|
|
|
|
+ // get decimal part
|
|
|
|
+ decimal = (temperature[0] & 15);
|
|
|
|
|
|
- //преобразуем в целое число
|
|
|
|
- tempDecimals *= 10; //(tempDecimals << 1) + (tempDecimals << 3);// Умножаем на 10
|
|
|
|
- tempDecimals >>= 4; //(tempDecimals >> 4);//делим на 16 или умножаем на 0.0625
|
|
|
|
|
|
+ // convert to binary
|
|
|
|
+ //decimal *= 10; //(tempDecimals << 1) + (tempDecimals << 3);// Умножаем на 10
|
|
|
|
+ //decimal >>= 4; //(tempDecimals >> 4);//делим на 16 или умножаем на 0.0625
|
|
|
|
|
|
- if (tempDecimals > 4) {
|
|
|
|
|
|
+ // round integer part
|
|
|
|
+ if (decimal > 7) {
|
|
Temperature ++;
|
|
Temperature ++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
Flag.newTemp = 1;
|
|
Flag.newTemp = 1;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -334,41 +432,60 @@ static void ds18b20_ReadTemperature(void) {
|
|
#pragma vector=TIMER0_OVF_vect
|
|
#pragma vector=TIMER0_OVF_vect
|
|
__interrupt void TIMER0_OVF_ISR(void) {
|
|
__interrupt void TIMER0_OVF_ISR(void) {
|
|
static uint8_t indicator = 0;
|
|
static uint8_t indicator = 0;
|
|
|
|
+ static uint8_t blank_time = 0; // blanking timer
|
|
|
|
+ uint8_t flag = 1;
|
|
|
|
|
|
TCNT0 = TIM0_CNT; // reload timer
|
|
TCNT0 = TIM0_CNT; // reload timer
|
|
|
|
|
|
INDCTR_COMMON_PORT &= ~INDCTR_COMMON_ALL; // off all indikators
|
|
INDCTR_COMMON_PORT &= ~INDCTR_COMMON_ALL; // off all indikators
|
|
|
|
|
|
- switch (indicator) {
|
|
|
|
- case 0:
|
|
|
|
- INDCTR_SEGMENT_PORT = Display[0];
|
|
|
|
- INDCTR_COMMON_PORT |= 0x01;
|
|
|
|
- indicator = 1;
|
|
|
|
- break;
|
|
|
|
|
|
+ Flag.waitIndktr = 0;
|
|
|
|
|
|
- case 1:
|
|
|
|
- if (1 == Flag.needDot) {
|
|
|
|
- INDCTR_SEGMENT_PORT = Display[1] | Sym_dot;
|
|
|
|
|
|
+ if (1 == Flag.blankIndktr) {
|
|
|
|
+ if (blank_time <= 200) {
|
|
|
|
+ blank_time ++;
|
|
|
|
+ flag = 1;
|
|
|
|
+ } else if (blank_time <= 250) {
|
|
|
|
+ blank_time ++;
|
|
|
|
+ flag = 0;
|
|
} else {
|
|
} else {
|
|
- INDCTR_SEGMENT_PORT = Display[1];
|
|
|
|
|
|
+ blank_time = 0;
|
|
|
|
+ flag = 1;
|
|
}
|
|
}
|
|
- INDCTR_COMMON_PORT |= 0x02;
|
|
|
|
- indicator = 2;
|
|
|
|
- break;
|
|
|
|
-
|
|
|
|
- case 2:
|
|
|
|
- INDCTR_SEGMENT_PORT = Display[2];
|
|
|
|
- INDCTR_COMMON_PORT |= 0x04;
|
|
|
|
- indicator = 3;
|
|
|
|
- break;
|
|
|
|
-
|
|
|
|
- case 3:
|
|
|
|
- INDCTR_SEGMENT_PORT = Display[3];
|
|
|
|
- INDCTR_COMMON_PORT |= 0x08;
|
|
|
|
-
|
|
|
|
- default:
|
|
|
|
- indicator = 0;
|
|
|
|
- break;
|
|
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (1 == flag) {
|
|
|
|
+ switch (indicator) {
|
|
|
|
+ case 0:
|
|
|
|
+ INDCTR_SEGMENT_PORT = Display[0];
|
|
|
|
+ INDCTR_COMMON_PORT |= 0x01;
|
|
|
|
+ indicator = 1;
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case 1:
|
|
|
|
+ if (1 == Flag.needDot) {
|
|
|
|
+ INDCTR_SEGMENT_PORT = Display[1] | Sym_dot;
|
|
|
|
+ } else {
|
|
|
|
+ INDCTR_SEGMENT_PORT = Display[1];
|
|
|
|
+ }
|
|
|
|
+ INDCTR_COMMON_PORT |= 0x02;
|
|
|
|
+ indicator = 2;
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case 2:
|
|
|
|
+ INDCTR_SEGMENT_PORT = Display[2];
|
|
|
|
+ INDCTR_COMMON_PORT |= 0x04;
|
|
|
|
+ indicator = 3;
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case 3:
|
|
|
|
+ INDCTR_SEGMENT_PORT = Display[3];
|
|
|
|
+ INDCTR_COMMON_PORT |= 0x08;
|
|
|
|
+
|
|
|
|
+ default:
|
|
|
|
+ indicator = 0;
|
|
|
|
+ break;
|
|
|
|
+ } // end of switch
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|