Dieses Gerät dient zur Programmierung von parallelen EPROMs, EEPROMs und Flash-EPROMs. Natürlich gibt es schon jede Menge ähnliche Geräte, dieses unterscheidet sich jedoch von den meisten anderen: Es
wird über eine serielle Schnittstelle an einen Computer angeschlossen, wobei auf diesem Computer keine spezielle Software erforderlich ist - ein einfaches Terminalprogramm ist völlig ausreichend. Die
"Intelligenz" befindet sich hier auf dem Programmiergerät in Form eines AT90S8515 oder ATmega8515.
Letzte Bearbeitung: 30.07.2005
| Größe | EPROM-Typ |
|---|---|
| 2 kB | 2716 |
| 4 kB | 2732A |
| 8 kB | 2764, 27C64 |
| 16 kB | 27128, 27C128 |
| 32 kB | 27256, 27C256 |
| 64 kB | 27512, 27C512 |
| 128 kB | 27C1001, 27C010, 28F010, 29F010B |
| 256 kB | 27C2001, 27C020, 28F020 |
| 512 kB | 27C4001, 27C040, 29F040B |
| 1 MB | 27C8001, 27C080 |
Auf dem Programmiergerät befinden sich 10 Jumper, welche entsprechend der Auswahl des EPROM-Typs gesteckt werden müssen, damit die EPROM-Anschlüsse mit den richtigen Adress- und Steuerleitungen verbunden
werden. Ein Jumper dient dabei zur Einstellung der Programmierspannung in 6 Stufen: 12V, 12.5V, 12.75V, 13V, 21V und 25V. Die erforderliche Jumperstellung wird übrigens immer im Hauptmenü angezeigt. Weiterhin
sind noch 2 LEDs zur Status-Anzeige vorhanden. LED 1 (grün) zeigt an, dass das Gerät eingeschaltet ist und LED 2 (rot) leuchtet bei Zugriffen auf das EPROM auf.
Für die Programmierung der EPROMs werden schnelle Algorithmen verwendet: Alle NMOS-Typen (2716-27512) bekommen Programmierimpulse mit einer Länge von 1ms, bis der einprogrammierte Wert wieder ausgelesen werden
kann, danach wird noch eine festgelegte Anzahl Sicherheitsimpulse von ebenfalls 1ms Länge ausgegeben. Bei den CMOS-Typen (27C64-27C8001) kommt ein Express-Algorithmus zum Einsatz. Bei erhöhter Betriebsspannung
von 6,4V werden Programmierimpulse von 100µs Länge verwendet, bis der einprogrammierte Wert wieder ausgelesen werden kann. Zusätzliche Sicherheitsimpulse sind in diesem Fall nicht notwendig. Flash-EPROMs
werden mit dem vom Hersteller empfohlenen Algorithmus (laut Datenblatt) programmiert und gelöscht.
Folgende Features sind noch erwähnenswert:
Als zentrales Element arbeitet hier ein Mikrocontroller vom Typ AT90S8515 bzw. ATmega8515. Er besitzt 32 I/O-Anschlüsse und da diese für das Programmiergerät nicht ausreichen, wurde noch ein Latch
ergänzt, um weitere 8 Ausgänge zu gewinnen. Für das Latch habe ich 2 Stück 4042 verwendet, die gerade in der Bastelkiste verfügbar waren. Diese können natürlich auch durch ein besser
passendes einzelnes IC in CMOS-Technik ersetzt werden, z.B. 74HC374. In diesem Fall wird der Eingang /OE des 374 fest auf Massepotenzial gelegt.
Die µC-Anschlüsse haben folgende Funktionen: Port A dient als Datenport für die EPROM-Daten und ist über 8 Schutzwiderstände mit den Datenleitungen des EPROMs verbunden. Er wird je nach Bedarf
als Ausgang (beim Programmieren) oder als Eingang (beim Lesen, Vergleichen und Leertest) geschaltet. Die Widerstände dienen zum Schutz bei Kollisionen, falls µC-Port A und EPROM gleichzeitig auf Ausgang
gesetzt sind. Außerdem schützen sie die µC-Ports vor Überspannung, wenn die Programmierspannung auf 6.4V erhöht wurde und entsprechend höhere Pegel an den EPROM-Datenleitungen beim Lesen
anliegen.
An Port B befinden sich verschiedene Steuerleitungen: PB0 steuert direkt die rote Aktivitäts-LED an. Über PB1 wird die Betriebsspannung für das EPROM ein- bzw. ausgeschaltet und PB2 schaltet diese
Spannung zwischen 5V und 6.4V um, damit CMOS-EPROMs im Express-Mode programmiert werden können. PB3 dient zum Ein- bzw. Ausschalten der Programmierspannung. PB4-PB6 stellen die EPROM-Steuersignale /CE, /OE und /PR
bereit, wobei /PR bei EEPROMs und Flash-EPROMs die Funktion von /WE übernimmt. PB7 steuert die Datenübernahme des Latches. PB5-PB7 haben noch eine Doppelfunktion: sie werden zum Programmieren des µC
verwendet und sind für diesen Zweck an den 5-poligen Steckverbinder K101 geführt.
Port C dient zur Ausgabe der Adressleitungen A0-A15 an das EPROM und das funktioniert folgendermaßen: Zunächst gibt der µC die Daten für die Adressleitungen A8-A15 an Port C aus. Diese Daten werden
durch einen kurzen H-Impuls auf PB7 in den Latches gespeichert und sind an deren Ausgängen verfügbar. Danach werden die Daten für die Adressleitungen A0-A7 ausgegeben. Dadurch "wackeln" die
Daten auf A0-A7 am EPROM kurzzeitig, aber das stört in der Praxis nicht, da während der Adresseinstellung keine Zugriffe auf das EPROM stattfinden.
Port D hat 2 Funktionen zu erfüllen. Zunächst dienen die Anschlüsse PD4-PD7 zur Ausgabe der Adressleitungen A16-A19 an das EPROM. Der Rest ist für die serielle Kommunikation zuständig. Dazu
werden PD0-PD3 an den RS232-Treiber MAX232 geführt, welcher 2 Sende- und 2 Empfangstreiber bereitstellt sowie die notwendigen Spannungen von +/-10V erzeugt. Das Programmiergerät verwendet alle 4 Treiber
für die Leitungen TXD, RXD, CTS und RTS. Die letzten beiden steuern den Datenfluss und sorgen für eine sichere Datenübertragung. Der RS232-Anschluss wurde mit der 9-poligen Sub-D-Buchse K102 realisiert,
die so beschaltet wurde, dass ein Standard-Modem-Kabel (alle Verbindungen 1:1 durchgeschaltet) zur Verbindung mit dem Computer benutzt werden kann.
Es ist auch möglich, das EPROM Programmiergerät über USB zu betreiben. Dazu kann man entweder ein fertiges USB-RS232 Interface verwenden oder auch ein USB-Modul
direkt einbauen. Wenn man sich für letzteres entscheidet, dann kann z.B. das USB-Modul UM-100 von ELV verwendet werden, welches auch als Basis für mein USB-RS232 Interface dient:
Bei dieser Schaltung wird das USB-Modul direkt mit dem Controller verbunden. Da eine zusätzliche Wandlung in RS-232-Pegel nicht notwendig ist, können die Bauelemente IC102, K102 sowie C104-C108 entfallen.
Stattdessen benötigt man nur das UM-100 Modul und eine 2x8 polige Pfostenbuchse.
Wichtig: Der Jumper 1 auf dem UM-100 Modul muss sich in Stellung "ext." befinden, so dass das UM-100 vom EPROM Programmiergerät mit Strom versorgt wird. Anderenfalls wird
über den USB Anschluss eine Verbindung zwischen den +5V des PC und den +5V des EPROM Programmiergerätes hergestellt und das könnte gefährlich für beide Geräte werden.
Das Programmiergerät benötigt zur Stromversorgung eine Wechselspannung von 12-14V, die mit max. 200mA belastet wird. Es muss unbedingt Wechselspannung verwendet werden, weil sonst die
Spannungsverdopplerschaltung zur Erzeugung der Programmierspannung nicht funktionieren würde. Bei korrekter Eingangsspannung sollte an C203 eine Spannung von 35-40V zu messen sein. Diese wird mit IC201 und den
Widerständen R201-R207 je nach Stellung von Jumper 202 auf die benötigte Programmierspannung stabilisiert und mit der Schaltstufe (Tr201, Tr202) bei Bedarf an das EPROM geschaltet.
Wichtig: Die in der Schaltung angegebenen Werte für R201-R206 sind Richtwerte und müssen genau abgeglichen werden. Ich habe mit der nachfolgend beschriebenen Prozedur zunächst die genauen Werte ermittelt
und diese dann durch 1 oder 2 passende Festwiderstände ersetzt. Man kann aber auch entsprechende Trimmpotentiometer benutzen bzw. eine Kombination von Festwiderstand und Potentiometer um eine feinere Einstellung zu
ermöglichen, z.B. 4,7k fest und 1k Poti für R206.
Zur Ermittlung der Werte für R201-R206 gehe man wie folgt vor: Der Mikrocontroller IC101 wird zunächst noch nicht in die Fassung eingesetzt, stattdessen wird in die µC-Fassung eine Drahtverbindung von
Pin 40 auf Pin 4 gesteckt. Damit wird die Programmierspannung dauerhaft eingeschaltet. Zum Messen der Spannung wird ein Messgerät an die Kathode von D207 angeschaltet (Leitung Vpp in Schaltungsteil 2). Der Jumper
202 wird entfernt oder auf die Stellung 6 gesteckt. Nun wird R206 so eingestellt, dass an Vpp 25.1V zu messen sind. Die etwas höhere Spannung liegt innerhalb der Toleranz und bringt eine kleine Reserve, da mit
gestecktem EPROM die Spannung etwas zurückgeht. Danach wird JP202 auf Stellung 5 gesteckt und R205 so eingestellt, dass Vpp 21.1V beträgt. Der gleiche Vorgang wird mit R204-R201 mit den entsprechenden
Spannungen wiederholt.
Die Betriebsspannung für das EPROM muss ebenfalls genau abgeglichen werden: Dazu wird an der µC-Fassung eine Drahtverbindung von Pin 40 auf Pin 2 gesteckt und das Messgerät an den Kollektor von Tr204
angeschaltet (Leitung Vcc in Schaltungsteil 2). Jetzt wird R213 so eingestellt, dass 6.45V an Vcc messbar sind. Danach wird noch eine zweite Drahtverbindung von Pin 40 auf Pin 3 gesteckt und mit R211 eine Spannung von
5.05V an Vcc eingestellt. Mit einem gesteckten EPROM werden sich später die Spannungen dann auf ca. 5.0V bzw. 6.4V einstellen.
Experten werden sich fragen, wieso hier 6.4V verwendet werden. Der Grund ist folgender: je nach Hersteller werden 6.5V oder 6.25V gefordert, deshalb habe ich 6.4V gewählt und liege damit im Toleranzbereich aller
Hersteller.
Der Rest der Schaltung besteht aus einem Drahtverhau zwischen dem µC, den Jumpern und dem Programmiersockel. Die Umsteckerei der Jumper ist zwar in der Praxis etwas lästig, aber so war die Schaltung
wesentlich einfacher zu realisieren als eine Matrix aus Gattern oder Analogschaltern. Zur Vereinfachung der Bedienung können an Stelle der Jumper auch kleine Schiebeschalter verwendet werden.
Diese Stückliste enthält alle Bauelemente, die ich für dieses Projekt verwendet habe.
Die Datei epromprog-pl.zip enthält ein komplettes Platinenlayout im Eagle-Format. Dieses wurde von Hermann Schoenbauer erstellt und freundlicherweise zur
Verfügung gestellt. Hinweis: die Nummerierung der Bauelemente stimmt nicht mit meinen Schaltplänen überein, die Schaltung ist aber ansonsten weitgehend identisch.
So sieht die Einstellung im AVR-Studio für den ATmega8515 aus.
So sieht die Einstellung in PonyProg für den ATmega8515 aus.
| Option | Beschreibung |
|---|---|
| 1 | IC-Typ wählen: Es wird ein Untermenü mit den verfügbaren EPROM-Typen angezeigt. Die Auswahl erfolgt durch Eingabe der entsprechenden 2-stelligen Nummer. Bei
einer unsinnigen Eingabe wird die Liste nochmals angezeigt, erst eine sinnvolle Eingabe führt zurück ins Hauptmenü. Mit ESC kann man jederzeit ohne Änderung ins Hauptmenü zurück
springen. Danach sollte man die im Hauptmenü angezeigten Jumperstellungen setzen. Ein "x" hinter der Jumpernummer bedeutet, dass dieser Jumper für den gewählten EPROM-Typ nicht relevant ist und beliebig gesetzt sein kann. Gegebenenfalls muss der Jumper 2 korrigiert werden, falls der verwendete Typ eine andere Programmierspannung benötigt. Alle EPROM-Typen ab 2764 können normalerweise mit den vorgegebenen 12.5V programmiert werden, es gibt aber Ausnahmen, die 12.75V, 13V oder sogar 21V benötigen. Hier sollte im Zweifelsfall das entsprechende Datenblatt konsultiert werden. Die getroffene Auswahl wird übrigens im EEPROM des µC gespeichert, so dass beim nächsten Gebrauch des Gerätes wieder der zuletzt eingestellte Typ ausgewählt wird. Das ist sinnvoll, weil ja normalerweise auch die Jumperstellung vom zuletzt gewählten Typ erhalten bleibt. Hinweis: Mit Speicherschutz versehene Flash-EPROMs können nicht programmiert werden. Dies lässt die Hardware des Programmiergerätes leider nicht zu, außerdem wird die erforderliche Prozedur meist nicht in den Datenblättern beschrieben. |
| 2 | Programmieren: Spätestens nach Auswahl dieser Option sollte sich das EPROM im Programmiersockel befinden. Das Gerät wartet nun auf die zu programmierenden Daten im
Intel Hex Format. Dazu benutzt man am Terminalprogramm die Funktion "Textdatei senden" oder "ASCII senden" und wählt die gewünschte Datei aus. Das Programmiergerät liest die
Daten ein und arbeitet sie zeilenweise ab, d.h. nach dem fehlerfreien Empfang einer Hex-Zeile wird das EPROM eingeschaltet und die in der Zeile enthaltenen Daten werden programmiert. Danach wird das EPROM wieder
abgeschaltet und auf die nächste Zeile gewartet. Bei erfolgreicher Programmierung wird die Anfangsadresse des Blockes und ein "OK" auf dem Bildschirm ausgegeben, anderenfalls die Adresse und
"Fehler". Übrigens, der Datenempfang über die RS232-Schnittstelle erfolgt interruptgesteuert, so dass während der Programmierung bereits neue Daten im Hintergrund in einem 64 Byte großen Pufferspeicher empfangen werden können. Wird in den empfangenen Daten ein Fehler erkannt, so erscheint eine Fehlermeldung und der Programmiervorgang wird beendet. Am Terminalprogramm sollte dann das Senden abgebrochen werden und mit der Escape-Taste gelangt man wieder ins Hauptmenü. Wichtig: Bitte nicht versuchen, Binärdateien per XModem, YModem oder ZModem Protokoll zu übertragen - das funktioniert nicht! |
| 3 | Vergleichen: Der Handlungsablauf beim Vergleichen ist praktisch identisch zum Programmieren: Das EPROM wird in den Sockel eingesetzt und am Terminal die Hex-Datei abgesendet. In diesem Fall wird das EPROM aber nicht programmiert, sondern gelesen und mit den empfangenen Daten verglichen. Bei Übereinstimmung einer empfangenen Hex-Zeile mit dem entsprechenden EPROM-Inhalt wird auf dem Bildschirm die Anfangsadresse des Blockes und ein "OK" ausgegeben, bei Ungleichheiten die Adresse und "Fehler". Auch hier gelten die gleichen Hinweise und Warnungen betreffs Fehlermeldungen und Binärdateien. |
| 4 | Lesen: Hier ist vielleicht etwas Übung erforderlich, damit die Aufzeichnung einer Hex-Datei gelingt :-) Aber so schlimm ist es nicht. Nach dem Stecken des EPROMs
und der Auswahl der Lesen-Funktion mit der Taste 4 muss am Terminalprogramm die Funktion "Text empfangen", "ASCII empfangen" oder "Text aufzeichnen" ausgewählt werden. Falls so
eine Möglichkeit nicht existiert, dann startet man stattdessen die Log-Funktion. Ein Druck auf die Enter-Taste im Terminalfenster startet das Lesen - das EPROM wird eingeschaltet und der Inhalt im Intel Hex
Format mit 32 Bytes/Zeile ausgegeben. Je nach Einstellung des Lese-Modus (siehe Option 7) werden dabei entweder alle Bytes ausgeben oder zur Reduzierung der Datenmenge leere Speicherbereiche weggelassen (Zeilen,
die 32 aufeinanderfolgende Bytes mit dem Inhalt 0xFF haben). Am Ende des Datentransfers muss zuerst die Aufzeichnungsfunktion wieder deaktiviert werden und erst dann wird mit einem Druck auf die Enter-Taste ins
Hauptmenü zurückgekehrt. Diese Reihenfolge ist wichtig, damit eine "saubere" Hex-Datei aufgezeichnet wird. Eine Kurzbeschreibung der obenstehenden Prozedur wird bei jeder Lesen-Aktion auf dem Bildschirm ausgegeben. Der Lesevorgang kann jederzeit mit der Escape-Taste abgebrochen werden. |
| 5 | Leertest: Hier werden einfach nacheinander alle Speicherzellen des EPROM ausgelesen und auf den Wert 0xFF geprüft, welcher einer leeren Speicherzelle entspricht. Sind alle Zellen leer, dann wird eine entsprechende Meldung ausgegeben, anderenfalls auch :-) Bei größeren EPROMs kann der Test einige Sekunden dauern. |
| 6 | Löschen: Diese Funktion ist natürlich nur bei Flash-EPROMs anwendbar und bewirkt das Löschen des gesamten Speicherbereiches mit der Funktion "Chip Erase". Das Löschen beginnt sofort nach Auswahl dieser Option, eine Sicherheitsabfrage erfolgt nicht. Das Löschen kann je nach IC-Typ bis zu einer Minute dauern. Hinweis: Mit Speicherschutz versehene Flash-EPROMs können nicht gelöscht werden. Dies lässt die Hardware des Programmiergerätes leider nicht zu, außerdem wird die erforderliche Prozedur meist nicht in den Datenblättern beschrieben. |
| 7 | Lese-Modus: Mit dieser Option wird der Lese-Modus umgeschaltet. Es stehen zwei Möglichkeiten zur Auswahl: alle Bytes - Es werden alle Bytes des EPROMs gelesen und zum Terminal gesendet. ohne 0xFF - Zur Bescheunigung des Lesens werden leere Speicherblöcke nicht zum Terminal übertragen. Das ist der Fall, wenn mindestens 32 aufeinander folgende Bytes den Inhalt 0xFF haben. Die aktuelle Einstellung des Lese-Modus wird im EEPROM des Controllers gespeichert und bleibt auch beim Abschalten des Gerätes erhalten. |
| 8 | Sprache: Mit dieser Option wird die Sprache für die Menüführung umgeschaltet. Es stehen zwei Möglichkeiten zur Auswahl: deutsch - Menütexte sind in deutscher Sprache. english - Menütexte sind in englischer Sprache. Die aktuelle Einstellung der Sprache wird im EEPROM des Controllers gespeichert und bleibt auch beim Abschalten des Gerätes erhalten. |
| 9 | RS232 Baudrate: Hiermit kann man die Baudrate der seriellen Schnittstelle ändern. Im folgenden Menü werden die möglichen Raten von 115200, 57600, 38400 und 19200 Baud angeboten. Wird die bereits verwendete Baudrate ausgewählt, dann erscheint sofort wieder das Hauptmenü. Bei Auswahl einer abweichenden Rate erscheint ein kurzer Hinweis auf die folgende Prozedur und die rote LED blinkt im Sekunden-Takt. An dieser Stelle muss zunächst das Terminal auf die neue Baudrate umgestellt werden. Danach ist es erforderlich, das Programmiergerät aus- und wieder einzuschalten. Nun sollte wieder das Hauptmenü auf dem Bildschirm zu sehen sein. Falls nicht, dann muss eventuell das Terminalprogramm neu gestartet werden. Mit ESC kann man übrigens ohne Änderung ins Hauptmenü zurückkehren. Auch die aktuelle Einstellung der Baudrate wird natürlich im EEPROM des Controllers gespeichert und bleibt beim Abschalten des Gerätes erhalten. |
| EPROM-Typ | Programmieren über RS-232 | Lesen über RS-232 |
Programmieren über USB | Lesen über USB |
| 27C256 | 0:09 min | 0:09 min | 1:08 min | 0:09 min |
| 29F010 | 0:32 min | 0:33 min | 4:40 min | 0:33 min |
| 29F040 | 2:11 min | 2:09 min | 18:41 min | 2:09 min |
Ein Blick auf die Bestückungsseite der Platine.
Die Jumper sind hier in folgender Reihenfolge angeordnet:
JP201, JP202
Dieses Bild zeigt die Rückseite der Platine. Kurze direkte Verbindungen wurden mit verzinntem Kupferdraht hergestellt. Für längere Verbindungen habe ich 0,3 mm Kupferlackdraht
("Fädeldraht") verwendet.
Hier ist das fertig aufgebaute Gerät zu sehen. Als Gehäuse habe ich ein TEKO KL11 (erhältlich z.B. bei Reichelt Elektronik) verwendet, welches relativ preiswert und fast optimal für diesen Zweck
geeignet ist. Für den Programmiersockel und die Jumper habe ich einen großen Ausschnitt ausgesägt, damit man gut an alles herankommt. Auf der linken Seite (nicht sichtbar) befinden sich noch zwei
Aussparungen für den Stromanschluss und die serielle Schnittstelle.