Hallo, ich will einen Timer programmieren, der bei einem Funktionsaufruf anfängt zu zählen und nach 3 Überläufen eine Funktion aufruft und sich anschließend wieder deaktivert. Bis zum nächsten anstoßen des Timers. Kann mir da jemand helfen??
TOM wrote: > Hallo, > > ich will einen Timer programmieren, der bei einem Funktionsaufruf > anfängt zu zählen und nach 3 Überläufen eine Funktion aufruft und sich > anschließend wieder deaktivert. Bis zum nächsten anstoßen des Timers. > > Kann mir da jemand helfen?? Wobei hast du konkret Schwierigkeiten? Welche Teile kriegst du alleine hin? Vielleicht solltest du erst mal eine Vorübung machen: Vergiss erstmal die ganze Geschichte mit Funktion und 3 Überläufe. Programmier erst mal ein Programm, welches den Timer bei Programmstart loslaufen lässt und bei dem ein Überlauf zu einem Interrupt führt. In der Interrupt Funktion lässt du zb. eine LED umschalten (damit du auch kontrollieren kannst, ob der Interrupt auch wirklich ausgelöst wird). Wenn du das Programmieren kannst (und das ist nicht wirklich schwer), dann hast du eine Menge Dinge über die Timer gelernt und die Umsetzung deines ursprünglichen Problems sollte dann wirklich kein Problem mehr sein.
Wenn ich es richtig verstanden habe, soll mein Timer noch einem Überlauf automatisch eine Interrupt Routine auslösen. SIGNAL ( SIG_OVERFLOW1 ) { zaehler++; if(zaehler == 3) { setzeFensterBits(); TIMSK &= ~(1 << TOIE1); } } Ich verwende den TIMER1 und haben den Systemtakt um 1024 geteilt. So dass eigentlich alle 18 sec die Routine ansprechen soll. Aber leider kommt mein Timer nicht in die Routine. Was mache ich falsch??
>Was mache ich falsch??
Du postest kein komplett-compilierbares Programm.
Dein Programmfragment sollte funktionieren - also liegt der Fehler
woanders.
Definition: TCCR1B = (1 << CS12)| (1 << CS10); // Teiler 1024 Funktionsaufruf: Hier setze ich nur TIMSK zum ein und auschalten und den Startwert. Ansonsten schreibe ich nirgends was mit dem Timer switch(spalteSteuerung) { case 0 : PORTA &= ~(1 << PA2); if ( tippen == TRUE ) { setzeFensterBits(); timerTipp(); } else { setzeFensterBits(); TIMSK |= (1 << TOIE1); TCNT1 = 0; stopTaste = TRUE; } break; case 1 : PORTA |= (1 << PA2); if ( tippen == TRUE ) { setzeFensterBits(); timerTipp(); } else setzeFensterBits(); TIMSK |= (1 << TOIE1); TCNT1 = 0; stopTaste = TRUE; } break; }
Wenn du nirgends ein SEI(); setzt, werden Interrupts überhaupt nicht bedient.
Ich habe so eben festgsstellt, dass mein Timer nicht Üperläuft. Ich habe eine Systemtakt von ca 4MHz. Teiler ist 1024-> f=3,6kHz->bei ca. 65536 Zyklen pro Umlauf. Dann habe ich einen Überlauf alle 18 sec. Soweit richtig??? welche Einstellungen muss ich den vornehmen, damit der Timer los läuft??
Hallo Tom, wo steht Dein SEI(), raul hat Dir schon die gleiche Frage gestellt. Ohne sei() keine Interrupts. Wenn Du Deinen Code nicht zeigen willst, können wir Dir auch nicht helfen. Gruß Frank
>Wenn Du Deinen Code nicht zeigen willst, können wir Dir auch nicht >helfen. Riiichtiiich!
Das Problem ist nur das der Code etwa 10 Seiten lang ist und dies wollte ich euch ersparen!!
TOM wrote: > Das Problem ist nur das der Code etwa 10 Seiten lang ist und dies wollte > ich euch ersparen!! Dann speck ihn ab. Das ist doch wohl nicht zuviel verlangt, dass du ein vollständiges Program zusammenstellst, welches * den Timer initialisiert * eine Interrupt Funktion beinhaltet Das alles zusammen hat maximal 40 Zeilen (grosszügig gerechnet). Wenn dieses Testprogramm funktioniert, dann vergleiche mit deinem richtigen Programm, wo die Unterschiede liegen. Wenn du es nicht hinkriegst, dann poste es und jemand wird dir in Windeseile sagen können, was daran nicht stimmt.
Hallo TOM, 1. Du vermischt signal und isr. Entscheide Dich für eins, in diesem Fall isr und schmeiß als ersten die veraltete signal.h raus. Beim ersten Durchlesen ist mir aufgefallen, dass Deine Implementierung für den Timer Interrupt den Timer1 betrifft.
1 | SIGNAL ( SIG_OVERFLOW1 ) |
2 | {
|
3 | zaehler++; |
4 | if(zaehler == 3) |
5 | {
|
6 | loescheFensterBits(); |
7 | TIMSK &= ~(1 << TOIE1); |
8 | TCCR1B &= ~ (1 << CS12)| (1 << CS10); |
9 | }
|
10 | }
|
In der Init() gibts Du aber Timer0 frei.
1 | // Timer-Interrupt
|
2 | TCCR0 = (1 << CS02)| (1 << CS00); // Systemtakt/1024 |
3 | TIMSK = (1 << TOIE0); // Timer0 Interrupt frei |
4 | TCCR1B = (1 << CS12)| (1 << CS10); |
5 | //TIMSK = (1 << TOIE1);
|
Gruß Frank
Ich benutze zwei Timer. Einmal für die Tastenentprellung (Timer0) und den Timer1. Leider bekomme ich den Timer1 nicht zum überlaufen! Der Timer1 soll dann loslaufen, wenn eine bestimmt Aktion ausgeführt würd. Deshalb will ich den Timer1 erst setzen, wenn die Funktion (Steuerung) ausgeführt wird.
Tom wrote: > Ich benutze zwei Timer. Einmal für die Tastenentprellung (Timer0) und > den Timer1. Leider bekomme ich den Timer1 nicht zum überlaufen! Der > Timer1 soll dann loslaufen, wenn eine bestimmt Aktion ausgeführt würd. > Deshalb will ich den Timer1 erst setzen, wenn die Funktion (Steuerung) > ausgeführt wird. Dann mach das so, dass du den Timer immer für Interrupt konfigurierst und auch konfiguriert lääst. Einen Timer schaltet man ein/aus indem man den Vorteiler setzt bzw. auf 0 zurücksetzt.
>Weshalb nicht alles mit einem Timer machen ?
Das wäre doch viel zu einfach ;-)
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.