Forum: Mikrocontroller und Digitale Elektronik Frequenzmessung +Komperator


von Michael (Gast)


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

von Michael (Gast)


Lesenswert?

1
if(PIND & (1 << PD3))
2
    TCCR0 |= (1<<CS00); // Kein Prescaling, 
3
do
4
{
5
}while(PIND & (1 << PD3));

Schleife ist natürlich nur so richtig.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Komparator heißt das Ding. Wie Du dessen Ein- und Ausgänge routest, 
steht im Datenblatt. Es müssen lediglich einige Bits in 2-3 
Hardware-Registern gesetzt werden.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.