Frequenzmessung +Komperator

Gast #1090201
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren