Die Übertragung von Programmen in den 89C2051

Programmiergerät selberbauen (1)    Programmiergerät selberbauen (2)   Programmiergerät selberbauen (3)   Bibliographie
Das Flash-ROM des 2051ers wird mit speziellen Programmiergeräten vom PC aus beschrieben und gelöscht. Handelsübliche Programmiergeräte kosten von 400 DM an aufwärts. Da derartig teure Lösungen für Hobbyelektroniker nicht in Frage kommen, ist also Selbstbau angesagt. Lösungen für ein eigenes Programmiergerät werden auf dieser Seite vorgestellt.

Links zu Herstellern kommerzieller Programmiergeräte:
Höpping Elektronik Design
Schuricht Online
Elektronikladen
(diese Liste ist keinesfalls vollständig und nicht geordnet)

eigenes Programmiergerät (1)

Auf der Webseite des Herstellers ATMEL befindet sich die Beschreibung und der Schaltplan sowie die benötige Software für ein auf den 89C2051 zugeschnittenes Programmiergerät.

Dieses ist robust und funktioniert einigermaßen, ist aber etwas kompliziert nachzubauen und hat den Nachteil, daß es - zumindest bei mir - im ausgeschalteten Zustand so viel Strom zieht, daß die Schnittstelle beim Booten nicht erkannt wird, wenn der Programmer nicht eingeschaltet ist. Wenn man auf die Programmierung der 51er /52er MCUs verzichten kann, benötigt man zum Aufbau eine Platine mit doppelseitiger Kuperauflage von ca. 100 x 120 mm. Die erforderlichen Bauteile kann man entweder von seinem lokalen Elektronikhändler oder von Versendern wie Conrad, Reichelt oder Schuricht beziehen. Durch ein paar teure Tantal-Kondensatoren sowie die vielen IC's kann man etwa 30 bis 40 DM kalkulieren. Außerdem sollte man eine lange Bastelzeit einplanen, da das Belichten, Ätzen und Löten so großer und zudem noch doppelseitiger Platinen nicht trivial ist.

Bedingung für das Auslesen des Chip-Speichers ist eine bidirektionale parallele Schnittstelle. Neuere Rechnergenerationen besitzen diese zumeist. Da aber auch das Programmiergerät nicht galvanisch getrennt vom Computer ist und oft nur eine parallele Schnittstelle im Rechner steckt, bietet es sich in vielen Fällen an, eine bidirektionale Schnittstellenkarte für ca. 30 DM nachzurüsten.

Wer sich nicht die Arbeit machen möchte, selbst ein Platinenlayout aus dem Schaltplan zu entwickeln, kann sich an meinem Layout orientieren. Für das korrekte Funktionieren übernehme ich selbstverständlich keine Gewähr.

Eigener Programmer (1)
Anmerkung: Ich habe ein paar Kondensatorwerte geringfügig verändern müssen, um das Gerät zum Arbeiten zu bewegen. Also nicht gleich die Flinte ins Korn werfen! Außerdem habe ich die Buchse für die Parallelschnittstelle auf das Standard-Rastermaß zurechtgebogen. bei den üblichen Buchsen stehen die Pins nicht im 1,27mm-Rastermaß. Das Layout muss daher möglicherweise vor dem Belichten angepaßt werden. Zudem ist die Pinbelegung des LM317 verdreht - es müssen also Pin's des 317 umeinander herumgebogen werden, um die richtigen Leiterbahnen zu kontaktieren. Da mir dieser Programmer nicht besonders zusagt, habe ich diese Fehler aber im Layout nicht mehr korrigiert - das ist Ihre Aufgabe, wenn Sie ihn tatsächlich nachbauen wollen.
Außerdem habe ich 3 Präzisionstrimmer anstelle von Widerständen eingebaut, die ich auf die Schnelle nicht beschaffen konnte.
zurück zum Anfang

eigenes Programmiergerät (2)

eigenes Programmiergerät (2)
Eine viel einfachere Möglichkeit, zu einem eigenen Programmiergerät zu kommen, ist es, einen vorprogrammierten 2051 als Controller zu benutzen. Dies hat den Vorteil, mit dem integrierten UART die serielle Schnittstelle zur Datenübertragung benutzen zu können und mit extrem wenig weiterer Hardware auszukommen. Man benötigt nur noch einen weiteren IC, den 74LS14 (invertierender Schmitt-Trigger), der gleich für 3 Funktionen eingesetzt wird: als Schmitt-Trigger , als NOT und als LED-Treiber, um die Signalflanken des Controllers nicht
durch starke Verbraucher zu belasten. Desweiteren braucht man noch einen oder 2 Festspannungsregler für 12 und 5 Volt (die 12 V Programmierspannung muß recht genau eingehalten werden, wenn das Netzteil exakt arbeitet, kann auf den 12V-Regler verzichtet werden), einen Transistor, eine LC-LED, den Quarz für den Controller und einige Dioden, kleine Kondensatoren und Widerstände. Wenn man keinen verpolungssicheren Stecker einsetzt und das Risiko eines Totalverlustes nicht eingehen möchte, sollte man auch an den Einsatz eines Brückengleichrichters oder zumindest einer Schutzdiode denken. Es werden keine teuren Tantal-Kondenstoren oder ähnliche Spezialbauteile benötigt, sondern nur preiswerte Standardkomponenten. Die Schaltung ist auf einer einseitigen 45x60mm-Platine untergebracht.
Das eigentliche Problem bei diesem Programmiergerät liegt darin, an den vorprogrammierten Steuercontroller zu kommen. Vielleicht besitzt ja jemand im Bekanntenkreis ein Programmiergerät, den man um den einmaligen Gefallen bitten kann. Ansonsten bin ich auch bereit, gegen einen kleinen Unkostenbeitrag ein Programmiergerät zusammenzubauen und zu versenden. Die zum Nachbau erforderlichen Dateien, das Steuerprogramm für den Steuercontroller sowie die Ansteuersoftware (unter DOS mit einer intuitiven Oberfläche) können Sie auf meiner Download-Page herunterlanden. Wem mein Steuerprogramm für das Programmiergerät nicht zusagt, dem sei die Homepage von Andreas Oyrer empfohlen. Sein Programm arbeitet ebenfalls mit der von mir beschriebenen Hardware, sieht ein wenig netter aus und versteht HEX-Files direkt und ohne Umwege über das Hexbin-Utility.
Eine Online-Bauanleitung ist mittlerweile auch verfügbar.

Da die I/O-Lines nicht für einen Rückkanal zum PC gereicht haben (und ich zusätzlichen Schaltungsaufwand vermeiden wollte) läuft die Kommunkiation mit dem Benutzer über eine Leuchtdiode. Wenn die 2 mal pro Sekunde blinkt, ist alles in Ordnung: der Controller wartet auf eingendende Daten. Damit es möglich ist, die Programmierschaltung passiv zwischen die serielle Schnittstelle und weitere Geräte wie z.B. Modems zu setzen und nicht immer umstecken zu müssen, bleibt der Controller bleibt so lange untätig, bis EBh 98h mit 1200 Baud über die Schnittstelle kommen. 1200 Baud habe ich deshalb gewählt, weil das interne Ram mit 128 Byte als Empfangspuffer zu gering ist - ich habe also keinen Puffer implementiert, sondern programmiere direkt jedes empfangene Byte. Das bedeutet, daß die Schnittstelle die Daten so langsam schicken muß, das der Programmiervorgang hinterherkommt. Es müßte aber selbstverständlich auch möglich sein, die Baudrate bedeutend zu erhöhen - ausprobiert habe ich es aber noch nicht, weil bislang keine Notwendigkeit dafür bestand.
Das nächste gesendete Byte legt die Aktion fest. Ich habe allen Aktionen ein Bit zugewiesen, so daß auch mehrere hintereinander ausgeführt werden können, ohne jedesmal von vorn EBh 98h senden zu müssen. In der Praxis ist aber zu beachten, daß die Daten eventuell schneller gesendet als verarbeitet werden, wenn die Befehle löschen, leer testen und schreiben verknüpft werden: es geht ein Byte verloren, weil das Leer-Testen länger dauert als ein einzelner Sendevorgang mit 1200 Baud.

Die serielle Schnittstelle des PC erwartet weiterhin einen Handshake über die Steuerleitungen, so daß man am Stecker DTR,DSR,CD miteinander verbinden muß und RTS und CTS ebenfalls, 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 nebenstehenden Aufstellung entnehmen: Anschlußschema eines Microcontrollers an die serielle Schnittstelle des PC's

Die Belegung des Befehlsbytes, das nach dem obligatorischen 0EBh 098h an den Controller geschickt wird, sieht im einzelnen so aus:
0           : Fehler, LED aus, halt
bit1 gesetzt: löschen
bit2 gesetzt: schreiben
bit3 gesetzt: verifizieren
bit4 gesetzt: blank check
bit5 gesetzt: (Test1),jeden empfangenen Wert direkt auf P3 ausgeben
bit6 gesetzt: (Test2),jeden empfangenen Wert direkt auf P1 ausgeben
bit7 gesetzt: (Test3),die Zahlen von 1 bis 255 einlesen, wenn geklappt, LED an
Das Löschen und der Leer-Test erwarten keine weiteren Daten und kehren nach Ausführung in den Wartezustand (blinken) zurück, sofern der Blank Check erfolgreich war. Eine Ursache für das Fehlschlagen des Löschens ist eine zu geringe oder unsaubere Spannung. Im Zweifelsfalle sollte der Programmer mit 16 bis 20V Gleichspannung betrieben werden, so daß der Spannungsregler noch genug Reserven hat.
Beim Schreiben und Verifizieren werden die zu programmierenden / zu vergleichenden Werte anschließend gesendet. Der Programmer erkennt das Ende des Programmiervorganges daran, das einige Millisekunden keine Daten mehr eintreffen, schließt den Programmiervorgang selbständig ab und kehrt in den Wartezustand zurück, ebenso beim Vergleichen, sofern die gelesenen Daten mit den gesendeten übereinstimmen.
Test3 erwartet als Daten die Zahlen 1 bis 255 nacheinander in dieser Reihenfolge. Wurden sie empfangen, so kehrt der Controller in den Wartezustand zurück. Hat die Übertragung nicht geklappt, bleibt die LED aus.
Ein weiteres Problem ist die Programmierung der Lock-Bits, da die I/O's des 2051 nur für 2 Modusleitungen statt der 3 benötigten gereicht haben. Da jedoch der Datenport nicht benötigt wird, wenn der Schreibschutz programmiert werden soll, kann das Programmiergerät mit einem einfachen Adapter auch diese Aufgabe erfüllen. Der Adapter besteht aus 2 aufeinandergesetzten IC-Fassungen. Der Zusammenbau wird in der Online-Bauanleitung näher beschrieben.

zurück zum Anfang

eigenes Programmiergerät (3)

Das 2. Programmiergerät ist schon ganz brauchbar - das Gelbe vom Ei ist es nicht, denn es ist immer noch notwendig, bei jedem Programmiervorgang erst den Controller aus dem Sockel des Experimentierboardes zu entfernen, dann in den Programmer zu stecken und nach dem Programmieren wieder in umgekehrter Richtung zu verfahren. Diese zunehmend lästiger werdende Notwenigkeit verleitete zur Entwicklung eines Programmiergerätes und eines Experimentierboardes, die, über ein Flachbandkabel verbunden, sogenannte In-System Programmierung erlauben, also die Programmierung ohne den Controller aus der Fassung zu ziehen und sogar ohne die Spannungsversorgung des Experimentierboardes abzuschalten - das Programmiergerät übernimmt im Bedarfsfalle die Kontrolle über die Experimentierplatine, ohne daß man auch nur ein Kabel umzustecken braucht. Dabei verhält sich die Programmierschaltung für die Software des Controllers auf dem Experimentierboard vollständig transparent, braucht also bei der Programmierung nicht berücksichtigt zu werden! Die Hardware, die an die Experimentierplatine angeschlossen und ausprobiert wurde, ist ebenfalls unverändert in die spätere Schaltung übertragbar - mit der Ausnahme, daß das Widerstandsnetzwerk, das als Pullup arbeitet, berücksichtigt werden muß, wenn mehrere Inputs oder lange Leitungen an die I/O's angeschlossen werden sollen, ansonsten reichen auch die internen Pullup's aus. Programmiergerät für die In-System Programmierung

Achtung: P1.0 und P1.1 haben keine internen Pullups, diese sind also auf jeden Fall vorzusehen! Die I/O-ports werden durch 220 Ohm-Widerstände von den Ausgängen der Platine entkoppelt. Die Ansteuerung der I/O's sehen also so aus:
Schema für ein I/O bei der In-System Programmierung

Damit sich die Programmierschaltung auch der Hardware, die an die Experimentierplatine angeschlossen wird, unsichtbar verhält, werden die Bustreiber normalerweise im High Impedance-Modus betrieben, an Output Enable liegt also High an. Damit das
Experimentierboard zur In-System Programmierung
funktioniert, werden sowohl die Treiber als auch der invertierende Schmitt-Trigger 74LS14 auf der Programmierplatine über die Leitung 1 des Flachbandkabels von der Experimentierplatine mit Strom versorgt, wobei ein Eingang des 74LS14 an einem Spannungsteiler zwischen 12V-Festspannungsregler und GND liegt und so die Output's der Bustreiber einschaltet, sobald an die Programierplatine eine Spannung angelegt wird. Mit dieser Schaltung ist die Experimentierplatine also auch dann lauffähig, wenn der Pfostenstecker zum Programmer abgezogen wird.
Bei der technischen Realisierung traten einige Problem auf. Zum einen behindert die Quarz-Kondensatorschwingerschaltung an XTAL1 auf der Experimentierplatine die flankensteile Übertragung von Impulsen bei der Programmierung. Weil der Kondensator unter Umständen den Signalanstieg bremst, und der Chip - vereinfacht gesagt - eine kurze Zeitspanne nicht entscheiden kann, ob denn nun high oder low anliegt,
gerät er ins Schwingen. Aber XTAL1 ist ausgerechnet mit dem Programmzähler verbunden, der jede Schwingung fleißig mitzählt: das Resultat ist ein um mehrere hundert Byte verschobener Anfang der programierten Daten. Um das zu vermeiden wird vor dem unmittelbaren Programmiervorgang eine Pause eingelegt, in der sich der Kondensator entladen kann, und dann ein schneller Reset durchgeführt, damit der Programmzähler wieder auf seinen Anfangswert kommt. Darum sollten sich nur erfahrene Bastler an die Veränderung der Schwingerschaltung herantrauen, da dann unter Umständen die Software des Programmierchip's ebenfalls geändert werden muß.
Eine andere Problematik ist die Spannungsversorgung. Die Bustreiber leisten über 50 mA pro I/O, um die eigenen Signale gegenüber der mit 220 Ohm entkoppelten Ausgangsschaltung durchzusetzen - die beiden kaskadierten Festspannungsregler jedoch nur 100 mA! Will man nun nicht unbedingt riesige 1A-Spannungsregler (die nächste Größe) einsetzen, so muß man beim Programmiervorgang die +5V-Versorgung der Experimentierplatine ebenso wie die +12V-versorgung der Programmierplatine einschalten oder eingeschaltet lassen, da die Experimentierplatine dann die Bustreiber mitspeist. Dieses ist selbstverständlich nur notwendig, wenn ein I/O direkt auf GND gezogen wird oder leistungshungrige Komponenten über die Ausgänge mitversorgt werden - viele IC's ziehen enorm Leistung über ihre Ausgänge, wenn deren Versorgungsspannung abgeschaltet wurde! Im Zweifelsfalle also einfach das Experimentierboard eingeschaltet lassen und nur zusätzlich die Programmierplatine einschalten.
Um sich einen ersten Eindruck von der Schaltung zu machen, kann man sich mein Layout ansehen. Die kompletten Entwicklungsdateien finden sich wie immer auf meiner Download-Page.

zurück zum Anfang

Bibliographie

Hier finden sich die im Text verstreuten Literaturquellen und Links zum Thema noch einmal zum Nachschlagen und Wiederfinden
http://all.at/andi Alternatives Steuerprogramm für mein Programmiergerät von Andreas Oyrer
http://www.atmel.com/atmel/acrobat/doc0285.pdf Beschreibung und Schaltung eines Programmers für den AT89C2051
Online-Bauanleitung Programmiergerät Bauanleitung für Programmiergerät #2
Online-Bauanleitung Adapter für LOCK-Bits Bauanleitung für den zum Programmieren der Lock-Bits benötigten Adapter

zurück zum Anfang

Startseite Seite vor
Erik Buchmann
EMail an: Owner@ErikBuchmann.de