Der 8748H und der 8749H werden mit einer Programmierspannung von 21 V an VDD programmiert (ältere Typen benötigten 25V). Zusätzlich werden 18V an PROG und EA benötigt. Mit 18 V an EA wird der Baustein in den Programmier- und Auslesemodus geschaltet. Auslesen erfolgt mit T0=1, Programmieren mit T0=0. Daten und die unteren acht Adressbits werden über Port 0 gemultiplext eingegeben, wobei der Reset-Eingang die Adressenübernahme steuert. Die Portleitungen P10 und P11 müssen grundsätzlich auf Massepegel liegen. Die Programmierung erfolgt in folgenden Schritten:
1. Anfangsbedingungen: VDD=5V, PROG=5V, EA=5V, Reset=0,
T0=0, P10=0, P11=0, Taksignal vorhanden
2. EA=18V (Programmiermodus aktivieren)
3. Adresse an DB0...DB7 und P20...P22 anlegen.
4. RESET=5V (Adresse übernehmen)
5. Daten an DB0...DB7 anlegen.
6. 50-ms-Programmierimpuls mit VDD=21V und PROG=18V
7. VDD=5V, PROG=5V
8. RESET=0
9. EA=5V
10. falls weiteres Byte, dann zu Schritt 2
Am Ende ist die Anfangsbedingung wieder erreicht. In diesem Zustand darf das IC aus dem Sockel entfernt oder eingesetzt werden. Das Auslesen von Daten erfolgt mit einem ähnlichen Algorithmus, wobei T0=5V in den Auslesemodus schaltet:
1. Anfangsbedingungen: VDD=5V, PROG=5V, EA=5V, Reset=0,
T0=0V, P10=0, P11=0, Taksignal vorhanden
2. T0=5V (Auslesen)
3. EA=18V (Auslesemodus aktivieren)
4. Adresse an DB0...DB7 und P20...P22 anlegen.
5. RESET=5V (Adresse übernehmen)
6. Daten an DB0...DB7 auslesen
7. RESET=0
8. EA=5V
9. falls weiteres Byte, dann zu Schritt 2
Zur Programmierung eines 8748 oder 8749 werden nicht mehr als 16 Portleitungen benötigt. Deshalb genügt ein Erweiterungsbaustein 8243 mit vier 4-Bit-Ports, um alle erforderlichen Signale zu erzeugen. Die Ports 2 und 3 des 8243 bilden den Datenbus. Port 0 stellt die drei höherwertigen Adressleitungen bereit. Alle Steuersignale werden über Port 1 erzeugt. Das Programm 8748.PAS zeigt das Programmierprogramm in Turbo Pascal.
Program 8748-Eprommer; {8748.PAS}
Uses CRT, DOS;
const BA = $378; { LPT1 }
var n: Word;
Ch : Char;
Dateiname : String;
Typ256 : Boolean;
procedure Setzen (Port_Nr,Wert: Byte);
var n: Integer;
begin
Port [BA] := 1; { D0=St=1 }
for n:= 1 to 20 do;
Port [BA+2] := ((Port_Nr AND 3) + 4) XOR 11; { Steuerkommando }
for n:= 1 to 20 do;
Port [BA] := 0; { D0=St=0 }
for n:= 1 to 20 do;
Port [BA+2] := Wert XOR 11; { Datenwort }
for n:= 1 to 20 do;
Port [BA] := 1; { D0=St=1 }
end;
function Lesen (Port_Nr : Byte): Byte;
var n: Integer;
begin
Port [BA] := 1; { D0=St=1 }
for n:= 1 to 20 do;
Port [BA+2] := (Port_Nr AND 3) XOR 11; { Steuerkommando }
for n:= 1 to 20 do;
Port [BA] := 0; { D0=St=0 }
for n:= 1 to 20 do;
Port [BA+2] := 15 XOR 11; { Bus hochohmig }
for n:= 1 to 20 do;
Lesen := (Port[BA+2] AND 15) XOR 11; { Daten lesen }
for n:= 1 to 20 do;
Port [BA] := 1; { D0=St=1 }
end;
Port1: Bit0: T0, Bit1: /Reset, Bit2: EA=5V, Bit3: VDD=5V}
procedure Brennen (Adresse: Word; Wert:Byte);
begin
Setzen (1,$08); { 1000, EA=18V, T0=0 }
Setzen (3,Lo(Adresse) div 16);
Setzen (2,Lo(Adresse) mod 16);
Setzen (0,Hi(Adresse) mod 16);
Setzen (1,$0A); { 1010; /Reset=1, Adresse latchen }
Setzen (3,Wert div 16);
Setzen (2,Wert mod 16);
Setzen (1,$02); { 0010; VDD=21V, Programmierimpuls }
Delay (50);
Setzen (1,$0A); { 1010; VDD=5V, Impulsende }
Setzen (1,$08); { 1000; /Reset=0 }
Setzen (1,$0C); { 1100; EA=5V }
end;
function Auslesen (Adresse: Word): Byte;
begin
Setzen (1,$09); { 1001, EA=18V, T0=1 }
Setzen (3,Lo(Adresse) div 16);
Setzen (2,Lo(Adresse) mod 16);
Setzen (0,Hi(Adresse) mod 16);
Setzen (1,$0B); { 1011; /Reset=1, Adresse latchen }
Auslesen := Lesen(2) + 16 * Lesen(3); { Datenrichtung umschalten }
Auslesen := Lesen(2) + 16 * Lesen(3); { Daten auslesen }
Setzen (1,$09); { 1001; /Reset=1 }
Setzen (1,$0D); { 1101; EA=5V }
end;
procedure Auslesen_Datei;
var f :file of byte;
r,wert :Byte;
Adresse, Anzahl, n : Word;
begin
Writeln ('Anfangsadresse');
readln (Adresse);
writeln ('Anzahl Bytes');
readln (Anzahl);
writeln ('Dateiname');
readln (Dateiname);
Assign(f,dateiname);
{$I-} Rewrite(f); {$I+}
r:=IOResult;
IF r = 0 then begin
Setzen (1,$09); { 1001, EA=18V, T0=1 }
for n:= Adresse to (Adresse+Anzahl-1) do begin
Wert := Auslesen (n);
write (Wert, ' ');
write (f,Wert);
end;
Close(f);
end;
Setzen (1,$0C); { 1100, VDD=5V, EA=5V }
writeln;
writeln ('Auslesen ok!');
writeln;writeln;
end;
procedure Vergleichen;
var f :file of byte;
r,wert, wert2 :Byte;
Adresse, n : Integer;
Fehler : boolean;
begin
Fehler := false;
Writeln ('Anfangsadresse');
readln (Adresse);
writeln ('Dateiname');
readln (Dateiname);
Assign(f,dateiname);
{$I-} Reset(f); {$I+}
r:=IOResult;
if r = 0 then begin
Setzen (1,$09); { 1001, EA=18V, T0=1 }
for n:= 1 to filesize (f) do begin
wert := Auslesen (Adresse+n-1);
write (wert, ' ');
read(f,wert2);
if wert <> wert2 then Fehler := true;
end;
Close(f);
end;
Setzen (1,$0C); { 1100, VDD=5V, EA=5V }
writeln;
if Fehler then writeln ('Fehler gefunden')
else writeln ('Programmierung erfolgreich!');
repeat until KeyPressed;
end;
procedure Programmieren;
VAR f :file of byte;
code :Char;
r,wert :Byte;
Adresse, n : Word;
begin
Writeln ('Anfangsadresse');
readln (Adresse);
writeln ('Dateiname');
readln (Dateiname);
Assign(f,dateiname);
{$I-} Reset(f); {$I+}
r:=IOResult;
IF r = 0 then begin
Setzen (1,$0C); { 1100, VDD=5V, EA=5V }
for n:= 1 to filesize (f) do begin
Read(f,wert);
Brennen (Adresse+n-1,Wert);
write (wert,' ');
end;
Close(f);
end;
Setzen (1,$0C); { 1100, VDD=5V, EA=5V }
writeln; writeln;
end;
begin
Setzen (1,$0C); { 1100, VDD=5V, EA=5V }
repeat
clrscr;
writeln ('8748-Programmierer');
writeln ('Bitte jetzt das IC einsetzen');
writeln ('<S>reiben <L>esen <V>ergleichen <Q>uitt');
readln (ch);
Ch := upcase (Ch);
if ch = 'S' then programmieren;
if Ch = 'V' then vergleichen;
if Ch = 'L' then Auslesen_Datei;
until Ch = 'Q';
end.