mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RETI ohne Interrupt aufrufen?


Autor: F. P. (pl504)
Datum:

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

Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuchs einfach.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Ben ___ (burning_silicon)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: F. P. (pl504)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Ben ___ (burning_silicon)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: F. P. (pl504)
Datum:

Bewertung
0 lesenswert
nicht 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. :)

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Ben ___ (burning_silicon)
Datum:

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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.