mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frequenzmessung +Komperator


Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
#define F_CPU 16000000 
#include <avr/io.h>
#include <avr/signal.h>
volatile uint8_t ovfl; 
ISR(TIMER0_OVF_vect)
{
   ovfl=ovfl+1;
   TCNT0 = 90;                 //Vorladung des Timers  
} 
int main (void) 
{
  uint16_t endw=0,fre=0;
  uint8_t over;

  DDRC &= ~(1<<PC3);         //PC3 Eingang
  PORTC |= (1<<PC3);         //PC3 Pullup 
  TCNT0 = 90;                //Vorladung des Timers  
  TIMSK |= (1<<TOIE0);       //Overflow Interrupt aktiviert 
  sei ();              //interrupts einschalten
  over=0;
  do
  {
    if(PIND & (1 << PD3))
    TCCR0 |= (1<<CS00); // Kein Prescaling, 
  }while(PIND & (1 << PD3));
  
  endw=TCNT2;
  TCCR0 &= ~(1<<CS00);  TCCR0 &= ~(1<<CS01);  TCCR0 &= ~(1<<CS02);  //Timer stoppen
  
  fre = (ovfl * (256-90)) + endw-90; 
  fre = fre/F_CPU;
  cli();  //Interrupts abschalten
  return 0;
}

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

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if(PIND & (1 << PD3))
    TCCR0 |= (1<<CS00); // Kein Prescaling, 
do
{
}while(PIND & (1 << PD3));

Schleife ist natürlich nur so richtig.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.