Ver código fonte

Знову невдача...

Vladimir N. Shilov 5 anos atrás
pai
commit
23477d5a7e
2 arquivos alterados com 56 adições e 22 exclusões
  1. 1 1
      Makefile
  2. 55 21
      src/main.c

+ 1 - 1
Makefile

@@ -143,7 +143,7 @@ CSTANDARD = -std=gnu99
 
 
 # Place -D or -U options here for C sources
-CDEFS = -DF_CPU=$(F_CPU)UL -DUSE_BRIGHT_CONTROL=1
+CDEFS = -DF_CPU=$(F_CPU)UL -DUSE_BRIGHT_CONTROL=0
 
 
 # Place -D or -U options here for ASM sources

+ 55 - 21
src/main.c

@@ -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);
 }