Gast
#1452331
Hallo ,
erst einaml vorne weg, dies ist eine sehr informative und Hilfreiche
Homepage. Ich lese hier jetzt schon seit mehreren Jahren mit.
Nun zu meinem Problem.
Ich möchte eine Freuquenz mit einem ATMEGA 16 Messen und auf einem LCD -
Display ausgeben.
Nur liegt die von mir Gemessene Freuquenz immer etwas daneben.
Wenn ich 100 Hz Anlege zeigt mir mein Display 69hex an was 105 dez
entspricht.
Bei 1000 Hz 467hex bzw. 1127dez
Und bei 3000 Hz d49 bzw. 3401dez.
Hier ist der von mir verwendete Code:
#include "main.h"
#include "lcd_drv.h"
#include "avr/interrupt.h"
#include "util/delay.h"
volatile uint16_t freq_alt;
volatile uint16_t freq;
volatile uint16_t frequenz;
char buf[15];
ISR (TIMER1_CAPT_vect)
{
freq_alt = freq;
freq = ICR1;
}
int main()
{
lcd_init();
lcd_pos( 0, 0 );
lcd_text( (u8*)"TEST");
TCCR1B |= (1<<ICNC1);
TCCR1B |= (1<<ICES1); // pos Flanke
TCCR1B |= (1<<CS10);
TIMSK |= (1<<TICIE1); //Input Capture enable
ACSR |= (1<<ACO);
ACSR |= (1<<ACI); //komparaton an
ACSR |= (1<<ACIC); //Verbindung zu Timer1 Capture
ACSR |= (1<<ACIS1); //steigende Flanke */
freq = 0;
freq_alt = 0;
sei();
for(;;)
{
cli();
frequenz = freq - freq_alt;
sei();
frequenz = 1000000/frequenz;
utoa( frequenz, buf, 15);
lcd_init();
lcd_pos( 0, 0 );
lcd_text( (u8*)buf);
}
}