Forum: Compiler & IDEs Frequenzmessung mit ATMEGA32


von puma5 (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
bin  uC Neuling und versuche mit einem Atmega32 eine Frequenz zu
messen.
Habe an den INT0 Eingang einen echten Frequenzgenerator angeschlossen.
Die Werte wollte ich erst mal binär auf dem PORTA ausgeben lassen.

Könntet Ihr euch evtl. mal den Quellcode ansehen, da der Ausgang
ziemlich merkwürdige Werte anzeigt...

MfG puma5

von Ulli (Gast)


Lesenswert?

hab das hier zwar nicht getestet aber vieleicht hilft es dir weiter

#define SYSCLK   1000000
#define PRESCALE 1024
#define OVERFLOW 255  // 0...255
#define T_SCALE  ( 1 / SYSCLk)  PRESCALE  OVERFLOW //ergibt die Zeit
in Sek.
//
static unsigned char x = 0; //Toggle Variable (!könnte auch als Bit
deklariert werden)
static unsigned char xcnt = 0; //Zähler (* vieleicht besser als Int
nehmen)
//----------------------------------------------------
SIGNAL(SIG_INTERRUPT0)   //Zeit zwischen zwei Flanken messen
{

 if(x==0)            //als gesetzt markieren
 {
   x=1;
   xcnt=0;     //Zähler zurücksetzen
 }
 else        //löschen
 {
   x=0;
   PORTA = T_SCALE * xcnt; //Ausgabe als Zeit*???
 }
}
//----------------------------------------------------
SIGNAL(SIG_OVERFLOW0)
{
 if(x==1) xcnt+=1;    //wenn gesetzt Zähler inkrementieren
}
//----------------------------------------------------


/* *??? bei der Berechnung für die Ausgabe, wusste ich nicht so recht,
was du am Port anzeigen willst (die Zeit zwischen zwei Flanken?) */

int main(void)
{
init();
sei();
    while(1)
    {
      //hier passiert (noch) nichts
                }
}

mfg Ulli

von puma (Gast)


Lesenswert?

Danke schon mal
kann es leider heute nich mehr testen.
Wollte am Port A die Frequenz in Hz ausgeben.
Die messung soll zwischen zwei positiven Flanken erfolgen.
Habe ich den Zähler und die Interrupts richtig initialisiert?

GICR=0x40;  // Interruptcontrol Register externer Interrupt 0
aktiviert
MCUCR=0x03; // Selektion der Flanken hier steigende Flanke für Int 0
TCCR0=0x05; // Prescaler auf 1024 setzen
TIMSK=0x01; // Timermaskenregister Interrupt overflow freigeben

mfg Puma

von Ulli (Gast)


Lesenswert?

Hallo so auf den ersten Blick denke ich schon, dass es ok ist nur ob die
Auflösung um die Frequenzen, die du damit messen willst dafür geignet
sind weiß ich nicht..

mfg Ulli

von baeri3 (Gast)


Lesenswert?

Ich würde damit gerne Frequenzen von ca. 1-2kHz messen, wobei +-10Hz
schon genügen würde!
Ist dass mit obigem Code möglich?

von Dominik T. (dom) Benutzerseite


Lesenswert?

Hallo,

ich würde anstelle des externen Interrupts einfach die Input Capture
Funktion des Timers verwenden oder Wenn die Auflösung nicht so hoch
sein soll mit T0 oder T1 die Impulse pro Zeiteinheit zählen.

Gruß, Dominik

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.