Forum: Mikrocontroller und Digitale Elektronik Kontinuierlicher Reset-Interrupt ?


von Gert Tannheim (Gast)


Angehängte Dateien:

Lesenswert?

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

von Purzel H. (hacky)


Lesenswert?

Der SEI ist nicht fuer den Reset zustaendig. Dann ist was anderes 
Falsch. Ich mag den code nicht entzippen.

von Randy (Gast)


Lesenswert?

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.

von Hc Z. (mizch)


Lesenswert?

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.

von Klaus T. (gauchi)


Lesenswert?

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?

von Gert (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.