Hallo Hallo
Ich habe eine Frage zu -einem schon oft durchgekautem
Thema-Frequenzmessung mit einem ATMEGA8.
Ich hab mich natürlich schon umgehört, die beste Varaiante is
anscheinend über ICP. Das steht mir leider nicht zu Verfügung, denn mein
Signal kommt auf einem AD Pin herein.
Die nächste Variante dürfte laut diversen Beiträgen die Verwendungn des
Komperators sein. Ich habe aber dazu leider nichts näheres gefunden...
Mitterlweile hab ich mal ein Programm geschrieben, das bei einer
positiven Flanke timer startet und bei einer negativen wieder
abschaltet.
1 | #define F_CPU 16000000
|
2 | #include <avr/io.h>
|
3 | #include <avr/signal.h>
|
4 | volatile uint8_t ovfl;
|
5 | ISR(TIMER0_OVF_vect)
|
6 | {
|
7 | ovfl=ovfl+1;
|
8 | TCNT0 = 90; //Vorladung des Timers
|
9 | }
|
10 | int main (void)
|
11 | {
|
12 | uint16_t endw=0,fre=0;
|
13 | uint8_t over;
|
14 |
|
15 | DDRC &= ~(1<<PC3); //PC3 Eingang
|
16 | PORTC |= (1<<PC3); //PC3 Pullup
|
17 | TCNT0 = 90; //Vorladung des Timers
|
18 | TIMSK |= (1<<TOIE0); //Overflow Interrupt aktiviert
|
19 | sei (); //interrupts einschalten
|
20 | over=0;
|
21 | do
|
22 | {
|
23 | if(PIND & (1 << PD3))
|
24 | TCCR0 |= (1<<CS00); // Kein Prescaling,
|
25 | }while(PIND & (1 << PD3));
|
26 |
|
27 | endw=TCNT2;
|
28 | TCCR0 &= ~(1<<CS00); TCCR0 &= ~(1<<CS01); TCCR0 &= ~(1<<CS02); //Timer stoppen
|
29 |
|
30 | fre = (ovfl * (256-90)) + endw-90;
|
31 | fre = fre/F_CPU;
|
32 | cli(); //Interrupts abschalten
|
33 | return 0;
|
34 | }
|
Den Timer dürfte ich richtig berechnet haben, das ganze ist aber äußerst
unsauber gelöst.
Mir gefällt zB die while schleife nicht, die mir bei jedem Durchlauf
eine Ungenauigkeit reinbringt.
Ich würde jetzt gern in dieses Programm den Comperaotr einbauen, um mit
Interrupts das Starten und Beenden des Timers bewirken zu können...
....hab aber keine Ahnung wie das geht^^
Ich wäre über eure Hilfe sehr dankbar.
Michael