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 |
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. |
Außerdem habe ich 3 Präzisionstrimmer anstelle von Widerständen eingebaut, die ich auf die Schnelle nicht beschaffen konnte. zurück zum Anfang |
|
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: |
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 |
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 |
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. |
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: |
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
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. |
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 |