MC 27.04.2017 Komponenten eines Mikrocontrollers - Zentraleinheit: CPU (Central Processing Unit): 4, 8, 16 oder 32 Bit Datenwortbreite - Arbeitsspeicher: RAM (Random Access Memory = Speicher mit wahlfreiem Zugriff) intern: auf dem Chip integriert extern: zusätzlicher Chip anschließbar - Programmspeicher: ROM (Read Only Memory = Nur-Lese Speicher) ROM: bei Fertigung programmiert ( embedded controller) EEPROM: electrically erasable programmable ROM (löschbar) - Ein/Ausgabe Schaltungen: Ports - parallele Ports (digital) - serielle Schnittstellen - USB Schnittstelle - Zeitgeber/Zähler: Timer 1 / 26 MCT_Vorlesung_02_SS2017.doc
MC 27.04.2017 Die mit (1) und (2) gekennzeichneten Anschlüsse stehen nicht gleichzeitig zur Blockdiagramm des AT89C5131 Verfügung Quelle: Datenblatt des AT89C5131 2 / 26 MCT_Vorlesung_02_SS2017.doc
MC 27.04.2017 Pinbelegung des AT89C5131 im PLCC-Gehäuse Einige Pins sind mehrfach belegt. Beispiel: Pin 20 Entweder P3.0 (digitaler Ein/Ausgang) oder RxD (serielle Schnittstelle) PLCC = Plastic Leaded Chip Carrier Ist eine mögliche Gehäuseform Sie hat 52 Pins (= Anschlüsse) Quelle: Datenblatt des AT89C5131 3 / 26 MCT_Vorlesung_02_SS2017.doc
MC 27.04.2017 Funktion einiger wichtiger Anschlüsse siehe: Datenblatt - Spannungsversorgung (Pins V..) - Quarz-Anschluß (XTAL...) - Reset-Leitung (RST) (Negation bedeutet: 0 V ist logisch 1) - Steuerleitungen für externen Speicher (EA, ALE, PSEN) (EA = External Address, ALE = Address Latch Enable, PSEN = Programm Store ENable) - Port Pins (P1.4 = Bit 4 von Port 1): je 8 Pin pro Port teilweise mit vordefinierten Bedeutungen z.b.: P3.0 = RxD (Receive Data der seriellen Schnittstelle) - USB-Schnittstelle (D+, D-) 4 / 26 MCT_Vorlesung_02_SS2017.doc
MC 27.04.2017 Aufbau der Zentraleinheit (CPU) besteht aus: - Rechenwerk (ALU = Arithmetic Logical Unit) führt Addition, Vergleich, Bitoperation etc. aus - Befehlsdekoder setzt Befehlscodewort in entspr. Aktion um - Ablaufsteuerung erzeugt alle notwendigen Takte und Steuersignale - Programmadressregister (PC = Programm Counter, Programmzähler ) (16 Bit max 64 KByte Programm) enthält die Adresse des aktuellen Befehlscodeworts im Programmspeicher 5 / 26 MCT_Vorlesung_02_SS2017.doc
MC 27.04.2017 Abarbeitung eines Programmes 1) Ein Befehlscodebyte aus Programmspeicher holen Adresse steht im Programm Counter ( bei Reset: Program Counter wird auf #0000H gesetzt ) Programm Counter um 1 erhöhen 2) Falls Befehl aus mehreren Byte besteht: Schritt 1) wiederholen 3) Befehl ausführen: falls Sprungbefehl: Programm Counter mit neuer Adresse laden weiter mit Schritt 1) jeder Befehl besteht aus mindestens 1 Byte Bearbeitungszeit: mindestens 1 Maschinenzyklus z.b.: bei 12 MHz Quarz: 1 Zyklus = 1 s (10-6 s) bei 48 MHz Quarz: 1 Zyklus = 250 ns (10-9 s) 6 / 26 MCT_Vorlesung_02_SS2017.doc
MC 27.04.2017 Das direkt adressierbare RAM der AT89C5131 hat mehrere RAM-Bereiche (Random Access Memory) für den Einstieg an einfachsten: das direkt adressierbare RAM Aufbau: 256 Byte Speicherplatz H = hexadezimal Adressbereich 00H FFH obere Hälfte = SFR (Special Function Register) oft mit Hardware verknüpft untere Hälfte = Datenspeicher (frei programmierbar) für Variablen, Stack usw. SFR Datenspeicher 128 Byte 128 Byte 7 / 26 MCT_Vorlesung_02_SS2017.doc
MC 27.04.2017 Einige Details... insgesamt 256 ( = 2 8 ) Adressen von 00H bis FFH: a) Adressen 80H - FFH (128 Byte) = Register mit besonderen Funktionen (SFR = Special Function Register) darin sind nicht alle Adressen benutzt z.b.: A (Register A), B (Register B) P0, P1,... (Port 0, Port 1,...) b) Adressen 00H - 7FH (128 Byte) = allgemeiner Datenspeicher darin: 4 Registerbänke aus je 8 allgemeinen Registern z.b.: R0, R1,... R7 16 Byte, in denen jedes Bit einzeln addressierbar ist = bitadressierbare Register Register A Port-Register P1 Bereich der Special Function Register (SFR) frei nutzbares internes RAM bitadressierbar Registerbank 3 Registerbank 2 Registerbank 1 Registerbank 0 FFH E0H 90H 80H 7FH 20H-2FH 18H-1FH 10H-17H 08H-0FH 00H-07H 8 / 26 MCT_Vorlesung_02_SS2017.doc
Einige Speicherbereiche und Special Function Register (SFR) des AT89C5131 (Auswahl, unvollständig) 2 7 Bit 2 0 2 7 Bit 2 0 7FH F0H B * 7EH byteadressierbarer interner Datenspeicher E0H ACC * 31H D0H PSW * 30H 2FH 7FH 7EH 7DH 7CH 7BH 7AH 79H 78H CDH TH2 2EH 77H 76H 75H 74H 73H 72H 71H 70H CCH TL2 bitadressierbarer interner Datenspeicher C8H T2MOD 21H 0FH 0EH 0DH 0CH 0BH 0AH 09H 08H C0H P4 * 20H 07H 06H 05H 04H 03H 02H 01H 00H 1FH Register 7 B0H P3 * 1EH Register 6 Registerbank 3 A8H EAL EC ET2 ES ET1 EX1 ET0 EX0 IEN0 * 19H Register 1 A0H P2 * 18H Register 0 17H Register 7 9BH BRR TBCK RBCK SPD SRC BDRCON 16H Register 6 9AH BRL Registerbank 2 99H SBUF 98H SM0 SM1 SM2 REN TB8 RB8 TI RI SCON * 11H Register 1 10H Register 0 90H P1 * 0FH Register 7 0EH Register 6 8DH TH1 Registerbank 1 8CH 8BH TH0 TL1 09H Register 1 8AH TL0 08H Register 0 89H Gate1 C/T1 M11 M10 Gate0 C/T0 M01 M00 TMOD 07H Register 7 88H TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 TCON * 06H Register 6 Registerbank 0 83H 82H DPH DPL 01H Register 1 81H SP 00H Register 0 80H P0 * * diese Register sind bitadressierbar 9 / 26
Wichtige Spezialregister 1) Program Status Word (PSW - Register) gibt Auskunft über Ergebnis von Rechenoperationen 7 Bits (sogennante Flags (Flaggen)) sind benutzt z.b.: Überlauf bei Rechenoperation,... CY AC F0 RS1 RS0 OV - P PSW D0H 2) Stapelzeiger (SP = Stackpointer) einige Befehle stapeln Daten zur Zwischenspeicherung z.b.: Unterprogrammaufruf: Rücksprungadresse SP zeigt auf die nächste freie Stelle des Datenstapels Stack wächst nach oben, nach Reset: auf 07H gesetzt Inhalt bei Reset: 07H SP 81H 10 / 26 MCT_Vorlesung_02_SS2017.doc
3) Externer Datenzeiger, bestehend aus zwei 8-Bit Registern: oder: DPTR = Datapointer, 16 Bit DPH = Datapointer High Byte, 8 Bit DPL = Datapointer Low Byte, 8 Bit bilden zusammen das 16-Bit Register DPTR DPH DPL 83H 82H für den Zugriff auf max. 64 kbyte externes RAM Vorgehensweise: 1.) Adresse in den Datenzeiger laden 2.) Spezialbefehl ( MOVX... ) lädt Daten in Register A Problem: langsam, daher häufig benötigte Daten im internen RAM ablegen! 11 / 26 MCT_Vorlesung_02_SS2017.doc
Bitadressierung (1) Einige Spezialregister sind bitadressierbar = jedes Bit einzeln ansprechbar Setzen und Löschen von Bits: z.b.: setb p1.0 ; Bit 0 von Port 1 auf 1 setzen (set bit) clr p1.3 ; Bit 3 von Port 1 auf 0 setzen (clear) Anwendung: einzelne LEDs einschalten (clr) oder ausschalten (setb) 12 / 26 MCT_Vorlesung_02_SS2017.doc
Übung Aufgabe: Schreiben Sie ein Programm, das mit Hilfe eines Bitbefehls nur die zweite Leuchtdiode von rechts des Experimentalsystems (Port 1) einschaltet. Hinweise: Bit der LED = 0 LED leuchtet Bit der LED = 1 LED leuchtet nicht clr = löschen (Bit = 0) setb = setzen (Bit = 1) Bezeichnung der Bits: p1.0 = Bit 0 (niederwertigstes Bit, Wertigkeit 2 0 = 1, ganz rechts) P1.7 = Bit 7 (höchstwertigstes Bit, Wertigkeit 2 7 = 128, ganz links) 13 / 26 MCT_Vorlesung_02_SS2017.doc
Tastenanschaltung an Port 0 Taste nicht gedrückt: Port Bit ist 1 Merke: Taste gedrückt Bit = 0 Taste gedrückt: Port-Bit ist 0 Pinbelegung: Taste 0 = P0.0 Taste 1 = P0.1 Taste 2 = P0.2 Taste 3 = P0.3 14 / 26 MCT_Vorlesung_02_SS2017.doc
bedingte Sprungbefehle: Bitadressierung (2) z.b.: jb a.3, rel ; springe, wenn Bit 3 des Register A gesetzt ist (1) jnb p0.7, rel ; springe, wenn Bit 7 von Port 0 nicht gesetzt ist (0) Anwendung: Tasten abfragen: jb p0.0, ziel springt zu Sprungmarke ziel, wenn die Taste nicht gedrückt ist (d.h. Bit = 1) jnb p0.0, ziel springt zu Sprungmarke ziel, wenn die Taste gedrückt ist (d.h. Bit = 0) 15 / 26 MCT_Vorlesung_02_SS2017.doc
Übung (1) Aufgabe 1: Speichern Sie das Programm in einer Datei, übersetzen Sie es und testen Sie es. $NOMOD51 $INCLUDE (reg515.inc) org 0 start: ziel: jnb p0.0, ziel mov p1,#055h jmp start mov p1,#0aah jmp start end Welche Wirkung hat dieses Programm? Beobachten Sie dabei den Zustand der Leuchtdioden. Verändern Sie den Zustand von Port 0, indem Sie die Taste 1 drücken. 16 / 26 MCT_Vorlesung_02_SS2017.doc
Übung (2) Aufgabe 2: Schreiben Sie ein Programm, das den Zustand der Taste 1 abfragt. Solange diese Taste gedrückt ist, sollen die Leuchtdioden 0 bis 3 aufleuchten. Wenn die Taste nicht gedrückt wird, sollen die Leuchtdioden 4 bis 7 leuchten. Aufgabe 3: Schreiben Sie ein Programm, das den Zustand aller Tasten abfragt. Solange Taste 1 gedrückt ist, soll die Leuchtdiode 0 aufleuchten, wenn Taste 2 gedrückt ist, soll die Leuchtdiode 1 aufleuchten usw. Hinweise: Bit = 0 LED leuchtet Taste gedrückt Bit = 0 P1.0 LED 0 P0.0 Taste 1 P1.1 LED 1 P0.1 Taste 2 P1.2 LED 2 P0.2 Taste 3 P1.3 LED 3 P0.3 Taste 4 P1.4 LED 4 P1.5 LED 5 P1.6 LED 6 P1.7 LED 7 17 / 26 MCT_Vorlesung_02_SS2017.doc
Schiebebefehle Sinn: alle Bits um eine Position verschieben rr a rl a ergibt Bits in A nach rechts schieben (rotate right) Bit 0 wird in Bit 7 geschoben 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 Bits in A nach links schieben (rotate left) Bit 7 wird in Bit 0 geschoben Anwendung: Lauflicht auf den LEDs programmieren 18 / 26 MCT_Vorlesung_02_SS2017.doc
Übung Aufgabe 1: Schreiben Sie ein Programm, das zunächst einmalig eine Leuchtdiode des Experimentalsystems einschaltet. Danach soll dieses Bitmuster immer wieder (endlos) nach rechts verschoben werden (Lauflicht) Hinweise: rr p1 funktioniert nicht! Warum??? Der Lauflichteffekt ist nur im Simulator sichtbar! Warum??? Aufgabe 2: Schreiben Sie ein Programm, das zunächst einmalig eine Leuchtdiode des Experimentalsystems einschaltet. Danach soll dieses Bitmuster immer dann um eine Bitposition nach rechts verschoben werden, wenn eine Taste des Experimentalsystems gedrückt worden ist Hinweise: Warten auf Tastendruck warte: jb p0.1, warte 19 / 26 MCT_Vorlesung_02_SS2017.doc
Tastenprellen Problem: mechanische Kontakte prellen beim Schließen ab 5V 0V einige ms Gefahr: Programm erkennt fälschlicherweise mehrfaches Tastendrücken Abhilfe: 1) auf 0 Zustand prüfen 2) 10 ms warten 3) auf 0 Zustand prüfen, wenn nicht zurück zu 1 20 / 26 MCT_Vorlesung_02_SS2017.doc
Übung Aufgabe: Speichern Sie das Programm in einer Datei, übersetzen Sie es und testen Sie es (Taste 1 drücken). $NOMOD51 $INCLUDE (reg515.inc) org 0 start: jb p0.0, start ; Tastendruck abwarten cpl p1.0 ; LED Zustand umschalten halten: jnb p0.0, halten ; Taste loslassen abwarten jmp start ; Sprung zum Anfang end Was versteht man unter Tastenprellen und wodurch macht sich das Tastenprellen hier bemerkbar? 21 / 26 MCT_Vorlesung_02_SS2017.doc
Verzögerungsschleifen Sinn: eine bestimmte Zeit verstreichen lassen Beispiel: mov a,#250 ; Dauer = 1 Zyklus = 1 s warten: dec a ; = 1 s nop ; = 1 s jnz warten ; Dauer = 2 Zyklen = 2 s Befehl dec a = dekrementieren, a um 1 verringern nop = einen Zyklus warten (no operation) Dauer der Schleife: 1 s + 1 s + 2 s = 4 s (dec + nop + jnz) Schleife wird 250 mal durchlaufen, dann ist der Inhalt von a = 0 Verzögerungszeit: 1 s + (250 * 4 s) = 1001 s 1 ms 22 / 26 MCT_Vorlesung_02_SS2017.doc
Schleifen ineinander verschachteln : Größere Verzögerungszeiten Beispiel: mov r0,#20 ; äußere Schleife warten2: mov r1,#250 ; innere Schleife warten1: djnz r1,warten1 djnz r0,warten2 Registerbank hat 8 Register: r0 bis r7 = Speicherplätze für 8 Variablen (je 8 Bit) Für diese Register gibt es einige Spezialbefehle, z.b. djnz djnz = decrement and jump if not zero = Inhalt des Registers um 1 verringern, danach Sprung, falls Inhalt nicht 0 Verzögerungszeit: innere Schleife ca. 0,5 ms insgesamt ca. 10 ms (andere Möglichkeit: Timer-Baugruppe programmieren) 23 / 26 MCT_Vorlesung_02_SS2017.doc
Übung Aufgabe: Speichern Sie das Programm in einer Datei, übersetzen Sie es und testen Sie es (Taste 1 drücken). Nun sollte das Tastenprellen kein Problem mehr sein... $NOMOD51 $INCLUDE (reg515.inc) org 0 start: jb p0.0, start ; Tastendruck abwarten mov r0,#20 ; äußere Schleife warten2: mov r1,#250 ; innere Schleife warten1: djnz r1, warten1 djnz r0, warten2 jb p0.0, start cpl p1.0 ; Tastendruck prüfen ; LED Zustand umschalten halten: jnb p0.0, halten jmp start ; Taste loslassen abwarten ; Sprung zum Anfang end 24 / 26 MCT_Vorlesung_02_SS2017.doc
Increment und Decrement Der Mikrocontroller kann Addieren, subtrahieren, multiplizieren z.b.: inc a Inhalt von A um 1 erhöhen (increment) 0 0 0 0 0 0 0 0 = 0 dezimal 0 0 0 0 0 0 0 1 = 1 dezimal 0 0 0 0 0 0 1 0 = 2 dezimal 0 0 0 0 0 0 1 1 = 3 dezimal 0 0 0 0 0 1 0 0 usw... dec a Inhalt von A um 1 verringern (decrement) Anwendung: Binärzähler auf den LEDs programmieren 25 / 26 MCT_Vorlesung_02_SS2017.doc
Übung Aufgabe: Schreiben Sie ein Programm, das einen 8-Bit-Binärzähler auf den Leuchtdioden erzeugt. Zunächst sollen alle LEDs ausgeschaltet sein. Bei jedem Tastendruck auf Taste 1 soll der Zählerstand um 1 erhöht werden. Hinweis: Die Bits des Zählers müssen vor der Ausgabe invertiert werden, falls bei einer 1 in der Binärzahl eine LED leuchten soll. 26 / 26 MCT_Vorlesung_02_SS2017.doc