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
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
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
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
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.