Hallo, ich habe momentan irgendein Problem, dass der Timer nicht funktioniert. Das Programm sollte im Sekundentakt die LEDs (PORTB) an und auschalten, allerdings gehen die LEDs nur an, aber nciht mehr aus. Den Takt soll das Programm von dem 16MHz Quarzbaustein bekommen. Der PreScaler 1024 ist nur probeweise, weil ich mir nicht sicher war, ob die LEDs nicht zu schnell an und ausgehen... Hier ist mal mein Programm: #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> volatile unsigned char time_ist = 0; SIGNAL (SIG_OVERFLOW1) { time_ist++; } void timer (unsigned char time_soll) { TCNT1 = 0; //Rücksetzen des Timers TCCR1B = _BV(CS12) | _BV(CS10); //Prescaler 1024 TIMSK = _BV(TOIE1); //Timer Overflow Interrupt enable sei (); while (time_soll >= time_ist) {} } int main (void) { DDRB = 0xff; for (;;) { timer (1); PORTB = 0xff; timer (1); PORTB = 0x00; timer (1); } } Vielen Dank schon einmal im Vorraus :)
Doch, die gehen schon aus, aber dann auch gleich wieder an, und zwar so schnell, dass Du es nicht siehst. time_ist wird nirgends zurückgesetzt, so dass beim zweiten Aufruf von timer(1) die Bedingung der while-Schleife schon nicht mehr erfüllt ist (time_ist ist ja noch mindestens 1) und dementsprechend die Funktion sofort wieder verlassen wird. BTW: SIGNAL und die signal.h sind veraltet und sollten für neuen Code nicht mehr verwendet werden. Wenn Du keine aktuelle Version der libc hast, dann solltest Du mal updaten und ISR für die Interrupt-Handler verwenden.
Danke :) Jetzt sollte ich das nur noch genau auf den Sekundentakt bekommen... Das Programm sieht gerade so aus: volatile unsigned char time_ist; SIGNAL (SIG_OVERFLOW1) { time_ist++; } void timer (unsigned char time_soll) { time_ist = 0; TCNT1 = 0; //Rücksetzen des Timers TCCR1B = _BV(CS11) | _BV(CS10); //Prescaler 64 TIMSK = _BV(TOIE1); //Timer Overflow Interrupt enable sei (); while (time_soll >= time_ist) {} } int main (void) { DDRB = 0xff; for (;;) { PORTB = 0xff; timer (1); PORTB = 0x00; timer (1); } } Was bringt die aktuelle Version für Vorteile? Ziemlich viel, was ich hier finde ist anscheinend mit älteren Versionen gemacht worden...
Andi wrote: > Danke :) > > Jetzt sollte ich das nur noch genau auf den Sekundentakt bekommen... Dafür solltest Du dann aber nicht den Overflow-Interrupt benutzen, sondern einen Compare-Interrupt und den Timer im CTC-Modus betreiben. > Was bringt die aktuelle Version für Vorteile? Ziemlich viel, was ich > hier finde ist anscheinend mit älteren Versionen gemacht worden... Ich weiß nicht, was für eine Version Du hast. Möglicherweise (wenn Du sie in letzter Zeit heruntergeladen hast) ist das sogar die aktuelle Version. Dann müsstest Du aber zumindest eine Warnmeldung beim Compilieren bekommen, weil es die signal.h gar nicht mehr gibt (SIGNAL ist zwar in der interrupt.h noch definiert, aber nur aus Kompatibilitätsgründen zu alten Versionen). Neue Versionen haben meist den Vorteil, dass Bugs aus älteren Versionen behoben sind (was natürlich nicht bedeutet, dass keine neuen Bugs drin sind;-) und dass auch schon mal Erweiterungen eingebaut werden, die einem das Leben erleichtern können.
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.