MOP Praktikum 5

by

These are notes taken during the MOP practical course 2005. Sources are prepared in such a way that tutors can easily check if they were just copied from here. So do yourself a favor and don't copy it.

Kontrollfragen

  1. Was ist ein Mikrocontroller, was sind seine wesentlichen Merkmale? Was unterscheidet ihn z.B. von einem typischen PC-Prozessor? Nennen Sie Ihnen bekannte Anwendungsgebiete des Mikrocontrollers!

    1. Mikrokontroller = Computer on a Chip
      • ähnlich Mikroprozessor
      • kleine Baugröße für alle wichtigen Komponenten
      • kleine Signalwege
      • "feste" Bestimmung der Komponenten
      • (geringe Leistungsaufnahme)
    2. Unterschied PC-Prozessor:
      • Preisgünstig
      • weniger Leistungsaufnahme
      • teilweise sehr spezialisiert
      • "andere Funktionen" (Beispiel 1 Bit-Funktionen des 8086)
    3. Anwendungsgebiete:
      • überall (eingebettete Systeme)
      • Rechnerkomponenten
      • Steueranlagen
      • Unterhaltungselektronik
  2. Informieren Sie sich über den im Praktikum verwendeten AN2131SC und studieren Sie relevante Abschnitte in der Dokumentation des Mikrocontrollers

  3. Informieren Sie sich über die Benutzung des AS31

  4. Warum wird im Einführungsbeispiel 1, Zeile 13 sp mit #STACK - 1 initialisiert?

    • Damit 1. Byte an Position 0x80 (bei push: sp+1 und dann erst Schreiben auf akt. Stackpos.)
    • 0x00-0x7F kann direkt und indirekt adressiert werden, der Teil darüber nur je nach Speicherart
    • gleich auf "schwer" adressierbaren Teil den Stack legen (pop, push adressiert sowieso indirekt)
    • (nebenbei sind auch von 0x0000-0x001F 4 Registerbänke, selektierbar mit bit 3&4 (RBS) des Program Status Words pws)
  5. Machen Sie sich die Arbeitsweise der beiden Einführungsbeispiele 1 und 2 klar! Legen Sie dazu für die Programme je eine Tabelle an, in der Sie für jeden Programmschritt notieren, was der entsprechende Befehl bedeutet und was er bewirkt. Notieren Sie dabei insbesondere eventuelle Änderungen an Register- und Speicherinhalten.

    1. ; Konstantenvereinbarungen
      .equ BIT_REG0,  0x20
      .equ BIT_REG1,  0x21
      .equ STACK,     0x80
      
      ; Reset-Vektor zeigt hier hin
              .org    0x0000
              sjmp    init                 ; Sprung zu eigentlichem Programmstart
      
      ; Eigenlicher Programmanfang
              .org    0x0080
      init:
              mov     sp, #STACK - 1       ; Stackpointer auf Position 0x79 (Stack: 0x80-0xff ind. adr. Speicher)
              mov     BIT_REG0, #1b        ; Schreibe auf bit-adressierbare Adresse 0x20
              mov     BIT_REG1, #1b        ; Schreibe auf bit-adressierbare Adresse 0x21
              clr     c                    ; l�che Carry (c=0)
              orl     c, 0                 ; or carry mit bit 0 des bit-adressierbaren Speichers (c=1)
              anl     c, 8                 ; and carry mit bit 8 des bit-adressierbaren Speichers (c=1
      
              mov     r0, #0x20            ; Schiebe Zahl 0x20=32 in r0
              mov     a, #01111111b        ; Schiebe 01111111b=127=7fh in Akkumulator
              mov     @r0, a               ; Schreibe an Adresse r0 (0x20) a (127)
      
              mov     r0, #0x21            ; Schiebe Zahl 0x21=33 in r0
              mov     a, #10000000b        ; Schiebe 10000000b=128=80h in Akkumulator
              mov     @r0, a               ; Schreibe an Adresse r0 (0x21) a (128)
      
              clr a                        ; setze a auf 0
      
              mov     r0, #0x20            ; Schiebe Zahl 0x20=32 in r0
              add     a, @r0               ; addiere r0 zu a -> a=20h=32
              mov     r0, #0x21            ; Schiebe Zahl 0x21=33 in r0
              add     a, @r0               ; addiere r0 zu a -> a=ffh=255
      
      ; Endlosschleife
      l1:
              sjmp l1
    2. ; Konstantenvereinbarungen
      .equ PORTACFG,  0x7F93
      .equ PORTCCFG,  0x7F95
      .equ OEA,       0x7F9C
      .equ OEC,       0x7F9E
      .equ OUTA,      0x7F96
      .equ PINSC,     0x7F9B
      
      ; Reset-Vektor zeigt hier hin
              .org    0x0000
              sjmp    init
      
      ; Eigenlicher Programmanfang
              .org    0x0080                 ; Sprung zu eigentlichem Programmstart
      init:
              mov     dptr, #PORTACFG        ; Schiebe Adresse für Port-A-Konfiguration nach dptr (16-bit)
              mov     a, #00000000b          ; Schiebe CFG (general purpose I/O - siehe Seite 60) nach a
              movx    @dptr, a               ; Schreibe Konfiguration an Adresse für Port-A-Konfiguration
              mov     dptr, #PORTCCFG        ; Lade Adresse für Port-C-Konfiguration nach dptr (16-bit)
              mov     a, #00000000b          ; Schiebe CFG (general purpose I/O - siehe Seite 60) nach a
              movx    @dptr, a               ; Schreibe Konfiguration an Adresse für Port-C-Konfiguration
      
              mov     dptr, #OEA             ; Schiebe Adresse für Port-A-Ausgabeeinstellungen nach dptr (16-bit)
              mov     a, #00010000b          ; Setze Bit für OEA4 (rote led) auf 1 (rest 0->lesen)
              movx    @dptr, a               ; Schreibe Konfiguration an Adresse für Port-A-Ausgabeeinstellungen
      
              mov     dptr, #OEC             ; Schiebe Adresse für Port-C-Ausgabeeinstellungen nach dptr (16-bit)
              mov     a, #00000000b          ; Setze Bits auf 0 (alle lesen, benötigen roten taster - siehe seite 191)
              movx    @dptr, a               ; Schreibe Konfiguration an Adresse für Port-C-Ausgabeeinstellungen
      
      l1:
              mov     dptr, #PINSC           ; Schiebe Adresse für Pins an Port-C nach dprt
              movx    a, @dptr               ; lese Eingaben von Port-C nach a
              mov     r1, #00001000b         ; Lese Hilfsvariable nach r1 (nur an 
              xrl     a, r1                  ; xor, da wieder mal low-aktiver Schalter....grml
              rl      a                      ; shift nach rechts, da wir rote LED = PORTA[4] und Schalter PORTC[3]
              mov     dptr, #OUTA            ; Schiebe Adresse für Ausgabe an Port-A nach dprt
              movx    @dptr, a               ; gebe unser Ergebnis aus, wenn an Stelle 4 gesetzt: LED leuchtet
              sjmp    l1                     ; Schleife wiederholen
  6. Warum wird in Beispiel 2, Zeile 15 die movx-Instruktion verwendet? Wäre es auch möglich, die mov-Instruktion zu benutzen? Begründen Sie Ihre Antwort!

    Weil wir auf eine 16-Bit-Adresse schreiben wollen. mov kann dies nicht
  7. Was würde sich an der Arbeitsweise der Beispielprogrammen ändern, wenn man die sjmp– durch ljmp–Instruktionen ersetzen würde?

    • ist länger (3 Byte, statt 2)
    • langsamer (4 zyklen, statt 3)
    • anderer Opcode
  8. Ist es denkbar, die Programme dahingehend zu vereinfachen, dass man anstelle von [..] kürzer den semantisch äquivalenten Code "movx OEA, #00010000b" schreibt? Begründen Sie Ihre Antwort!

    nein, da externer Speicher indirekt adressiert werden muss