PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit Timern und Frequenzmessung



dare
13.06.2008, 09:43
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:


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;
}
(Code-Tags spendiert, PicNick)


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!

Gock
13.06.2008, 13:08
Ja aber stimmt der konstante Wert auch mit der Realität überein???
Kann ich irgendwie nicht so recht glauben. Hab aber auch nicht soviel Zeit, eine bessere Beschreibung, wie das funktionieren soll, würde helfen.

dare
13.06.2008, 14:51
Hab grad keine Zeit für ne detaillierte Beschreibung.
Problem ist gelöst.
Lag an der Ausgabe, nicht an der Funktion.
Grüße!