P R A K T I K U M   M I K R O C O M P U T E R




Versuch 4: Zähler, bedingte Unterbrechungen

Bei diesem Versuch sollen ein einfacher mod-6-Zähler betrieben und verschiedene bedingte Unterbrechungen aktiviert und bearbeitet werden. Geeignete Programmteile sind als Unterprogramm zu formulieren. Zeichnen Sie immer zuerst ein Flußdiagramm und programmieren Sie dann danach.

[1]   Ein 2-stelliger Hex-Zähler ist mit einer Frequenz von 10 Hz zu betreiben. Seine aktuelle Stellung soll über Port C [7:0] ausgegeben und mittels der 7-Segment-Anzeigen A1 und A2 (mit Decoder) dargestellt werden. Der zeitbestimmende Programmteil soll als Unterprogramm (D100) unter Verwendung des Registers Y formuliert werden. Orientieren Sie sich an den Programmen aus Versuch 2.

[2]   Modifizieren Sie das Programm nach [1] so, daß beim Starten des Programms der Text "M68HC11 gestartet" auf das Terminalfenster ausgegeben wird. Verwenden Sie dazu die beim Versuch 3 entwickelten Unterprogramme zur Initialisierung der SCI, sowie zur Zeichen- und Stringausgabe (CHOU und STOU).

[3]   Zusätzlich zu [2] sind nun bedingte Unterbrechungen zu bearbeiten. Mittels der Tasten T0 und T1, die an den Eingängen STRA und PA7 des M68HC11 anzuschließen sind, können bedingte Unterbrechungen ausgelöst werden. Als Folge darauf sollen vom Hauptprogramm aus folgende Ausgaben auf das Terminalfenster erfolgen:

Die Unterprogramme zur Unterbrechungsbearbeitung sind möglichst kurz zu halten. Zur Signalisierung von der Unterbrechungsbearbeitung zum Hauptprogramm sollen die Bits 0 und 1 einer Variablen DFLG (display flag) verwendet werden. Die zum Starten der Unterbrechungsbearbeitungen nötigen Vektoren nicht vergessen:
    org     $ffda
    dc.w    pirq    ; pulse accu input (PA7)
    org     $fff2
    dc.w    sirq    ; IRQ/STRA
    org     $fffe
    dc.w    main    ; reset

[4]   Ergänzend zu [3] soll statt des Textes "PA7I seen" beim Auftreten einer Unterbrechung durch T1 an PA7 der jeweilige Befehlszählerstand des unterbrochenen Programms als 4-stellige Hexzahl auf das Terminalfenster ausgegeben werden ("PC=XXXX"). Verwenden Sie dazu unter anderem das Unterprogramm hx4a (siehe unten). Es wird nur der Wert des Befehlszählers in der 16-Bit-Variablen PCSTAT von der Unterbrechungsbearbeitung ans Hauptprogramm übergeben; die Ausgabe erfolgt dann dort.

Die beiden Unterprogramme hx2a und hx4a können Sie von dieser Angabe per Cut-and-Paste übernehmen. Dabei ist zu beachten, daß hx2a und hx4a den entstehenden String nach fallenden Adressen hin aufbauen und daß damit die Übergabeparameter entsprechend gewählt werden müssen. Sehen Sie sich dazu auch den Quelltext zu den Unterprogrammen am Ende dieses Dokuments an.

Anhang: Binär zu ASCII-Decodierung (hx4a)

Diese Unterprogramme werden beim vierten Praktikumstermin benötigt. Im Speicher liegen die Werte bekanntermaßen binär vor. Um einen Speicherinhalt oder eine Adresse auf der seriellen Schnittstelle (Terminal) oder einem LC-Display ausgeben zu können, müsen die Werte als ASCII-Zeichen dargestellt werden.
Die folgenden vier miteinander verbundenen Unterprogramme wandeln einen 16-Bit-Wert, einen 8-Bit-Wert oder einen 4-Bit-Wert in eine Hexadezimalzahl in ASCII-Darstellung um (4, 2, oder 1 Stelle):
hx4a	psha              ; Akku A auf dem Stack ablegen
        bsr     hx2a      ; Akku B umwandeln (Stelle 3 und 4)
        pulb              ; Akku A vom Stack holen, in Akku B ablegen
                          ; Nun einfach in hx2a fallen und Akku B
                          ; umwandeln (Stelle 1 und 2)
hx2a    pshb              ; Akku B auf dem Stack sichern
        bsr     hx1a      ; Bits 0-3 von Akku B umwandeln
        pulb              ; Original-Akku B wieder holen
        lsrb              ; viermal schieben (Bits 4-7 --> 0-3)
        lsrb
        lsrb              ; und nun die obere Haelfte umwandeln
        lsrb              ; indem einfach in hx1a gefallen wird
                          ; Nun wird die eigentliche Arbeit gemacht:
hx1a    andb    #$0F      ; die oberen 4 Bits ausmaskieren
        addb    #48       ; ASCII-Wert von "0" addieren
        cmpb    #57       ; groesser als "9"?
        bls     hx1b      ; nein, dann speichern
        addb    #7        ; sonst die Distanz zwischen "9" und "a" addieren
hx1b    stab    0,y       ; im Speicher ablegen, auf den Y zeigt
        dey               ; Y zeigt jetzt auf die Stelle davor
        rts               ; und weg
Beispielaufruf:
   
        ldd     #$AFFE    ; Hexzahl in Akku D laden
        ldy     #PUFFER+3 ; Position auf letzte Stelle im Puffer
                          ; der Puffer muss im Datenbereich reserviert sein
        bsr     hx4a      ; do it!
        ldy     #PUFFER   ; y --> Pufferanfang
        bsr     STOU      ; z.B. seriell ausgeben