Forum: Mikrocontroller und Digitale Elektronik Frage zu Programmcounter Speicherung auf Stack


von Fabi (Gast)


Lesenswert?

Chip: 68HC11 Mirkoconroller
Sprache: Assembler

Ich soll für die Uni ein Programm dazu schreiben.
Das funst auch bisher Prima.

Jetzt soll ein interrupt stattfinden. Das klappt auch Super.
Nun will ich den letzten Programmcounter-Stand vor dem Interrupt über 
ein Terminal ausgeben.
Das macht die Funktion STOU.
Ans Ende wird noch ein ETX angefügt.
Diese Funktion funktioniert und gibt das worauf das Register Y(16bit) 
zeigt im Terminal aus (bis zum ETX).
Eine Funktion HX4A Wandelt den 16 bit Wert in ASCII Code...

Das zur erläuterung.
Meine Frage ist jetzt:
Wie bekomme ich den Stand des Programmcounters in meinen Doppelakku 
(a+b)

Dies soll am Anfang der ISR geschehen.
gehe ich recht in der annahme das der PC auf den Stack geschmissen wird, 
wenn ein Interrupt stattfindet?
1
**** PIRQ - ISR Wenn PA7 eingetroffen **********************************************
2
PIRQ    ;PC_CODE holen und in D speichern
3
        tsx                ; Stransfer Stack Pointer to X
4
        ldaa  0,x          ; 
5
        ldab  1,x          ;
6
    
7
        ;PC_CODE anzeigen
8
        ldy  #PC_CODE+4    ; Ans Ende des Opcodes Zeigen
9
        ldab  #$03         ; ETX anfügen
10
        stab  0,y          ;
11
        dey                ; Pointer neu setzen
12
        bsr  HX4A          ; Funktion um Wert zu speichern in ASCII
13
        iny                ; Anfangsposition für Wort
14
        bsr  STOU          ; String ausgeben (y Zeigt schon auf OP_CODE)
15
    
16
        ; Interrupt wieder Freischalten (wichtig!)
17
        psha               ; Akku A retten
18
        ldaa  #%00010000   ; PA7 löschen, damit neuer Interrupt möglich ist
19
        staa  TFLG2        ;
20
        pula               ; und wieder holen
21
22
        rti

Also die unteren beiden Teile Funktionieren prima. Ich bekomm nur nie 
den PC stand, der da (da ein Interrupt ja immer eintreten kann) immer 
unterschiedlich sein sollte.

Danke schonmal für die Hilfe

von Fabi (Gast)


Lesenswert?

Für alle die es Interessiert:
1
PIRQ    ;PC_CODE anzeigen
2
    ldy  #PC_CODE+2  ; Ans Ende des Opcodes Zeigen
3
    ldab  #$03    ; ETX anfügen
4
    stab  0,y    ;
5
    dey      ; Pointer neu setzen
6
      ;PC_CODE holen
7
      tsx    ; Stack to X
8
      ldd  7,x  ; Lade D
9
    bsr  HX4A    ; Funktion um Wert zu speichern in ASCII
10
    iny      ; Anfangsposition für Wort
11
    bsr  STOU    ; String ausgeben (y Zeigt schon auf OP_CODE)
12
    
13
    ; Interrupt wieder Freischalten (wichtig!)
14
    psha      ; Akku A retten
15
    ldaa  #%00010000  ; PA7 löschen, damit neuer Interrupt möglich ist
16
    staa  TFLG2    ;
17
    pula      ; und wieder holen
18
19
    rti

Aber fragt mich nicht warum man einen Offset von 7 bei ldd braucht.
Müsste eigentlich LDD 2,x sein. isses aber nicht...

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.