dare
13.06.2008, 10: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!
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!