160 likes | 295 Views
Vorstellung des MC68HC11-µControllers und des Handy Board. gehalten durch Frank Sill im Rahmen der - Vorlesung Aufbau und Anwendungen von µControllern -. Der MC68HC11 - Ein Überblick. einfach zu programmierende Familie von 8 Bit µControllern Anbieter: Firma Motorola (www.motorola.com/mcu)
E N D
Vorstellung des MC68HC11-µControllers und des Handy Board gehalten durch Frank Sill im Rahmen der - Vorlesung Aufbau und Anwendungen von µControllern -
Der MC68HC11 - Ein Überblick • einfach zu programmierende Familie von 8 Bit µControllern • Anbieter: Firma Motorola (www.motorola.com/mcu) • Parameter: • 8 Bit Daten und 16 Bit Adressen • 256 - 1024 Byte RAM • 512 - 2048 Byte EEPROM • 4 - 24 kByte ROM • Takt - 2 MHz (abgeleitet von 8-MHz-Schwingquarz) • 38 Logikpegeleingänge- und –ausgänge, teils mit Handshake-Funktion • 2 Hardware-Interrupts • Echtzeit - Interrupt • Impulszähler
Der MC68HC11-µController – Ein Überblick (Fortsetzung) • 16-Bit-Timer-System mit • 3 Zeitmeß-Eingängen • 4 PWM-Ausgängen • COP-Watchdog • Module (integrierte Hardwarekomponenten) • AD-Wandler mit 8 gemultiplexten Eingängen • synchrone serielle Peripherieschnittstelle • asynchrone serielle Komunikationsschnittstelle • Weitere Besonderheiten: • 5V Betriebsspannung • Stromaufnahme etwa 15mA • eine Instruktion benötigt mindestens 2 Takte = 1 µs • längste Operation: Division (FDIV) mindestens 41 Takte = 20,5 µs
Der MC68HC11-µController - Betriebsarten • Single Chip Mode (Einchip-Betriebsart) • Programm im internen ROM gespeichert • Port B: digitale Ausgabeschnittstelle • Port C: digitale Eingabe- /Ausgabeschnittstelle • Expanded Mode (Mehrchip-Betriebsart) • externer Speicher • Port B, Port C: Busverlängerung • STRA, STRB: Steuerleitungen • Bootstrap Mode (Urlader-Betriebsart) • µController lädt über ‘Urlader‘ (im ROM $BF40 - $BFFF) Programm aus PC in EEPROM • sehr einfache Programmierung möglich • Test-Mode
Der MC68HC11-µController - Register • Akkumulatorregister A und B mit je 8 Bit auch als Akkumulatorregister D mit • 16 Bit ansprechbar • Indexregister X und Y mit je 16 Bit (Offset, Zählschleifenvariable) • Stackpointer mit 16 Bit • Programmzähler mit 16 Bit • Bedingungsregister (CCR=Condition Code Register)
Der MC68HC11-µController – Adressierungsarten • Wertzuweisung (Immediate Adressing) • Befehl wird Wert zugewiesen • LDAA #90 /* Lade Akku. A mit 90D */ • Adreßzuweisung (Extended Adressing) • Befehl wird Adresse ($0000 - $FFFF) einer Speicherzelle übergeben • für CPU-Register existiert eigener Befehlscode • LDAA $01E2 /*Lade Akku. A mit Wert in RAM-Speicherzelle $01E2 */ • Kurzadreßzuweisung (Direct Addressing) • Adressierung des RAM-Bereich $0000 - $00FF • LDAA <$E2 /* Lade Akku. A mit Wert in RAM-Speicherzelle $E2 */ • Indizierte Adreßzuweisung (Indexed Addressing) • Adresse aus Summe des Wertes der Indexregister X oder Y und gesetztem Offsetwert • LDX #$1000 /*Lade X mit $1000 */ • LDAA $0A,X /*Lade Akku. A mit Wert der Adresse $100A */
Der MC68HC11-µController – Befehle • Ladebefehle (LDA, LDB, LDD) • Schiebebefehle (LSR, LSRA, LSRB, LSRD, LSL, ...) • Rotationsbefehle (ROR, RORA, ROL, ROLA ... ) • Bit-Befehle (BSET, BCLR ...) • Einer- , Zweierkomplement (COM, COMA, NEG, NEGA ,...) • Addition (ABA, ABX, ABY, ADCA, ADDD, ...) • Subtraktion ( SBA, SUBA, ...) • Multiplikation (MUL) • Division (IDIV, FDIV) • konditionale Befehle (BCC, BNE, BEQ, ...) • NOP, STOP
Das Handy Board - Ein Überblick • handgroßes, batteriebetriebenes µController-Board • MC68HC11 • 32 kByte RAM • 16 x 2 Zeichen LCD - Display • zwei L293D IC‘s zur Ansteuerung von 4 DC-Motoren • Eingänge für 7 analoge und 9 digitale Sensoren • Infrarot Empfänger und - Sender (38 kHz) • zwei vom Benutzer programmierbare Schalter und ein Drehknopf • Piezo-Lautsprecher • Stecker für 6811 SPI • entwickelt im MIT (Massachusetts Institute of Technology) unter Fred G. Martin
Das Handy Board - Interactive C (IC) • C Sprache, bestehend aus Compiler und Laufzeit-Interpreter • Compilierung und Debugging erfolgt interaktiv über Kommandozeile • enthält viele bekannte C-Befehle (for,while,if,else) • kennt lokale und globale Variablen, Arrays, Zeiger, 16 Bit und 32 Bit Integer- und 32 Bit Gleikommazahlen • IC compiliert in Psydocode für Stackmaschine dieser durch Laufzeit-Interpreter auf entsprechenden µC umgesetzt, dadurch: • beobachtete Ausführung: Erkennung von Laufzeitfehlern und Vorbeugung von Crashs • einfacheres Design: Portierung auf andere µC erfodert nur neuen p-Code Interpreter • kleiner Objekt Code: Stackmaschinecode ist kleiner als gewöhnlicher Code • Multitaskingfähigkeit: Prozesszustand definiert durch Stack, Programmzähler (PC) > einfacher Taskwechsel durch Laden von neuen Stackzeiger und PC
Das Handy Board - Interactive C (Fortsetzung) • Ansteuerung des Display mit printf (format-string, [arg-1],.., [arg-N]) • DC-Motoransteuerung mit Funktionen für: • Drehrichtung (void fd(int m), void bk(int m) ) • Voltzahl (void motor(int m, int p)) • Servo-Motoransteuerung über Port A Bit 7 • Periode (int servo(int period)) • Winkel (int servo_rad(float angle)) • Ansteuerung des IR-Senders/ Empfänger • Ein-/Ausschalten ( int sony_init(i) , i{0;1}) • Datenauslesen (int ir_data(int dummy)) • einfaches Auslesen der digitalen und analogen Eingänge und Schalter • Soundausgabe
Das Handy Board - Interactive C (Fortsetzung) • Multitasking • Prozesse dynamisch kreieren und zerstören • Prozeßkommunikation über globale Variablen (shared memory) • jeder Prozeß erhält bei Erstellung Zeitkontingent (Ticks) - Standard: 5ms • alle Prozesse in Prozeßtabelle • jeder Prozeß mit eigenem Stack • Argumente für Funktionsaufrufe • Abspeichern von lokalen Variablen • Rücksprungadresse für Funktionsaufrufe • Standard 256 Bytes • jeder Prozeß erhält PID
/*Motoren abwechselnd an- und ausschalten*/ void drive() { while(1){ motor(2,70); printf("\nMotor1 rechtsrum"); sleep(3.0); ao(); motor(3,70); printf("\nMotor2 und linksrum"); sleep(3.0); ao(); } } /*Tonfrequenz in 10Hz-Schritten steigern*/ void beepen() { float ton; while (1){ ton = 100.0; while (ton < 10000.0){ tone(ton,0.7); ton=ton+10.0; } } } void main() { int pid1,pid2; /*neue Prozesse starten*/ pid1 = start_process(drive()); pid2 = start_process(beepen()); /*warten bis SOP-Button gedrückt*/ while (!stop_button()); kill_process(pid1); kill_process(pid2); beeper_off(); ao(); } Das Handy Board - Interactive C (Fortsetzung)