Semesterbericht
Hardware/Software
3. Semester Jahrgang 1996
Thema: Programmentwurf eines Mikrocontrollergesteuerten Hochregalroboters
....................................... |
....................................... |
Stempel Firma
|
Datum Ausbildungsleiter
|
Datum Betreuer
|
|
....................................... |
....................................... |
Stempel
Berufsakademie |
Datum Prüfungsausschuß
|
Datum Prüfungsausschuß
|
|
Inhaltsverzeichnis
1. EINFÜHRUNG 3
1.1. Formelle Aufgabenstellung für die gesamte Gruppe 3
1.2. Organisatorisches Umfeld 3
1.3. Aufgabenstellung Programmausarbeitung 3
2. GRUNDLAGEN 4
2.1. Speicherverwaltung 4
2.2. Spezialfunktionsregister (SFR) 4 18963mrg32ekz9o
2.3. Übersicht über die Maschinenbefehle 5
2.3.1. Arithmetische Befehle 5
2.3.2. Logische Befehle 5
2.3.3. Datentransferbefehle 5
2.3.4. Boolsche Befehle 5
2.3.5. Bedingte und unbedingte Sprünge 5
2.4. Assemblerfunktionen 5
2.5. Programmierung der Peripherie 6
2.5.1. Ansteuerung der Tastatur 6
2.5.2. Ansteuerung des Displays 6
2.5.3. Motorsteuerung: 6
2.5.4. Serielle Schnittstelle zum PC 7
3. REALISIERUNG / IMPLEMENTIERUNG 7
3.1. Allgemeines 7 rk963m8132ekkz
3.2. Befehlsbibleothek 7
3.2.1. Display: 7
3.2.2. Tastatur: 8
3.2.3. Motorsteuerung: 8
3.2.4. Serielle Schnittstelle zum PC 8
3.3. Hauptprogramm des Hochregalroboters 9
3.3.1. Bedienung 9
3.3.2. Programmroutinen des Hauptprogrammes 10
Anhänge:
Quellennachweis
Listings motor.mak (auf Diskette)
system.mak
roboter.a51
Einführung
Die Hardware-Semesterarbeit besteht aus der Aufgabe, einen mikrocontrollergesteuerten Hochregalroboter zu fertigen. Hierfür stand der ELVamat Baukasten zur Verfügung, der neben drei Schrittmotoren auch diverse mechanische Teile zum Bau von verschiedenen “Robotern” beinhaltet. Die Basis ist ein Mikrocontrollersystem auf der Basis des Intel 87C52. Die Software zum Betrieb des Roboters wird in Assembler geschrieben und in einem EPROM abgelegt. An dieses System angeschlossen sind eine I/O-Baugruppe, die Tastatur, das Display und eine Motoransteuerung, die einen Logikteil und die Treiberstufen enthält. In dieser Dokumentation wird näher auf die Programmausarbeitung eingegangen.
Formelle Aufgabenstellung für die gesamte Gruppe
Aufgabe: Hochregalroboter
Teilnehmer: Michael Kuß, Thomas Jüngel, Matthias Buchhorn, Andreas Spiller
Zeitraum: 8 Wochen
Mit dem ELVamat Baukasten wird ein Hochregalroboter gebaut, der Gegenstände in ein Hochregallager ein-, aus- und umlagern kann. Die Steuerung erfolgt über eine Mikrocontrollerbaugruppe. Die gesamte Steuerung erfolgt durch ein Assemblerprogramm, das auf der Mikrocontrollerbaugruppe in einem EPROM gespeichert ist. Die Hardware teilt sich in die drei folgenden Teilbereiche: Logik &Treiber, Ein- und Ausgabeeinheit und Mikrocontrollerbaugruppe. Die Steuerung des Roboters erfolgt über die Tastatur, die Eingaben können auf dem Display überprüft werden. Die Mikrocontrollerbaugruppe verarbeitet die Eingaben und gibt die Signale für die Schrittmotorsteuerung.
Der Funktionsnachweis ist zu führen. Das fertige Projekt wird mit einer kompletten Dokumentation präsentiert
Organisatorisches Umfeld
Aufgabenstellung Programmausarbeitung
Grundlage für alle weiteren Programme sind zwei Befehlsbibliotheken, welche alle elementaren Funktionen in sich vereinigt und somit erst ein effizienteres Programmieren ermöglicht. Die Bibliothek “system.mak” soll alle Funktionen zum Ansteuern der Tastatur und des Displays beinhalten. Desweiteren stellt die Bibliothek “motor.mak” alle Funktionen zum Steuern der Schrittmotoren bereit. Es gibt mehrere Möglichkeiten zum Ansteuern der Motoren, sei es vom PC aus, über eine seriellen Schnittstelle , manuell oder automatisch mit den Mikrocontroller.
Das Hauptprogramm bedient sich dieser Funktionen und erfüllt folgende Aufgaben:
Gegenstand aus dem Fach nehmen
Gegenstand in das Fach legen
Steuerung über PC
manuelle Steuerung des Roboters über die Cursortasten
Hilfe
Der Benutzer sollte mit einer möglichst intuitive und einer rasch erlernbare Bedienoberfläche arbeiten.
Grundlagen
4 Registerbänke, Stackpointer
Speicherverwaltung
Alle Bausteine der MCS-51 Familie haben einen getrennten Adreßbereich für Programm- und Datenspeicher von jeweils maximal 64 KByte Größe. Die CPU holt sich, die für die Abarbeitung von Programmen nötigen Befehlen aus dem Programmspeicher (EEPROM), Speichervariablen werden jedoch in den Datenspeicher abgelegt bzw. ausgelesen. Bei einem Zugriff auf die RAM-Bausteine wird die Leseleitung (\RD) angesprochen, sobald Befehle vom Programmspeicher angefordert werden, wird die Programmspeicherfreigabeleitung (\PSEN) aktiviert. Die Funktionen des Mikrocontrollers schalten selbstständig die Steuerleitungen frei, so das dieser Vorgang beim Programmieren transparent bleibt. Die Software des Mikrocontrollersystems wurde am PC, mit einem sogenannten Cross-Assembler entwickelt. Dieses kleine MS-DOS Programm wandelt den Assemblercode in einen funktionstüchtigen Maschinencode um. Diese Datei mit der Endung <bin> wird mit Hilfe einer Eprom-Brenner-Software in den Eprom geschrieben. Der Umfang der Assemblerbefehle ist sehr umfangreich. Der Mikrocontroller verfügt über 256 Befehle und ein komfortables Spezialfunktionsregister. Mit Hilfe dieser Mnemonik läßt sich der Speicher auf zwei Arten adressieren. Bei der direkten Adressierung wird der Operand mit einer 8-Bit Adresse verknüpft, somit kann nur das interne RAM und die Spezialregister angesprochen werden. Bei der indirekten Adressierung wird der Befehl mit einem Adreßregister verknüpft. Nur die 8 Bit R0/R1 Register und das 16 Bit Datenpointregister beinhalten die Adresse des Operanden. Ein Adreßregister wird durch das Zeichen gekennzeichnet. Es existieren vier Registerbänke, jede dieser Registerbänke besitzen acht Register, somit kann mit dieser Adressierungsmethode auf die ersten vierundzwanzig RAM-Plätze zugegriffen werden. Der Zugriff auf dieses 8 Bit Register wird durch die Registerbefehle R0-R7 vereinfacht. Die Registerbänke werden mit dem 3. und 4. Bit des Programmstatuswortes angesprochen. Weiterhin besteht die Möglichkeit Konstanten, mit dem DB-Befehl zu vereinbaren. Die Interrupts beginnen nach der Programmeinsprungadresse auf der Adresse 0003 und weitere Interrupts folgen im Abstand von 8 Bytes. Interrupts sind z.B. Externer Interrupt 0, Timer 0, Externer Interrupt 1, Timer 1, serieller Port Interrupt und Timer 2.
Spezialfunktionsregister (SFR)
Im oberen Datenspeicher befindet sich im Bereich der Adresse 80-FF die Spezialfunktionsregister (SFR) die weitere umfangreiche Funktionen bieten :
SFR |
Code |
Beschreibung |
Akkumulator |
Acc |
Bei Operationen der ALU wird dieses Register benutzt. |
B Register |
B |
Wird bei der Division und Multiplikation benutzt. |
Programmstatuswort |
P |
Das Flagregister bietet folgende Informationen:
CY - Carry Flag AC - Hilfscarryflag
F0 - freies Flag RS1,RS2 - Registerbänke
OV - Überlaufflag P - Parityflag |
Stackpointer |
SP |
Durch Beschreiben dieses Registers legt man den Stack an eine andere Stelle des Speichers.(default=07) |
Datenpointer |
DPL, DPH, (DPTR) |
Der 16-Bit Datenpointer teilt sich in Low und Highbyte. Damit ist eine Adressierung bis zu 64k Byte möglich. |
Ports 0-3 |
P0, P1, P2, P3 |
Ports können eingelesen bzw. beschrieben werden. |
serieller Datenbuffer |
SBUF |
Besteht aus zwei getrennten 8-Bit-Registern. Beim Lesen wird der Empfangspuffer, beim Schreiben der Sendepuffer angespochen. |
Timer |
TL0, TL1, TH0, TH1 |
Diese Register stehen für die beiden 16-Bit Timer-register. |
Kontrollregister |
PCON, TCON, TMOD, SCON, IE, IP |
Diese Register dienen zum Steuern der Timer und Interrupts. |
Übersicht über die Maschinenbefehle
Arithmetische Befehle
Die arithmetischen Befehle kennzeichnen einfache mathematische Befehle wie Addieren, Subtrahieren, Multiplizieren, Dividieren und Erhöhen bzw. Erniedrigen eines Wertes. Für Berechnungen dieser Art verwendet die ALU (arithmetic logic unit) den Akkumulator und das B-Register. Die Funktionen ADD,SUBB, INC und DEC setzt beim Überschreiten von 0ffh bzw. Unterschreiten von 0 das Übertragsflag. Die Befehle ADDC und SUBB beziehen das Übertragflag in die Berechnung mit ein. So können größere Zahlen addiert bzw. subtrahiert werden. Eine Möglichkeit, zwei Zahlen nach Größe zu vergleichen, ist z.b. das Subtrahieren zweier Zahlen und das Auswerten des Übertragflags. Nach jeder BCD-Addition muß der DA A-Befehl zur Korrektur ausgeführt werden.
Logische Befehle
Die logischen Befehle bieten verschiedenste Verknüpfungsmethoden zwischen zwei Bytes. Logikbefehle sind AND(ANL), OR(ORL), XOR(XRL), NOT(CPL). Weiterhin bietet der Mikrocontroller Befehle wie Rotate(RR,RL), Swap(SWAP), Clear(CRL). Die Rotatefunktion schiebt die 8 Bit des Akumulators nach rechts oder links. Damit läßt sich z.b. ein schnelles Multiplizieren mit einer Zweierpotenz gewährleisten. XOR-Logik wird auch dazu verwendet zwei Werte zu vergleichen. Sind beide Werte identisch, so ist der Akkumulator null und kann mit dem bedingten Sprungbefehl JZ ( jump zero) und JNZ (jump not zero) ausgewertet werden.
Datentransferbefehle
Die Datentransferbefehle MOVX und MOVC greifen auf den externen Speicherbereich der RAM- bzw. der ROM-Bausteine zu. Der MOV-Befehl kann nur auf internen Speicher zugreifen, somit können Register, Spezialfunktionsregister und Variablen bearbeitet werden. Alle Datentransferbefehle verschieben 8 oder 16 Bit große Datenpakete zu beliebigen Zielen. Interrupts und Subprozeduren unterbrechen den Ablauf des Hauptprogrammes, um deshalb wieder in den normalen Programmablauf zurückzukehren, werden alle Registerinhalte mit Pop in den Stack gesichert und nach Beenden der Routine mit Push wiederhergestellt.
Boolsche Befehle
Mit Hilfe von boolschen Befehlen ist die Verknüpfung von einzelnen Bits möglich. Alle logischen Befehle arbeiten auch mit Bits. Weiterhin bietet der Mikrocontroller bedingte Sprungbefehle, welche den Zustand der Bits auswerten und einen Sprung an einer relativen Programmadresse veranlassen. Die Carry-Flag-Befehle spielen ein große Rolle, da sie den Übertrag bei Addition, Subtraktion, Inkrement- oder Dekrementierung registrieren.
Bedingte und unbedingte Sprünge
Ohne bedingte und unbedingte Sprünge ist nur eine sequenzielle Abarbeitung des Programmes möglich. Sprünge erlauben erst das Arbeiten mit Unterprogrammen, Subroutinen und Interrupts. Prozeduren werden mit <Call Name> aufgerufen. Die vorherige Adresse wird auf den Stack abgelegt und es wird zu der Adresse des Unterprogrammes gesprungen. Mit dem RET -Befehl wird die alte Adresse vom Stack gelesen und so zum Hauptprogramm zurückgekehrt. Mit einer einfachen Konstruktion < loop: ... CJNE zähler,loop> erhält man eine funktionierende Schleife. Der CJNE-Befehl ist ein bedingter Sprung, der ähnlich wie die repeat-until Schleife funktioniert.
Assemblerfunktionen
Der verwendete MCS-51 Assembler besitzt über die einfache Mnemonik hinaus, Kontrollstrukturen, Verwaltung von Variabeln und Labels. Konstanten werden im Programmspeicher abgelegt Es können 8-Bit große Zahlen mit dem Befehl DB abgelegt werden, 16-Bit große Zahlen werden mit der DW-Anweisung im ROM deklariert. Mit der ORG-Anweisung wird eine absolute Adresse festgelegt. Diese Anweisung wird z.b. für die Programmeinsprungsadresse und der Speicheradresse der Konstanten verwendet. Die Registerbänke werden mit der Funktion USING <Bank> umgeschaltet. Variablen können als unterschiedlichste Typen definiert werden. Die CODE-Anweisung definiert die Varible als ROM-Adresse. DATA, IDATA, XDATA definiert sie als direkte, indirekte bzw. externe RAM-Adresse. Bitadressen werden mit Befehl BIT festgelegt. Das Arbeiten mit Bibliotheken macht den Quellcode übersichtlicher und portabler. Deshalb bietet der Assembler die Möglichkeit eine oder mehrere externe Programmdateien in das Hauptprogramm, mit der $INCLUDE(<NAME>)-Anweisung, einzubinden. Die IF-ELSE-ENDIF Struktur vergleicht eine Varible mit null . Liefert das Ergebnis den Wert true so werden die Anweisungen nach dem IF ausgeführt, ansonsten werden die Anweisungen nach dem ENDIF ausgeführt. Die Kontrollstruktur wird mit der ENDIF-Anweisung abgeschlossen. Das Programm wird mit der END-Anweisung beendet. Vordefinierte Variblen sind vor allem die Spezialfunktionsregister. Eine Ausführliche Beschreibung lesen Sie bitte weiter oben.
Programmierung der Peripherie
Ansteuerung der Tastatur
Es wird eine 3x4 Tastaturmatrix verwendet. Die Tastaturinformation liegt an Adresse 04000h. Der eingelesende Wert wird in ASCII -Code umgewandelt:
Wert |
ASCII-Code |
Wert |
ASCII-Code |
6Fh |
30 - ‘0’ |
F5h |
36 - ‘6’ |
DEh |
31 - ‘1’ |
DBh |
37 - ’7’ |
7Eh |
32 - ‘2’ |
7Bh |
38 - ‘8’ |
F6h |
33 - ‘3’ |
F3h |
39 - ‘9’ |
DDh |
34 - ‘4’ |
CFh |
20- ‘ ’ <Cancel> |
7Dh |
35 - ‘5’ |
E7h |
A0- ‘ ’ <Enter> |
Ansteuerung des Displays
Ist das 1./2. und 9.Bit des Adressbytes gesetzt, so wird das Display angesprochen.Das 2.Bit gibt an, ob es sich bei dem empfangende Byte um eine Date oder ein Befehl handelt. Somit trägt die Befehlsadresse den Wert 4001h und die Datenadresse den Wert 4002h. Erklärung zum Befehlsbyte:
Wert-binär |
Befehl |
Beschreibung |
0000 0001 |
Clear Display |
löscht das Display und setzt den Cursor an Position 0 |
0000 001- |
Return Home |
setzt den Cursor an Position 0 |
0000 01xy |
Eintragemodus |
regelt die Richtung der Cursorbewegung (x) und das Displayshift (y) |
0000 1xyz |
Display on/off |
schaltet Anzeige (x), Cursor (y) u. Cursorblinken (z) an/aus, |
0001 xy-- |
Shift |
Bewegt den Cursor (x) und verschiebt die Anzeige (y) |
001x yz-- |
Interface |
setzt Datenbreite(x), Zahl der Zeilen (y) und Größe des Zeichens (z) |
01xx xxxx |
setzeBefehlsadr. |
alle nachfolgenden Daten gelangen in den gesetzten Charakter-RAM |
1xxx xxxx |
setze Datenadr. |
alle nachfolgenden Daten gelangen in den gesetzten Daten-RAM |
xyyy yyyy |
lese Adr.&Busy |
setzt das Busy flag (x) und liest den Adreßzähler der Anzeige (x) |
Motorsteuerung:
Die Hauptaufgabe besteht natürlich darin, den Hochregalroboter zu steuern. Der Roboter kommuniziert über die Adresse C000h. Ließt der Microcontroller von dieser Adresse , wird der Zustand der Taster übermittelt. Mit einem Schreibbefehl werden die Motoren angesteuert. Es ist möglich, bis zu drei Bitfolgen miteinander zuverknüpfen, um so die Motoren gleichzeitig laufen zu lassen. So können Anfahrtswege mit einen Linienalgorithmus verkürzt werden. Der Breesenham-Algorithmus arbeitet nur mit Integerwerten und ist somit sehr schnell. Es sind keine komplitzierten Realzahlberechnungen notwendig.
Bewegungsrichtung des Roboters |
horizontal |
vertikal |
Greifer |
vor |
1111 1110=FEh |
1111 1011=FBh |
1110 1111=EFh |
<