Hallo Forum,
ich versuche gerade meinen Feuchtigkeitssensor (http://www.hoperf.com/upload/sensor/hh10d.pdf) mit meinem RN-Control auszuwerten.
Den Frequenzausgang des Sensors habe ich mit Pin D2 (INT0) verbunden.
Der Grundgedanke ist, dass ich bei einer steigenden Flanke in der ISR von INT0 eine Variable hochzähle und die dann 1x in der Sekunde auf ein Terminal ausgebe.
Damit bekomme ich ja dann die Impulse pro Sekunde sprich die Frequenz raus.
Jetzt verwende ich dieses Programm:
Allerdings stimmt die Frequenz nicht mit der Frequenz des Sensors überein (ich kontrolliere das per Oszi). Der Mikrocontroller spuckt mir immer einen Wert aus der 100-200 zu hoch ist.Code:/* * HH10D.c * * Created: 03.05.2012 20:46:19 * Author: Daniel */ #include <avr/io.h> #include <avr/interrupt.h> #include <string.h> #include <util/delay.h> #include <stdlib.h> int lenght = 0x00; char data[50]; volatile int Zaehler = 0x00; int Frequenz = 0x00; int main(void) { UART_Init(); Port_Init(); Timer1_Init(); sei(); while(1) { } } void UART_Init() { UCSRB = (1<<RXEN) | (1<<TXEN); // Rx und Tx aktivieren UCSRC = (1<<URSEL)| (1<<UCSZ1) | (1<<UCSZ0); // 8 Bit Nachrichtenlänge einstellen UBRRH = 0x00; UBRRL = 0x33; // Baudrate auf 19200 festlegen } void Port_Init() { DDRD = 0x00; MCUCR = (1<<ISC01); // Interrupt auf fallende Flanke stellen GIMSK = (1<<INT0); // INT0 aktivieren } void Timer1_Init() { TCCR1B = (1<<CS12); // Prescaler 256 TCNT1H = 0x0B; TCNT1L = 0xDB; TIMSK |= (1<<TOIE1); // Timer1 Overflow Interrupt aktivieren } void Send_UART(char data[]) { char Counter; lenght = strlen(data); while(Counter < lenght) { while (!(UCSRA & (1<<UDRE))); UDR = data[Counter]; Counter++; } Counter = 0x00; while (!(UCSRA & (1<<UDRE))); UDR = 0x0A; while (!(UCSRA & (1<<UDRE))); UDR = 0x0D; } ISR(TIMER1_OVF_vect) { cli(); Frequenz = Zaehler; Zaehler = 0x00; TCNT1H = 0x0B; TCNT1L = 0xDB; sei(); itoa(Frequenz, data, 10); Send_UART(data); } ISR(INT0_vect) { Zaehler++; }
Weiß einer woran das liegen könnte?
Danke für die Hilfe!
Lesezeichen