Vladimir Shilov před 5 roky
rodič
revize
c95466f537
2 změnil soubory, kde provedl 41 přidání a 32 odebrání
  1. 8 0
      ReadMe.txt
  2. 33 32
      src/main.c

+ 8 - 0
ReadMe.txt

@@ -86,3 +86,11 @@ My Nixie Clock IN-12 / Мои часы на ГРИ ИН-12
 Потом попробую считать только длительность 40-ка "1" данных и сразу записывать их в байты.
 
 Что-то сделал. Скорость ком-порта 19200. +556 байт.
+---
+2019.06.06
+Похоже, что DHT22 на прерываниях не светит. Такое впечатление, что постоянно 
+срабатывает прерывание Capture, и соответсвенно получается полная херь. Хотя в 
+режиме поллинга - всё нормально. Но при поллинге нужно блокировать прерывания 
+- а процесс опроса занимает порядка 4 мсек, а это время обновления одного индикатора,
+хотя на гляз и не заметно. Можно пробовать синхронизировать эти события - запускать опрос
+сразу после обновления одного из индикаторов.

+ 33 - 32
src/main.c

@@ -21,12 +21,10 @@
 #include "main.h"
 
 /* Defines */
-/* 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
+// timeout in timer tiks, step 4 mks
 #define DHT_TIMEOUT       1500
-#define DHT_MAX_COUNT     42
+#define DHT_TOUT1         55
+#define DHT_MAX_COUNT     41
 /* Timer2 settings */
 #define TIMER2_HZ         252
 #define TIMER2_PRESCALER  1024
@@ -91,9 +89,10 @@ static void valDecrease(uint8_t * val, uint8_t max);
 static void blink(void);
 static void setSummerWinterTime(void);
 static void dhtStart(void);
-static void dhtBegin(void);
+static void dhtProcess(void);
 static void dhtEnd(void);
 static void dhtTimeout(void);
+static void dhtNoAck(void);
 void usart_putc (char send);
 void usart_puts (const char *send);
 
@@ -213,7 +212,7 @@ static void Board_Init(void) {
   DDRC = DIGIT_PINS; // as output
   DDRD = (DOT_PIN | ANOD_PINS); // as output
 
-  /* Timer1 */
+  /* Timer1, IC negative edge, CTC mode, 64 prescaler, 4 mks one tick */
   TCCR1B = ((0<<ICES1) | (1<<CS11) | (1<<CS10));
 
   /* Timer2 - refresh Nixie values */
@@ -286,33 +285,35 @@ void dotOnPersistent(void) {
 }
 
 static void dhtStart(void) {
-  RTOS_SetTask(dhtBegin, 2, 0);
+  RTOS_SetTask(dhtProcess, 2, 0);
   DHT_PIN_LOW;
 }
 
-static void dhtBegin(void) {
+static void dhtProcess(void) {
   DHT_PIN_INPUT;
-  cli();
-  TCNT1 = 0xffff - DHT_TIMEOUT;
-  //TIMER1_ON;
+  TCNT1 = 0;
 
   uint8_t count;
   uint16_t tcnt_old;
   // ждём первого "0"
-  while(bit_is_set(PINB, PB0) && TCNT1<0xfff0);
+  while(bit_is_set(PINB, PB0) && TCNT1<DHT_TOUT1);
+  if (TCNT1 >= DHT_TOUT1) {
+    RTOS_SetTask(dhtTimeout, 0, 0);
+    return;
+  }
 
-  for (count=0;count<42;count++) {
+  cli();
+  for (count=0;count<41;count++) {
     // "0", начало периода
-    while(bit_is_clear(PINB, PB0) && TCNT1<0xfff0); // ждём начало импульса
+    while(bit_is_clear(PINB, PB0) && TCNT1<DHT_TIMEOUT); // ждём начало импульса
     tcnt_old = TCNT1; // начало импульса
-    while(bit_is_set(PINB, PB0) && TCNT1<0xfff0); // ждём конец импульса
+    while(bit_is_set(PINB, PB0) && TCNT1<DHT_TIMEOUT); // ждём конец импульса
     dhtBuf[count] = (uint8_t)(TCNT1 - tcnt_old); // сохраняем длительность импульса
     tcnt_old = TCNT1;
   }
   sei();
-  //TIMER1_OFF;
 
-  if (TCNT1 >= 0xfff0) {
+  if (TCNT1 >= DHT_TIMEOUT) {
     RTOS_SetTask(dhtTimeout, 0, 0);
   } else {
     RTOS_SetTask(dhtEnd, 0, 0);
@@ -325,18 +326,27 @@ static void dhtEnd(void) {
 
   usart_puts("DHT22 timing data:\r\n");
 
-  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;
+  itoa(dhtBuf[0], buffer, 10);
+  dhtBuf[0] = 0;
+  usart_puts(buffer);
+  usart_puts(RETURN_NEWLINE);
+
+  for (i=0; i<40; i+8) {
+    for (k=1; k<9; k++) {
+      itoa(dhtBuf[i+k], buffer, 10);
+      dhtBuf[i+k] = 0;
       usart_puts(buffer);
       usart_putc('\t');
     }
-      usart_puts(RETURN_NEWLINE);
+    usart_puts(RETURN_NEWLINE);
   }
   usart_puts(RETURN_NEWLINE);
 }
 
+static void dhtNoAck(void) {
+  usart_puts("DHT22 no ACK reached.\r\n");
+}
+
 static void dhtTimeout(void) {
   usart_puts("DHT22 Timeout reached.\r\n");
   dhtEnd();
@@ -745,21 +755,12 @@ ISR(TIMER1_CAPT_vect) {
   icr_old = icr;
   count ++;
   if (count >= DHT_MAX_COUNT) {
-//    TIMER1_OFF;
     icr_old = 0;
     count = 0;
     RTOS_SetTask(dhtEnd, 0, 0);
   }
 }
 
-/**
- * @brief DHT timeout
- */
-ISR(TIMER1_OVF_vect) {
-//  TIMER1_OFF;
-  RTOS_SetTask(dhtTimeout, 0, 0);
-}
-
 /**
  * @brief заглушка для неиспользуемых прерываний
  */