Rob's web

27C256 EPROM-emulator

Het is alweer zo'n 10 jaar geleden dat we een EPROM-emulator gepubliceerd hebben. Het ontwerp in dit artikel komt tegemoet aan de hedendaagse wensen van hobbyisten die moeten foutzoeken in microcontroller-systemen met een EPROM. We hebben gekozen voor de 27C256 vanwege de prijs en vanwege het feit dat het tegenwoordig de meest gebruikte EPROM is.

Een EPROM-emulator is een ontwikkelgereedschap dat ontworpen is om taken als het debuggen (foutzoeken) en schrijven van een programma voor schakelingen met EPROM's (Erasable ProgrammabIe Read Only Memory) te vereenvoudigen. Een EPROM moet eerst helemaal gewist worden door blootstelling aan ultraviolet licht gedurende een bepaalde tijd, voordat er een nieuw programma in kan worden gezet. Dus moet men, zelfs bij een heel kleine aanpassing van de code in de EPROM, weer door het hele proces van wissen en herprogrammeren. Dat is vervelend en het kost tijd en geld, nog afgezien van de prijs van een UV-wisapparaat.

Al deze problemen worden vermeden door het gebruik van een EPROM-emulator. Nu is het mogelijk om zo vaak je maar wilt in een programma fouten te verbeteren en een nieuw programma te downloaden zonder ook maar één keer een EPROM te hoeven wissen, net zolang tot het systeem werkt zoals u dat wilt. Omdat het programma zo uitgebreid getest is, hoeft de EPROM maar eenmaal geprogrammeerd te worden terwijl u er toch zeker van kunt zijn dat het straks allemaal volgens plan zal werken. Er zijn tegenwoordig echter ook herprogrammeerbare flash en ISP (In-System Programmable) componenten. Heeft een EPROM-emulator dan nog wel voordelen of zelfs bestaansrecht met het oog op de trend naar nog grotere geheugens? Er zijn echter nog steeds een flink aantal schakelingen met microcontrollers die gebruik maken van programma's in een externe EPROM.

Deze controllers zijn onderdeel van de families 8051, 68HC11 en 80C5xx. En daar komt de hier gepresenteerde emulator uitstekend tot zijn recht.

Werking van de schakeling


Figuur 1 - Blokschema van de 27C256 EPROM-emulator, met de Atmel microcontroller als besturend element.

Het principeschema van figuur 1 is zeer gebruikelijk voor een emulator. Het onderliggende principe van een EPROM-emulator is dat 'dood' geheugen zoals ROM of EPROM wordt vervangen door 'levend' geheugen (RAM) door middel van dual-port toegang. In het schema is duidelijk te zien dat het RAM aangestuurd wordt door twee latches onder besturing van een microcontrolIer.

De basis van elke EPROM-emulator wordt gevormd door een RAM (IC5 in figuur 1) dat in feite de (E)PROM van het host-systeem vervangt. Het RAM wordt omringd door latches (IC3 en IC4) en buffers (IC6, IC7 en IC8). Wat die daar precies doen, wordt verderop uitgelegd.

Een belangrijke eigenschap van onze EPROM-emulator (vergeleken met traditionele ontwerpen) is de toepassing van een microcontroller (IC2). Deze zorgt voor de besturing van de latches en het RAM, en verzorgt ook de ontvangst en behandeling van de objectcode die naar het doelsysteem moet worden gestuurd. Hiervoor wordt een Atmel 89AT2051 micro controller gebruikt. De belangrijkste reden voor de keuze van deze controller is de aanwezigheid van seriële I/0 en EPROM op de chip zelf. Hierin kan het hele besturingsprogramma voor de emulator worden opgeborgen.


Figuur 2 - Schema van de 27C256 EPROM-emulator

Praktische schakeling

Figuur 2 toont de praktische uitwerking van het eerder getoonde blokschema. Alle blokken die we hierboven hebben besproken zijn vrij gemalkelijk terug te vinden. De RS232-afhandeling wordt verzorgd door de vertrouwde MAX232. De signaalniveaus van ±10 V op de RS232 aansluitingen worden door IC1 omgezet van en naar logische niveaus (+5 V/0 V). De MAX232 zorgt ervoor dat de microcontroller in de schakeling met de PC kan communiceren via de RS232-poort. De seriële poorten op veel PC's kunnen tegenwoordig signalen aan op 5-V-niveau. Wilt u de MAX232 om die reden weglaten, dan moeten wel de RxD- en TxD-signalen worden geïnverteerd! Microcontroller IC2 zorgt voor de besturing van de latches IC3 en IC4 en de buffers IC6, IC7 en IC8. Al deze geïntegreerde schakelingen zorgen gezamenlijk voor de correcte aansturing van RAM IC5. Met correct wordt bedoeld dat het RAM vanuit de microcontroller of de externe schakeling kan worden benaderd, maar nooit van beide kanten tegelijkertijd.

Het RAM emuleert (imiteert) dus in feite de (E)PROM die uit de doelschakeling verwijderd is. Als de doelschakeling toegang heeft tot het RAM zal die RAM zich gedragen alsof er een systeem(E)PROM was geïnstalleerd, vandaar de term emulator. Om dat voor elkaar te krijgen moet het RAM twee aansluitingen hebben. Aan de ene kant maakt de elektronica van de emulator het mogelijk dat er programmacode in het RAM geschreven kan worden, terwijl van de andere kant het externe (gast)systeem toegang tot het RAM heeft om de code te lezen die uiteindelijk door de microcontroller zal worden uitgevoerd.

De latches IC3 en IC4 verbinden de adreslijnen van het gastsysteem met het RAM. Afhankelijk van de opdrachten die ontvangen worden van de microcontroller, worden de gegevens via de interne databus (DO...D7) doorgegeven. Elke enable-ingang van de latch wordt bestuurd door een individuele IlO-pen van de microcontroller. Op deze manier kan de processor de RAMadresbus besturen. Als het doelprogramma eenmaal in het RAM is opgeslagen, gaan de twee latches over naar een toestand met een hoge impedantie om problemen te vermijden als het systeem overschakelt naar emulatiemode, wanneer het RAM daadwerkelijk verbonden met het doelsysteem.

De buffers IC6, IC7 en IC8 zorgen voor de verbinding van de adres- en datalijnen van het RAM met de externe gastschakeling.

Voeding

De 27C256 EPROM-emulator kan op twee manieren van voeding worden voorzien. De eerste methode, de standaard methode, is door middel van een adapter. De voeding op de print bestaat uit een driepoots spanningstabilisator van het type 7805 (ICI0) in een klassieke schakeling. Daarmee wordt de gestabiliseerde +5-V-spanning voor de emulatorschakeling opgewekt. Omdat er maar een stroom van 100 mA nodig is, hoeft de 7805 niet zo veel te doen in deze schakeling. Diode Dl biedt bescherming tegen het verkeerd om aansluiten van de ingangsspanning van de netadapter. LED D2 geeft aan of er voedingsspanning is.

Bij de tweede methode wordt de schakeling vanuit het gastsysteem gevoed. Dat is in bijna alle gevallen mogelijk omdat er normaal gesproken altijd +5 V aanwezig is voor de digitale schakeling rond de EPROM. Als u deze methode altijd wilt toepassen dan kunt u de onderdelen ICI0, Dl en C3 weglaten op de emulatorprint. Met jumper JPl (vlakbij de spanningsstabilisator) kan worden omgeschakeld tussen interne en externe voeding.

De seriële verbinding

De communicatie tussen de PC en de emulator bestaat uit tweerichtingsverkeer via de RS232-poort, waarvoor een passende schakeling en bekabeling nodig is.

De RS232-interface op de emulatorprint bestaat uit een MAX232 (IC1) in de standaardschakeling met vier 'pomp'condensatoren. Natuurlijk hadden we de SMD-versie van de MAX232 kunnen gebruiken, dan had de hele seriële interface in een sub-D-connector gepast voor een gemakkelijke verbinding met de PC. We hebben echter besloten om de hele schakeling op de emulatorprint te plaatsen om de opbouw zo gemakkelijk mogelijk te houden. Daardoor kan ook een algemeen verkrijgbare seriële kabel worden toegepast.

Nog een opmerking over de RS232 aansluiting: daar moet een standaard RS232 kabel voor worden gebruikt, dus niet een kabel met gekruiste verbindingen (ook wel een nulmodem-kabel genoemd).

Hoe werkt het?

De werking van de emulator kan verdeeld worden in twee taken: (1) het laden van het RAM en (2) het emuleren van een (E)PROM in het doelsysteem. Voor de eerste taak verstuurt de PC de hexadecimale code die in de pseudoEPROM moet worden opgeslagen via de seriële poort. Voor de tweede functie moet de microcontroller poort P3.2 logisch laag maken om de tristate-drivers IC7 en IC8 te activeren, zodat het doelsysteem toegang kan krijgen tot de code. Twee FET's, Tl en T2, houden het gastsysteem in de reset-toestand. Laten we dat eens wat nauwkeuriger bekijken. Bij het opstarten initialiseert de microcontrolIer de schakeling voor het laden van het RAM. Daartoe worden alle aansluitingen van poort P3 logisch hoog gemaakt, behalve P3.5 en P3.7.

Om het RAM te kunnen besturen moet de microcontrolIer poort P3.2 logisch hoog maken. Voor het laden van het RAM verschijnt aan de uitgang van poort P1 het hoge deel van het adres van het eerste databyte. Vervolgens wordt tristate-driver IC4 geopend en weer gesloten door middel van P3.5.

Dit spelletje wordt herhaald voor het lage deel van het adres, maar nu met P3.7 die tristate-driver IC3 bestuurt (het adres wordt opgeslagen in de latches IC3 en IC4). Poort P3.2 van de AT89S2015 microcontroller is geprogrammeerd om de uitgangen van de buffers IC6, IC7 en ICS om te schakelen naar een hoge impedantie. Dat is nodig om elke verstoring veroorzaakt door externe elektronica ver weg te houden van het RAM gedurende het schrijven.

Ditzelfde signaal wordt tevens geïnverteerd door de combinatie T1/R3. Het geïnverteerde besturingssignaal wordt gebruikt voor het inschakelen van IC3 en IC4, zodanig dat de RAM-adreslijnen juist worden aangestuurd. Het besturingssignaal op P3.2 staat ter beschikking van de doelschakeling door middel van een stel soldeeraansluitingen, RESET(L) en RESET(H). Een van deze signalen kan gebruikt worden om het doelsysteem in de reset-toestand te houden terwijl het RAM wordt geladen met object-code. Als het hele programma in het RAM zit, verzendt de micro controller in de emulator een boodschap via de RS232-poort om dat aan te geven. De PC moet het programmabestand in IntelHex-formaat via de RS232-poort versturen. De processor van de emulator zorgt voor de goede ontvangst van het bestand (LED D3 licht op tijdens het ontvangen van gegevens van de PC) en stopt elk ontvangen databyte op de juiste plaats in het RAM. Dat doet IC2 door de adreslijnen AO..A7 naar poort P1 te kopiëren en een puls op P3.7 te geven als dat gebeurd is. Latch IC3 kopieert die gegevens. Hetzelfde wordt herhaald met het adresdeel A8..A13. Deze gegevens worden in latch IC4 opgeslagen als er een puls door poort P3.5 wordt afgegeven.

Tenslotte wordt het eigenlijke databyte naar Pl gekopieerd, gevolgd door een lage puls op poort P3.3. Deze zorgt voor het schrijfsignaal (WR) van het RAM. Als dit signaal laag wordt, wordt het datawoord op poort Pl naar het eerder gespecificeerde adres geschreven. Deze hele procedure wordt herhaald tot alle bytes van het programma in het RAM geschreven zijn.

Als het hele IntelHex-bestand is ontvangen, schakelt de processor over naar simulatie-mode. Of juister gezegd, het RAM wordt in lees-mode gezet door poort P3.3 omlaag te trekken en de RAM-output-drivers in te schakelen door OE (Output Enable) eveneens laag te maken. Dat gebeurt met P3.4.

Het lage niveau van P3.3 schakelt ook de uitgangen van de buffers IC7 en IC8 in en de latch uitgangen gaan naar een hoge impedantie door middel van de EN (enable) ingangen.

Naast deze belangrijke functies blokkeert het signaal P3.3 de twee RESETuitgangen van de schakeling. Als een van de twee RESET uitgangen op een geschikte wijze verbonden wordt met de doelschakeling, blijft deze automatisch in de reset-toestand terwijl het RAM wordt geladen met de programmacode. Als het programma helemaal geladen is, wordt het doelsysteem automatisch opnieuw geïnitialiseerd (heel handig als het doel systeem geen eigen reset-knop heeft).

Poort P3.4 stuurt het RAM op een zodanige wijze aan dat de geheugenchip voortdurend data op de interne databus plaatst.

Om te voorkomen dat het RAM gegevens op de externe databus plaatst, worden de twee enable-ingangen van buffer IC6 verbonden met de OE {Output Enable) en CS (Chip Select) lijnen van de externe elektronica. Op deze manier wordt een juiste overdracht van gegevens van het RAM naar de externe databus gegarandeerd als het doelsysteem de EPROM-emulator adresseert. Als er nieuwe gegevens in het RAM moeten worden geschreven, drukt men op de RESET-knop om het laadproces te starten.


Figuur 3a -  Componenten opstelling van de print die ontworpen is vooe de 27C256 EPROM-emulator. De print is dubbelzijdig en doorgemetaliseerd.


Figuur 3b - Layout van de dubbelzijdige, doorgemetaliseerde print ontworpen voor de 27C256 EPROM-emulator.

Opbouw van de schakeling

Op de foto bij dit artikel is te zien dat het mogelijk is om de emulator-print nog kleiner te maken door bijvoorbeeld de seriële interface met de MAX232 te laten verhuizen naar het inwendige van de connectorbehuizing. Zoals eerder al is besproken, is niet voor deze aanpak gekozen om er zeker van te zijn dat iedereen de schakeling kan bouwen met algemeen verkrijgbare componenten.

In figuur 3 is de print te zien met de layout van de koperbanen en de plaatsing van de onderdelen. Het monteren van de componenten zal geen al te grote problemen. Omdat de print dubbelzijdig en doorgemetalliseerd is, zijn geen draadbruggen aanwezig, die anders bij de montage nogal eens over het hoofd worden gezien.

Zoals gebruikelijk met dit soort projecten kunt u het beste beginnen met de lage onderdelen zoals weerstanden, condensatoren en transistors. Kijk goed uit met de plaatsing van het weerstands netwerk R8; de aansluiting met de stip is de gemeenschappelijke aansluiting en die moet aan de rand van de print komen. Om kosten te besparen hoeven slechts drie IC-voeten (van goede kwaliteit) te worden gebruikt, één voor de processor, één voor het RAM en één voor de platte kabel tussen de emulator en de EPROM in de doelschakeling. Let op de oriëntatie van IC7, deze zit net andersom als de andere IC's op de print (ICl en ICI0 niet meegeteld).

Controleer de schakeling grondig en test ook de voedingsspanning op alle IC's voordat de processor en het RAM in de voetjes worden geplaatst. LED D2 licht op als er voedingsspanning is.


Figuur 4 - Opgebouwd prototype van de 27C256 EPROM-emulator

De software

Het programma voor de Atmel-microcontroller is geschreven voor communicatie met de EPROM-emulator middels het Windows-programma HyperTerminal. De seriële verbinding tussen de PC en de emulator, die op 4800 bit/s draait, zorgt voor de overdracht van de code.

De emulator herkent het IntelHex-formaat dat veel wordt toegepast voor het oversturen van programmacode van een PC naar een programmer (apparaat voor het branden van (E)PROM's).

HyperTerminal wordt standaard meegeleverd met Windows 95 en 98. Het IntelHex-bestand wordt in de ASCIImode verstuurd (en niet met een protocol als Kermit of Z-modem).

De instellingen voor de communicatie zijn 4800 bit/s, 8 databits, geen pariteitsbit, 1 stopbit (4800,N,8,1). Selecteer voor het verzenden van de data de functie 'Overbrengen - Tekstbestand verzenden'.

Het is ook mogelijk om DOS te gebruiken voor de communicatie tussen de PC en de emulator.
DOS-gebruikers tikken in: COPY INTEL.HEX COM2:
Linux-gebruikers tikken in: Cat INTEL.HEX /dev/xxx; xxx is de poort waar de EPROM-emulator mee is verbonden.

Onderdelenlijst

R1, R2 = 1k5
R3, R7 = 12k
R4 = 10k
R5, R6 = 4k7
R8 = 10k 8 voudige SIL-array

C1, C2, C16, C17 = 10 µF/35 V staand
C3 = 47 µF/35 V staand
C4 - C9, C13 - C15 = 100 nF
C11, C12 = 33 pF

D1 = 1N4001
D2, D3 = LED

T1, T2 = BS170

IC1 = MAX232 (Maxim)
IC2 = AT89C2051 (geprogrammeerd, EPS 000153-41)
IC3, IC4 = 74HCT573
IC5 = 62256
IC 6, IC , IC8 = 74HCT541
IC9 = geëmuleerde EPROM
IC10 = 7805

K1 = 9 polige haakse sub-D connector, female, printmontage.
PC1 - PC4 = soldeerpen
JP1 = 3 polige header met jumper
S1 = drukknop met maakcontact
X1 = 12 MHz kristal
Print = EPS 000153-1
Source-code = EPS 000153-11