Hi! Ich versuche gerade einen Delay Generator zu programmieren. Ziel ist das ein ext. Interrupt einen Timer startet, der wiederrum bei compare match ein Bit setzt. Funktioniert alles wunderbar, nur leider springt mein Programm nach dem Interrupt nicht in die Hauptschleife zurück. Evtl. liegt es auch daran, dass die Debounce-Routine von Peter Danneger durch meine Interrupts gestört wird. Also wer was dazu weiß, bedanke mich schonmal. Code ist im Anhang. Gruß Joba
Sieht mir irgendwie nach Designfehler aus. Aber gut. Warum denn die Interrupts allgemein sperren? Das wird auch den LCD-Routinen nicht gut tun (und Peter D.s Entprellung auch nicht.) Also, lass das! :-) Die Ausgabe völlig aus dem Delay-Schreiben rausnehmen oder das setzen des Timer-Registers. Den fraglichen Timer kannst Du auch einzeln anhalten, falls das Dein Bedenken ist.
Nun die Interrupts deaktiviere ich in delay-schreiben weil ich in OCR1A schreibe. Wenn ich Timer 1 nicht aktiviere habe ich das Problem mit der Rückkehr in's Hauptprogramm nicht. Also kann es daran meiner Meinung nach auch nicht hängen.
Habe den Fehler gefunden. Habe wegen deinem Hinweis, dass ich den Timer auch so anhalten kann nochmal rumgespielt. und es ist kein wunder, dass nichts mehr geht. Durch
1 | TIMSK = ( 1<<OCIE1A ); // enable timer interrupt T1A |
lösche ich das Interrupt enable von Timer 0. Alles klar, auf jeden Fall trotzdem Danke Ahem
>Funktioniert alles wunderbar, nur leider springt mein >Programm nach dem Interrupt nicht in die Hauptschleife zurück. Niemals. >Durch >TIMSK = ( 1<<OCIE1A ); // enable timer interrupt T1A >lösche ich das Interrupt enable von Timer 0. Richtig. Genau das, und nichts anderes. Das verhindert, daß beim nächsten compare match die ISR aufgerufen wird, verursacht aber nicht, daß das Programm nicht aus der ISR zurückkommt. Am Ende der ISR steht der Befehl reti, und der bedeutet: Spring zurück dahin, wo du her kommst. Immer. Das einzige, was schief gehen kann, ist ein versemmelter Stack, dann geht der Sprung irgenwohin, aber gesprungen wird immer. Aber es stellt sich natürlich die Frage, wie du überhaupt rausgefunden hast, daß es da nicht zurückspringt... Oliver
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.