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