Forum: Mikrocontroller und Digitale Elektronik RETI ohne Interrupt aufrufen?


von F. P. (pl504)


Lesenswert?

Was passiert, wenn z.B. beim ATmega8 ein RETI aufgerufen wird, ohne daß 
vorher ein Interrupt ausgelöst wurde?

von Sascha (Gast)


Lesenswert?

Versuchs einfach.

von Hannes L. (hannes)


Lesenswert?

F. P. schrieb:
> Was passiert, wenn z.B. beim ATmega8 ein RETI aufgerufen wird, ohne daß
> vorher ein Interrupt ausgelöst wurde?

Es werden 2 Bytes vom Stack geholt, als Rücksprungadresse interpretiert 
und dort hingesprungen. Zusätzlich wird noch das I-Flag im 
Statusregister gesetzt, also Interrupts global freigegeben.

Da ohne Interrupt oder (R)Call keine Rücksprungadresse auf den Stack 
gelegt wurde, dauert es nicht lange, bis der Stackpointer den 
Stack-Bereich verlässt und Unfug macht. Es ist also nicht zu empfehlen, 
ein RET(oder RETI) aufzurufen, ohne vorher ein (R)CALL oder Interrupt zu 
haben.

...

von Ben _. (burning_silicon)


Lesenswert?

ohne vorbereitungen schießt du den controller programmtechnisch direkt 
ins nirvana. das ding crasht einfach.

ansonsten wie schon gesagt wurde, wenn du ihm eine (gültige) adresse vom 
programm auf den stack packst und den RETI ausführst springt der 
controller an diese adresse und setzt das interruptflag. ein SEI und JMP 
sind aber der kürzere code als zwei PUSH und ein RETI.

von F. P. (pl504)


Lesenswert?

Alles klar, danke. Es ist schön, daß es auch Leute gibt, die sinnvolle 
Antworten geben können. So ein lapidares "Versuchs einfach" finde ich 
arrogant.

Wenn ich also zu Beginn eines Programms (Interrupts sind noch gesperrt) 
direkt per RCALL die ISR aufrufe, ist das ja so, als wenn ein Interrupt 
ausgelöst wurde. Das RETI am Ende der ISR läßt lt. Simulator das 
Programm anschließend wieder ganz normal nach dem RCALL fortsetzen und 
gibt gleichzeitig auch noch die Interrupts frei.

So wie ich es verstanden habe, wird also das RETI in diesem Falle als 
normales RET "interpretiert" und man spart sich gleichzeitig noch das 
SEI.

von Hannes L. (hannes)


Lesenswert?

> So wie ich es verstanden habe, wird also das RETI in diesem Falle als
> normales RET "interpretiert" und man spart sich gleichzeitig noch das
> SEI.

Das ist richtig.

Sowas sollte man aber erst tun, wenn man einen Wissensstand erreicht 
hat, der Deine Frage überflüssig macht.

Denn bevor man mit solchen Tricks das Programm auf Kosten der Lesbarkeit 
des Quelltextes optimiert, sollte man die Basics souverän beherrschen. 
Leute, die die Welt mit ein paar Tricks blenden und beeindrucken, ohne 
die Grundlagen ihres Gewerbes zu kennen, gibt s bereits mehr als genug 
auf dieser Welt. Ich hoffe, Du willst nicht zu Denen gehören.

...

von Ben _. (burning_silicon)


Lesenswert?

in diesem fall ist ein "versuchs einfach" gar nicht sooo abwegig. du 
kannst das programm ja beispielsweise im AVR studio simulieren, da 
siehst du ja was passiert. der test mit einem realen µC sagt dir nur, 
daß das ding abstürzt. nur warum weißt du dann nicht. ich denke mal 
sinnvoll nutzen kann man das nicht - außer zum beenden einer ISR. ich 
würde mit sowas erst anfangen wenn es die letzte möglichkeit ist den 
code in den flash zu quetschen indem man das byte für SEI einspart.

von F. P. (pl504)


Lesenswert?

Ganz so unerfahren bin ich nun auch nicht mehr in Assembler. Es gibt 
halt trotzdem immer mal Sachen, die man so noch nicht kennt oder noch 
nicht ausprobiert hat.
Meine Frage hatte sich daraus ergeben, daß ich bei einem Programm gerne 
nach dem Einschalten/Reset direkt die ISR aufgerufen haben wollte und 
nicht erst auf einen Interrupt warten wollte. Manuell ließ sich der 
Interrupt durch OCF1A nicht auslösen, sonst hätte ich es einfach so 
gelöst.
Na gut, man hätte den Match-Wert zu Beginn direkt in das Zählregister 
schreiben können, aber das wären wieder ein paar Bytes mehr.

Controller läuft so, wie er soll. Also alles in Butter. :)

von Hannes L. (hannes)


Lesenswert?

Na denn ist's ja gut, Du musst Dir ja die Jacke nicht anziehen, wenn sie 
Dir nicht passt. Ich halte es aufgrund der Lesbarkeit des Quelltextes 
trotzdem für besser, die Initialisierung mit SEI abzuschließen. Aber 
Jeder hat eben seinen eigenen Stil (und wenn's nur Copy&Paste ist) und 
muss damit klar kommen.

...

von Ben _. (burning_silicon)


Lesenswert?

du kannst eine ISR auch mit einem (r)call anspringen wenn du damit leben 
kannst, daß beim beenden das globale interruptflag gesetzt wird.

von spess53 (Gast)


Lesenswert?

Hi

> Manuell ließ sich der Interrupt durch OCF1A nicht auslösen,...

Muss es ein Interrupt sein? Unter bestimmten Umständen könnte man das 
'Force Output Compare-Bit' benutzen.

MfG Spess

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.