Hallo!
Es gibt den Vorgänger dieses Beitrages bereits bei mikrocontroller.net. Da bin ich schon weitergekommen, jedoch nicht zum Ziel.
Atmega32, 4 MHz.
Ich möchte eine Frequenz von ca. 15hz - 500hz messen. Der ICP kommt nicht in Frage, da ich zwei verschiedene Signale auswerten muss und somit zwei Pins brauche.
Ich habe mich für T0 entschieden. Dann bleibt mir immer noch T1 fürs zweite Signal. Das aber später.
Meine Funktion sieht derzeit so aus:
(Code-Tags spendiert, PicNick)Code:uint16_t fSig() { DDRB &= ~(1<<DDB0); //b0 als eingang PORTB |= (1<<PB0); //internen pull up aktivieren DDRA = (1 << DDA0); //a0 als ausgang uint16_t Sig=0; TCNT0 = 0; //reset timer TCNT1 = 0; //reset timer TCCR0 |= (1 <<CS02) | (1 <<CS01) | (1 <<CS00); //external clock pin 1 TCCR1B |= (1<< CS12) | (0<<CS11) | (1 << CS10); //cpu/1024 while(TCNT1<1024) //chill and count { _delay_ms(189); PORTA |= (1<<PA0); //a0 high _delay_ms(109); PORTA &= ~(1<<PA0); //a0 low } Sig = TCNT0*240; // counted signals TCCR0 &= ~((1 <<CS02) | (1 <<CS01) | (1 <<CS00)); TCCR1B &= ~((1 << CS10) | (1 << CS11) | (1 << CS12)); return Sig; }
Die Sachen in der Schleife sind übrigens nur zu Testzwecken da. Ich lege einfach pin 40 auf pin 1 um ein Eingangssignal zu simulieren bevor ich ein echtes anlege um Fehlerquellen auszuschliessen.
Nun ist es so, dass mir die Funktion 0 ausspuckt, wenn nichts anliegt (soll sie auch). Wenn ich dann das Signal anlege, dann spuckt sie mir einen konstanten Wert aus (auch das finde ich gut). Nehme ich das Signal dann wieder weg, erhalte ich als Rückgabewert allerdings nicht wieder 0. Und das gefällt mir überhaupt nicht.
Kann mir jemand den Fehler im Code oder im Ansatz sagen?
Grüße!







Zitieren

Lesezeichen