|
@@ -21,9 +21,10 @@
|
|
|
#include "main.h"
|
|
|
|
|
|
/* Defines */
|
|
|
-/* Timer1, IC negative edge, CTC mode, 64 prescaler */
|
|
|
-#define TIMER1_ON TCCR1B = ((0<<ICES1) | (1<<WGM12) | (1<<CS11) | (1<<CS10))
|
|
|
-#define TIMER1_OFF TCCR1B = 0x00
|
|
|
+/* Timer1, IC negative edge, CTC mode, 64 prescaler, 4 mks one tick */
|
|
|
+//#define TIMER1_ON TIMSK |= (_BV(TICIE1) | _BV(TOIE1))
|
|
|
+//#define TIMER1_OFF TIMSK &= (~_BV(TICIE1) | ~_BV(TOIE1))
|
|
|
+// timeout in timer tiks
|
|
|
#define DHT_TIMEOUT 1500
|
|
|
#define DHT_MAX_COUNT 42
|
|
|
/* Timer2 settings */
|
|
@@ -136,7 +137,7 @@ void main(void) {
|
|
|
showTime();
|
|
|
|
|
|
RTOS_SetTask(btnProcess, 5, BTN_SCAN_PERIOD);
|
|
|
- RTOS_SetTask(dhtStart, 7, 60000); //once per minute start DHT22 measure
|
|
|
+ RTOS_SetTask(dhtStart, 1001, 10000); //once per minute start DHT22 measure
|
|
|
|
|
|
/** main loop */
|
|
|
do {
|
|
@@ -212,12 +213,15 @@ static void Board_Init(void) {
|
|
|
DDRC = DIGIT_PINS; // as output
|
|
|
DDRD = (DOT_PIN | ANOD_PINS); // as output
|
|
|
|
|
|
+ /* Timer1 */
|
|
|
+ TCCR1B = ((0<<ICES1) | (1<<CS11) | (1<<CS10));
|
|
|
+
|
|
|
/* Timer2 - refresh Nixie values */
|
|
|
TCCR2 = TIMER2_CS;
|
|
|
TCNT2 = TIMER2_CNT;
|
|
|
|
|
|
/* Timer interrupts */
|
|
|
- TIMSK = _BV(TOIE2) | _BV(TICIE1) | _BV(TOIE1);
|
|
|
+ TIMSK = _BV(TOIE2);
|
|
|
|
|
|
#if (USE_BRIGHT_CONTROL == 1)
|
|
|
OCR2 = pgm_read_byte(&brightConv[BRIGHT_IDX_MAX]);
|
|
@@ -288,26 +292,54 @@ static void dhtStart(void) {
|
|
|
|
|
|
static void dhtBegin(void) {
|
|
|
DHT_PIN_INPUT;
|
|
|
- TCNT1 = 0;
|
|
|
- OCR1A = DHT_TIMEOUT;
|
|
|
- TIMER1_ON;
|
|
|
+ cli();
|
|
|
+ TCNT1 = 0xffff - DHT_TIMEOUT;
|
|
|
+ //TIMER1_ON;
|
|
|
+
|
|
|
+ uint8_t count;
|
|
|
+ uint16_t tcnt_old;
|
|
|
+ // ждём первого "0"
|
|
|
+ while(bit_is_set(PINB, PB0) && TCNT1<0xfff0);
|
|
|
+
|
|
|
+ for (count=0;count<42;count++) {
|
|
|
+ // "0", начало периода
|
|
|
+ while(bit_is_clear(PINB, PB0) && TCNT1<0xfff0); // ждём начало импульса
|
|
|
+ tcnt_old = TCNT1; // начало импульса
|
|
|
+ while(bit_is_set(PINB, PB0) && TCNT1<0xfff0); // ждём конец импульса
|
|
|
+ dhtBuf[count] = (uint8_t)(TCNT1 - tcnt_old); // сохраняем длительность импульса
|
|
|
+ tcnt_old = TCNT1;
|
|
|
+ }
|
|
|
+ sei();
|
|
|
+ //TIMER1_OFF;
|
|
|
+
|
|
|
+ if (TCNT1 >= 0xfff0) {
|
|
|
+ RTOS_SetTask(dhtTimeout, 0, 0);
|
|
|
+ } else {
|
|
|
+ RTOS_SetTask(dhtEnd, 0, 0);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static void dhtEnd(void) {
|
|
|
- uint8_t i;
|
|
|
- char buffer[8];
|
|
|
+ uint8_t i, k;
|
|
|
+ char buffer[6];
|
|
|
|
|
|
usart_puts("DHT22 timing data:\r\n");
|
|
|
|
|
|
- for (i=0; i<DHT_MAX_COUNT; i++) {
|
|
|
- itoa(dhtBuf[i], buffer, 10);
|
|
|
- usart_puts(buffer);
|
|
|
- usart_puts(RETURN_NEWLINE);
|
|
|
+ for (i=0; i<(DHT_MAX_COUNT/6); i++) {
|
|
|
+ for (k=0; k<6; k++) {
|
|
|
+ itoa(dhtBuf[(i*6)+k], buffer, 10);
|
|
|
+ dhtBuf[(i*6)+k] = 0;
|
|
|
+ usart_puts(buffer);
|
|
|
+ usart_putc('\t');
|
|
|
+ }
|
|
|
+ usart_puts(RETURN_NEWLINE);
|
|
|
}
|
|
|
+ usart_puts(RETURN_NEWLINE);
|
|
|
}
|
|
|
|
|
|
static void dhtTimeout(void) {
|
|
|
usart_puts("DHT22 Timeout reached.\r\n");
|
|
|
+ dhtEnd();
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -705,14 +737,16 @@ ISR(TIMER2_COMP_vect) {
|
|
|
*/
|
|
|
ISR(TIMER1_CAPT_vect) {
|
|
|
static uint8_t count = 0;
|
|
|
- static uint16_t old_tcnt = 0;
|
|
|
+ static uint16_t icr_old = 0;
|
|
|
+
|
|
|
+ uint16_t icr = ICR1;
|
|
|
|
|
|
- dhtBuf[count] = (uint8_t)(ICR1 - old_tcnt);
|
|
|
- old_tcnt = ICR1;
|
|
|
+ dhtBuf[count] = (uint8_t)(icr - icr_old);
|
|
|
+ icr_old = icr;
|
|
|
count ++;
|
|
|
- if (count == DHT_MAX_COUNT) {
|
|
|
- TIMER1_OFF;
|
|
|
- old_tcnt = 0;
|
|
|
+ if (count >= DHT_MAX_COUNT) {
|
|
|
+// TIMER1_OFF;
|
|
|
+ icr_old = 0;
|
|
|
count = 0;
|
|
|
RTOS_SetTask(dhtEnd, 0, 0);
|
|
|
}
|
|
@@ -722,7 +756,7 @@ ISR(TIMER1_CAPT_vect) {
|
|
|
* @brief DHT timeout
|
|
|
*/
|
|
|
ISR(TIMER1_OVF_vect) {
|
|
|
- TIMER1_OFF;
|
|
|
+// TIMER1_OFF;
|
|
|
RTOS_SetTask(dhtTimeout, 0, 0);
|
|
|
}
|
|
|
|