Sie haben den Programmer gebaut, ausprobiert und alles hat funktioniert. Sie haben mal richtig investiert und nun 10 89C2051 auf der hohen Kante, inclusive Schwingquarz und allem drum und dran. Sie haben Software und Dokumentation aus dem Internet geladen und brennen nun voller Tatendrang darauf, alles auszuprobieren. Dieser Artikel beschreibt in Ansätzen, wie. Um Details und genaue Daten zu erhalten, die die benutzten Spezialregister erklären, laden Sie am besten '80C51 family programmers guide and instruction set' von Philips Semiconductors, diese Beschreibung ist kurz und prägnant. |
Es ist nicht viel Hardware notwendig, um den 2051 zum Laufen zu bringen. Bis auf P1.0 und P1.1 haben alle I/O's integrierte Pullups. Diese sind für einfache Belange und zum ausprobieren völlig ausreichend, wenn auch für die direkte Ansteuerung von LED's unterdimensioniert. Der integrierte Oszillator ist schon mit nur 2 kleinen Kondenstoren und dem 24-MHz-Quarz zum Schwingen zu bewegen. Es bietet sich aber an, auf dem Testboard eine automatische Resetschaltung und einen manuellen Resetknopf unterzubringen, die bei jedem Einschalten dafür sorgt, daß sich der Controller in einem definierten Zustand befindet. Der Reset-Knopf braucht nur den RST-Pin (Pin 1) nach Vcc zu schalten. Die automatische Resetschaltung besteht im einfachsten Falle aus einem Widerstand gegen Masse, der dafür sorgt, daß der Resetpin low ist, aus einem kleinen Kondensator gegen Vcc, der einen kurzen Puls beim Spannungswechsel beim Einschalten durchläßt, und einem hochohmigen Widerstand, der den Kondensator überbrückt und damit entlädt. Ein Entkopplungskondensator, der die Spannungsversorgung in unmittelbarer Chipnähe puffert, ist bei einem stabilisierten Netzteil in der Regel nicht notwendig und kann weggelassen werden. |
Als praktikabel hat es sich erwiesen, die Ports im Layout (download
hier) in geordneter Reihenfolge auf der Platine nach außen und
die Spannungsversorgung zentral zu legen.
Benutzt man Lötstifte (1,3 mm oder 1 mm) als Anschlüsse, hat man zum einen die Möglichkeit, Meßgeräte leicht anschließen zu können, zum anderen, mit Kroko-verbindern oder Kabeln mit Lötschuhen sehr leicht Schaltungen zum Entwickeln zusammenstellen zu können. |
Nach dem Einsetzen eines programmierten 2051ers und dem Einschalten der Spannungsversorgung nimmt das Board dank der integrierten Resetschaltung umgehend seine Arbeit auf. Die primäre Funktion des Microcontrollers besteht darin, Eingaben von den I/O-Lines entgegenzunehmen und nach einer Verarbeitung wieder auszugeben. Dazu steht P1 als 8-Bit Ein- und Ausgang |
zur Verfügung, P3 bietet sich Aufgrund der sehr oft gebrauchten Spezialverschaltung
mit UART, Timer und Interruptcontroller als I/O einzelner Signale auf den
in der aktuellen Verschaltung nicht gebrauchten Pins an - prinzipiell ist
die Ansteuerung beider Ports gleich.
Um ein einzelnes Byte auszugeben genügt ein einzelner mov-Befehl: |
mov P1,#123 ;Ausgabe der Zahl 123 mov P1,R0 ;Ausgabe des Registers R0 beziehungsweise der RAM-Adresse 0 mov P1, 0 ;ist daher prinzipiell dasselbe, auf der Registerbank 0 (Voreinstellung) Für die Manipulation einzelner Bits dienen zum einen die Bitbefehle: setb P3.7 ;P3.7 (Pin 11) setzen clr P3.0 ;P3.0 löschen cpl P1.1 ; P1.1 negieren( 0->1, 1->0 )Zum anderen lassen sich Bits auch mit Befehlen, die auf das ganze Byte wirken, verändern: mov a,#00010010b rl a ;rotiert den ACC nach links, 00010010 -> 00100100 anl a,#0Fh ;logisches UND, 00100100 & 00001111 -> 00000100 orl a,#0F0h ;logisches ODER, 00000100 | 11110000 -> 11110100 |
Das Einsetzen der seriellen Schnittstelle ist nicht allzu komplex, da der integrierte UART die meiste Funktionalität in Hardware ausführt und nur einige Rahmenbedingungen geschaffen werden müssen. Dabei muß der Timer 1 zur Baudratengenerierung programmiert werden. Dazu genügt es, im 8 Bit-Modus mit Autoreload eine konstante Frequenz bereitzustellen, die der UART übernimmt. Wie dies genau geschieht, ist weiter unten oder in diversen anderen Quellen wie zum Beispiel der Intel-Homepage (Stichwort: A Simplified Guide to Using the MCS® 51 On-chip UART ) nachzulesen. Bei der Verbindung zu einem anderen Microcontroller ist nichts weiter zu beachten, außer | daß beide mit der selben Baudrate und den selben Paritätseinstellungen programmiert wurden. Das dürfte nicht allzu schwierig sein, wenn beide über einen Schwingquarz der gleichen Frequenz betrieben werden. Bei der Verbindung zum PC jedoch muß beachtet werden, daß die serielle Schnittstelle nicht mit den TTL-Pegeln des Controlers, sondern üblicherweise mit +/-12V angesprochen werden muß, wobei -12V logisch 1 und +12V logisch 0 entspricht. Um nur eine Verbindung vom PC zum Controller zu etablieren,ist ein Widerstandsnetzwerk und eine Diode nach folgendem Schema vor RxD des 2051 zu schalten: |
Die serielle Schnittstelle des PC erwartet weiterhin einen Handshake über die Steuerleitungen, so daß man mit einem dreiadrigen Kabel (TxD, RxD und Signalmasse) nicht auskommt - es sei denn, man verbindet am Stecker DTR,DSR,CD miteinander und RTS und CTS ebenfalls miteinander, dann wird eine Antwort des 'Modems' simuliert, indem ein 'request to send' der Schnittstelle automatisch an der Steuerleitung 'clear to send' anliegt, sowie 'data terminal ready' der Schnittstelle automatisch ein 'carrier detect' und 'data set ready' auslöst. Die Anschlußnummern der Leitungen im Stecker, die verbunden werden müssen, kann man der folgenden Aufstellung entnehmen: Die Programmierung des UART geschieht im wesentlichen im SCON-Register: |
SM0 | SCON.7 | Operationsmodus |
---|---|---|
SM1 | SCON.6 | Operationsmodus |
SM2 | SCON.5 | Wenn SM2=1: Im Modus 2 oder 3 wird RI nicht aktiviert wenn das 9. Datenbit 0 ist. Im Modus 1 wird RI nicht aktiviert, wenn kein gültiges Stop-Bit empfangen wurde. Im Modus 0 sollte SM2 0 sein. |
REN | SCON.4 | Gelöscht um den Empfang zu stoppen |
TB8 | SCON.3 | Das 9. Bit, das in den Modi 2 und 3 übertragen wird. |
RB8 | SCON.2 | Das 9. Bit, das in den Modi 2 und 3 empfangen wurde. Im Modus 1 bei SM2=0 das empfangene Stopbit. |
TI | SCON.1 | Wird von der Hardware gesetzt, sobald ein Byte übertragen wurde und der Transfer abgeschlossen ist. Muß von der Software gelöscht werden, um das nächste Byte zu senden. |
RI | SCON.0 | Wird von der Hardware gesetzt, sobald ein Byte empfangen wurde und in SBUF abgeholt werden kann. Muß von der Software gelöscht werden, um das nächste Byte empfangen zu können. |
SM0 | SM1 | Modus | Benennung | Baudrate |
---|---|---|---|---|
0 | 0 | 0 | Register verschieben | FOSC./12 |
0 | 1 | 1 | 8 Bit UART | variabel |
1 | 0 | 2 | 9 Bit UART | FOSC/64 oder FOSC/32 |
1 | 1 | 3 | 9 Bit UART | variabel |
Eine Datenübertragung von der MCU zum PC ist nicht ganz so einfach,
da wenigstens -5V zur Verfügung stehen müssen. Ein praktischer
Weg ist es daher, einen darauf spezialisierten IC wie den MAX232 einzusetzen,
der schon die NOT-Gatter für die Umsetzung enthält und +/-10V
durch eine eingebaute Pumpschaltung erzeugt.
Eine gelungene Einführung zum MAX232 findet sich auf Die Anpassung der RS232 Schnittstellensignale. Weil außerdem die serielle Schnittstelle des PC nicht allzu variabel Baudraten erzeugen und lesen kann, ist eine Baudrate zu programmieren, die der PC auch versteht, zum Beispiel 4800 bps, 9600 bps etc. Die in den Timer (das TH1 und in das TL1-Register) zu programmierenden Werte berechnen sich wie folgt: K * Oszillatorfrequ. Baud-Rate= ------------------------ 32 * 12 * (256- TH1 ) Wobei K=1, wenn SMOD (PCON.7, Baudratenverdoppler) 0 ist und K=2 wenn SMOD=1. Genaue Baudraten sind freilich nur mit 'krummen' Quarzen wie 11,0592 MHz zu erreichen, aber die serielle Schnittstelle des PC ist nicht zimperlich - jedenfalls im Allgemeinen. Wenn jedoch die Abweichung vom Ideal fast 10% beträgt, ist das Stopbit noch nicht oder schon längst gesendet, wenn der UART der seriellen Schnittstelle es erwartet! Zum Ausprobieren steht nun das folgende in JavaScript geschriebene Programm zur Verfügung: |