Grundlegende Fragen zur Interrupt-Behandlung (68HC11)

05/04/2009 - 21:16 von Florian Rausch | Report spam
Hallo,

die Grundlagen von Assembler sind mir soweit nun klar. Ein LED-Lauflicht
mit beliebigem "Muster" (über eine Tabelle) habe ich laufen. Nun möchte
ich aber mit Interrupts arbeiten, aber meine bisher gefundene Literatur
worf dabei mehr Fragen auf, als sie beantwortete. Habe nun zwar die
Befehle vorgefunden, aber noch nicht verstanden wie genau ich sie
einsetzen muss. Um das ganze mal an einem Beispiel fest zu machen:

Ich habe ein LED-Lauflicht, und mit einem Taster möchte ich das
Lauflicht unterbrechen um irgend etwas anderes mit den LEDs zu machen.

Dazu muss ich Interrupts erstmal zulassen, dann muss ich auf einen
Interrupt warten und danach wieder zurückspringen.

In meinem Falle muss ich dazu beim 68HC11 den Opt-Code in $00EE
schreiben (7E für JMP), und das Sprungziel in $00EF.

Und dann habe ich in verschiedener Literatur die Befehle CLI, SEI, RTI,
WAI gelesen aber nicht verstanden was sie genau tun. Muss ich mit WAI
wirklich auf einen Interrupt warten? Ich dachte ich muss ihn nur
zulassen und ansonsten nicht im Hauptprogramm berücksichtigen, da der
Rest (Sprung, Ausführung Unterprogramm, Rücksprung) von ganz alleine
passiert?

Kann mir vielleicht mal jemand ein kurzes Beispiel für einen ganz
einfachen und grundlegenden Interrupt zeigen? z.B. knapper Pseudocode,
wo aber die benötigten Befehle vorkommen. Wie ich ihn initialisiere,
dahin springe und wieder zurück.

Vielen Dank!
 

Lesen sie die antworten

#1 Jan Seiffert
06/04/2009 - 00:36 | Warnen spam
Florian Rausch wrote:
Hallo,




Hi!

die Grundlagen von Assembler sind mir soweit nun klar. Ein LED-Lauflicht
mit beliebigem "Muster" (über eine Tabelle) habe ich laufen. Nun möchte
ich aber mit Interrupts arbeiten, aber meine bisher gefundene Literatur
worf dabei mehr Fragen auf, als sie beantwortete. Habe nun zwar die
Befehle vorgefunden, aber noch nicht verstanden wie genau ich sie
einsetzen muss. Um das ganze mal an einem Beispiel fest zu machen:




68HC11? Oh ... *google*
Disclaimer:
Ich hab zwar noch nie was mit 68hc11 gemacht, aber wenn ich mir die
Prozessorreferenz so ansehe:

Ich habe ein LED-Lauflicht, und mit einem Taster möchte ich das
Lauflicht unterbrechen um irgend etwas anderes mit den LEDs zu machen.

Dazu muss ich Interrupts erstmal zulassen,



Ja

dann muss ich auf einen Interrupt warten



Naja, kannst, die idee ist, das er "kommt"

und danach wieder zurückspringen.



Ja


In meinem Falle muss ich dazu beim 68HC11 den Opt-Code in $00EE
schreiben (7E für JMP), und das Sprungziel in $00EF.




Das kommt drauf an von wo du das siehst.
Auf Hardwareebene muss einfach die Adresse der Routine am Ende des Addressraums
hinterlegt werden (0xFFC0-0xFFFF), je nachdem fuer welchen Interrupt Vector
(Quelle) was getahn werden soll.
Man hat ja aber nicht immer wirklich da hinten im Addressbereich RAM/ROM
"hingeloetet", da wird dann wohl mit remapping gearbeitet, das die CPU das dort
findet (oder der Bootloader ist da?). Da wird man da wohl mit Einstellungen
und/oder diesem Bootloader zusammen arbeiten muessen.
Da das Ding ja so ein komisches On Chip Bootloader ROM hat (haben kann?),
kann?/soll?/muss? man mit ihm zusammen Arbeiten und dann muss man an anderer
Addresse ein jmp + zieladresse hinterlegen.

Wie man sieht, das kommt alles ein wenig drauf an wie das ganze Memory mapping
aussieht und so weiter, also welcher Chip das genau ist und wie er auf dem Board
verdrahtet ist, was so in den ganzen Registern eingestellt ist.

Und dann habe ich in verschiedener Literatur die Befehle CLI, SEI, RTI,
WAI gelesen aber nicht verstanden was sie genau tun. Muss ich mit WAI
wirklich auf einen Interrupt warten?



Nein.
Also:
Mit CLI aktivierst du die Interrupt verarbeitung.
Mit SEI deaktivierst du die Interrupt verarbeitung.
Dies braucht man manchmal um einen Block von Code "Atomar" zu machen, so das er
nicht unterbrochen werden kann oder um interruptausloesende Hardware zu
initialisieren.

Mit RTI kehrst du aus einem Interrupt zurueck.

Mit WAI kannst du auf einen Interrupt warten, musst aber nicht. Das ist dafuer,
wenn du sonst nichts zu tun hast, must du nicht sinnlos ein
wait: jmp wait
ausfuehren, und wenn ich das Flussdiagramm richtig verstanden habe, dann kannst
du dadurch die Latenz bis zum ausfuehren des Interrupts senken (da die CPU die
Register schon mal in Sicherheit gebracht hat).

Ausserdem gibt es noch den Befehl SWI um einen Software interrupt auszuloesen,
das ist aber, wie !XINT und ILLIGAL_OP ein Non Maskable Interrupt, die kannst du
nicht CLI/SEI beeinflussen, sondern musst am X-Bit im CCR rumfudeln, sofern das
ueberhaupt geht.

Ich dachte ich muss ihn nur
zulassen und ansonsten nicht im Hauptprogramm berücksichtigen, da der
Rest (Sprung, Ausführung Unterprogramm, Rücksprung) von ganz alleine
passiert?




Ja

Kann mir vielleicht mal jemand ein kurzes Beispiel für einen ganz
einfachen und grundlegenden Interrupt zeigen? z.B. knapper Pseudocode,
wo aber die benötigten Befehle vorkommen. Wie ich ihn initialisiere,
dahin springe und wieder zurück.




Ok, das kann ich grad nicht.
Aber du springst nirgendwo hin.
Und die Interrupt routine muesste dann so aussehen:

meine_interrupt_routine:
; Mach
; irgend
; was
rti

Vielleicht helfen dir die Codesnipsel in diesem PDF:
http://www.dee.ufrj.br/microproc/HC11/68hc11ur.pdf

Vielen Dank!


Gruss
Jan

Infolge des gekürzten Budgets und der gestiegenen Unkosten für Gas,
Öl und Strom wurde das Licht am Ende des Tunnels abgeschaltet. Wir
entschuldigen uns für die dadurch entstandenen Unanehmlichkeiten.

Ähnliche fragen