Hallo Spezialisten, ich habe ein Problem mit dem Interruptsystem des Mega32. Ich habe ein Programm erstellt zunächst völlig ohne Interrupts und es funktioniert alles sehr gut. Jetzt möchte ich einen zyklischen Timer2-Overflow-Interrupt hinzufügen. Mein Problem: Es wird nach Aufruf von sei() ständig in einer "Endlosschleife" der Reset-Vector ausgeführt und mein Programm arbeitet zyklisch immer wieder die Initialisierung ab bis zum Aufruf sei(). Woran kann das liegen? Woher bekommt der Mega32 den Reset bei Aufruf von sei() ? Danke für jegliche Hinweise! Programmcode (compilierbares Projekt mit allen Dateien für WINAVR) ist im Anhang. Danke, Gert
Der SEI ist nicht fuer den Reset zustaendig. Dann ist was anderes Falsch. Ich mag den code nicht entzippen.
Für alle Interrupts die aktiv sind musst du auch eine ISR-Funktion im Code haben. Die Standard-Aktion (beim gcc) wenn ein Interrupt auftritt zu dem keine ISR definiert ist ist ein Reset.
Ich bin jetzt nicht den ganzen Source durchgegangen, aber
1 | TIMSK=0x40; //enable timer2 ovf interrupt |
und als einzige ISR, die ich gefunden habe,
1 | ISR(TIMER0_OVF_vect) |
(Timer 2 vs. 0) wollen mir nicht zusammenpassen. Es gibt übrigens die wunderbare Möglichkeit, Sourcecode durch Einrückungen lesbar zu gestalten und durch Verwendung von Bitnamen statt „0x40“ übersichtlich zu halten.
1 | ADCSRA=0xFF; //ADC on in freerunning mode with prescaler 128 = 125kHz@16MHz cpu clock |
kann es sein, dass du da den adc interrupt aktivierst?
Hallo zusammen, erstmal vielen Dank für die Tips, komme eben erst zum Lesen. Zum Code: Ja, nicht der schönste Stil, ist aus vielen Programmen zusammengestückelt. Ich schäme mich :-) @Klaus: Ja, ich habe den ADC-Interrupt aktivieren "müssen" weil ich den ADC im Freerunning Mode laufen habe. Er läuft sonst nicht wenn ich den ADC-Interrupt sperre. Der ADC läuft bei mir kontinuierlich im Hintergrund und aktualisiert nur das Ergebnisregister ADCH auf welches ich dann jederzeit schnell zugreifen kann. @Randy: Danke für den Hinweis, das war mir nicht bekannt! Zusammen mit dem Tip von Klaus würde das passen: ich habe den ADC Interrupt aktiviert aber keine ADC-ISR im Code. Das bedeutet nach Randy dann einen Reset! Würde passen! Ich teste es gleich morgen mal! Schonmal vielen Dank an die Profis ! Super!! Gert
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.