|
@@ -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 заглушка для неиспользуемых прерываний
|
|
|
*/
|