Kampi
27.05.2012, 14:58
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:
/*
* 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++;
}
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.
Weiß einer woran das liegen könnte?
Danke für die Hilfe!
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:
/*
* 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++;
}
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.
Weiß einer woran das liegen könnte?
Danke für die Hilfe!