'------------------------------------------------- ' ' EPROM Simulator ' Conitec PEPS I ' ' Version 1.0 Zielplatform ATMEGA8 ' ' Intel-Hex File werden über RS232 entgegengenommen ' - RS232 9600 Bd mit RTS Handshake ' - Zeilenbuffer für 80 Zeichen ' ' Entwickelt aus PEPSLDR.ASM (C)Conitec ' 2014 Werner Römer [werner.roemer@t-online.de] ' ' letzte Änderung ' 15.04.2014 Treiber IC7 durch 74HC541 ersetzt (nichtinvertierend) ' Routine zum Füllen mit FFh hizugefügt (2732) ' Bildschirmmeldungen verbessert ' ' 12.04.2014 Auf Zielhardware mit Mega8 angepasst ' 11.04.2014 Datenübergabe an PEPS ohne Buffer ' Es wird nur der tatsächliche Speicherbereich befüllt ' in den Zellen bis EPROM Ende sind nur Zufallswerte ! ' Benutzerführung auf Hyperterminal ausgerichtet ' mit der Eingabe der Ziffern 0 - 3 werden die gewünschten EPROMS eingestellt ' zusätzlich sind die ensprechenden Brücken auf PEPS zu legen ' vorbesetzt ist das 2732 Standard-EPROM im Moppel ' mit (i) wird die Übertragung eingeleitet !Kein Return drücken! ' sobald das Intel-Hex File ausgewählt wurde startet dann die Übertragung ' ' - hier ist noch ein deutlicher Verbesserungsbedarf ' - LED und LCD Ansteuerungen fliegen im Atmega8 raus ' ' 10.04.2014 Datenübergabe nach Peps-Routine OK - am EPROM kommt noch nichts an ?? ' 28.03.2014 V24 jetzt OK / Datenübergabe nach PEPS noch nicht OK ' 23.03.2014 V24 ohne Handshake,Menü OK ' '------------------------------------------------- ' ' Fuses: ' ' HIGH: 0xD9 ' LOW: 0xFF ' LOCKBIT: 0xFF ' '------------------------------------------------- ' ' ' $regfile = "m8def.dat" ' Zielsystem $crystal = 12288000 $hwstack = 40 $swstack = 16 $framesize = 32 ' Für Simularor einschalten ' $sim '------------------------------------------------- ' ' LED Config Portb.2 = Output ' LED rot Led_rt Alias Portb.2 Set Led_rt ' '------------------------------------------------- ' RS232 mit 80 Zeichen Eingangsbuffer ' 40 Zeichen Ausgabebuffer ' ' Handshake RTS/CTS ' 4800 Bd ' ' V2.0.7.3 BUG im Handshake RTS wird Threshold_emty nicht mehr zurückgesetzt ' Fehler in Clear Serialin bzw Thereshold_emty ' ' Umgehungslösung RTS nach Clear Serialin von "Hand" zurücksetzen ' Sub Clear_in_data ' Config Portd.2 = Output ' Port für RTS ' Rts_1 Alias Portd.2 ' Hilfskontsrukt um den Datenfluss zu steuern Set Rts_1 ' Reset Rts_1 ' ' ' Sobald CR(13) im Buffer steht, wird die ISR aufgerufen sowie RTS gesetzt ' Freigabe (Reset RTS) erst wenn die Zeile abgearbeitet ist, siehe Umgehungslösung ' $baud = 9600 Config Serialin = Buffered , Size = 80 , Bytematch = 13 'Config Serialout = Buffered , Size = 40 Dim Serin_dat As String * 80 ' Puffer für Interpreter Declare Sub Serial0charmatch() ' ISR für Buffer wird bei CR angesprungen (siehe Bytematch) Declare Sub Clear_in_data ' Buffer und RTS löschen ' '---------------------------------------------------- ' Intel-Hex Interpreter ' Declare Sub Hex_read Dim Datei_ende As Bit ' Flag Ende Intel_hex Dim Tmp_str As String * 1 ' 1Byte für ASCII ":" Startwert Zeile Dim Tmp_str_2 As String * 2 ' 2Byte für ASCII -> HEX Wandlung Dim Dat As Byte ' HEX Wert Dim Laenge_dat As Byte ' Länge der Intel-Hex "Zeile" Dim Adresse As Word ' EPROM Adresse (wird nur für die 1. Zeile ausgewertet) Dim Adr_hilo(2) As Byte At Adresse Overlay ' Startadresse PEPS Dim Peps_dat(16) As Byte ' Datenpuffer PEPS als Array Dim Peps_str As String * 16 Dim Hex_typ As Byte ' Intel-Hex Type (00) Dim Pruefsum As Byte ' Intel-Hex Prüfsumme Dim Byte_zaehler As Byte ' Zähler für Datenbyte Dim Str_pos As Byte ' Stringposition für Umwandlung Dim Str_laeng As Byte ' Stringlänge ' '---------------------------------------------------- ' ' PEPS-Schnittstelle ' ' m0 m1 clk Daten ' ' 0 0 _-_ Modus 0 Adresse einstellen ' 1 0 _-_ Modus 1 Daten schieben ' 0 1 _-_ Modus 2 Daten schreiben ' 1 1 Modus 3 EPROM Simulieren ' ' Config Portd.4 = Output ' M0 Config Portd.5 = Output ' M1 Config Portd.6 = Output ' CLK Config Portd.7 = Output ' Daten ' Dim Laenge_prom As Word ' je nach EPROM-Typ Dim Adresse_peps As Word ' Startadresse Peps (EPROM) Dim Daten As Byte Dim Tmpdat As Byte Dim Bitzaehler As Byte ' Declare Sub Pepsinit Declare Sub Peps_clear Declare Sub Peps_out Declare Sub Lpeps Declare Sub Wrbyte ' '---------------------------------------------------- ' ' Menü-Steuerung ' Dim Eingabe As Byte Dim Err_code As Byte Declare Sub Main Declare Sub Simulation Declare Sub Hilfe Declare Sub Fehler '==================================================== ' ' Hauptprogramm ' Reset Led_rt ' Startmeldung per LED Waitms 1000 Set Led_rt Serin_dat = "" Call Peps_clear Laenge_prom = &H0FFF ' 2732 als Voreinstellung Call Hilfe ' Menü ausgeben Enable Interrupts Do Eingabe = Waitkey() Lcd Eingabe Select Case Eingabe Case "0" Laenge_prom = &H07FF ' EPROM auswahl Print "2716" Case "1" Laenge_prom = &H0FFF Print "2732" Case "2" Laenge_prom = &H1FFF Print "2764" Case "3" Laenge_prom = &H3FFF Print "27128" Case "i" Print "Datenuebertragung starten" ' Intel-Hex lesen Datei_ende = 0 Call Main Case "?" ' Bedienungshilfe Call Hilfe End Select Loop '==================================================== ' ' Hilfe Menü ausgeben ' Sub Hilfe Print "=====================================" Print " PEPS-EPROM Simulator" Print " V1.0 (C)Roemer 04.2014" Print "=====================================" Print "" Print " Z8 Z9 J2 J3" Print " 0 = 2716 6116 leer - A,D" Print " >1 = 2732 6116 6116 - A,C" Print " 2 = 2764 6264 leer offen B,D" Print " 3 = 27128 6264 6264 offen B,D" Print "" Print " 2732 als Standard" Print "" Print " I = Intel-Hex einlesen" Print "" Print "=====================================" Print "" End Sub '---------------------------------------------------- ' ' Fehler Text ausgeben ' Sub Fehler Print "=====================================" Print "" Print " ! Fehler " ; Err_code Print "" Print " Code 1 = kein Intel-Hex File " Print " Code 2 = Pruefsumme falsch " Print "-------------------------------------" Print " zurueck mit (X) " Print "=====================================" Do Eingabe = Waitkey() Loop Until Eingabe = "X" Err_code = 0 ' Startwerte setzen Serin_dat = "" Call Hilfe End Sub ' ' '==================================================== ' ' Intel-Hex File über RS232 entgegennehmen ' und ins "EPROM" schreiben ' ' ! derzeit ohne Offset, Daten immer ab Adresse 0000h einschreiben ' Sub Main Do Loop Until Ischarwaiting() = 1 Print "" Print "bitte warten ..." Print "" Reset Led_rt Call Pepsinit ' Peps Adresse auf 0000h Set Led_rt ' Adresse_peps = 0 ' Do If Serin_dat <> "" Then Disable Interrupts Waitms 10 Err_code = 0 ' Startwerte setzen Str_pos = 1 Str_laeng = 1 Hex_typ = 0 Call Hex_read ' n.Zeile holen Call Clear_in_data Laenge_prom = Laenge_prom - &H10 ' Notbremse wenn EOF fehlt If Laenge_prom = 0 Then Datei_ende = 1 Print "Ende mit Notbremse" End If If Err_code > 0 Then Datei_ende = 1 Print "Fehler" End If Toggle Led_rt Enable Interrupts End If Loop Until Datei_ende = 1 Call Pepsinit Print "" Print "Ende (EOF)" ' Modus 3 EPROM simulieren Print " - EPROM wird nun simuliert" Print "" Call Hilfe End Sub ' '---------------------------------------------------- ' Eine Zeile Intel-Hex Daten aus RS232 Buffer lesen ' (Interuppt-Service-Routine) ' ' interpretieren und ' in PEPS-Buffer legen ' ' eine Intel-Hex Zeile in 8Bit Systemen ' ' I Daten für Prüfsumme addieren inkl Prüfsumme = 0 I ' I I ' : 10 2010 00 66 20 C3 88 23 C3 3B 24 D3 4B C9 1A D3 4B 13 C9 AF 0D 0A ' I I I I I I I I ' I I I I 1.Byte I I Line-Feed ' I I I I I I ' I I I Typ 00=Nutzdaten I CR ' I I I 01=Ende der Inte-Hex datei (EOF) I ' I I I Prüfsumme ' I I Startadresse ' I I ' I Anzahl Bytes ' I ' Startmarke ' ' Sub Hex_read ' Startmarke ":" holen Tmp_str = Mid(serin_dat , Str_pos , Str_laeng) If Tmp_str <> ":" Then Err_code = 1 End If ' Laenge holen Str_pos = Str_pos + 1 ' 2. Wert laden Adresse Highbyte Str_laeng = Str_laeng + 1 ' Tmp_str_2 = Mid(serin_dat , Str_pos , Str_laeng) Laenge_dat = Hexval(tmp_str_2) Pruefsum = Pruefsum + Laenge_dat ' Adresse holen Str_pos = Str_pos + 2 Tmp_str_2 = Mid(serin_dat , Str_pos , Str_laeng) ' HighByte Dat = Hexval(tmp_str_2) Pruefsum = Pruefsum + Dat Adr_hilo(2) = Dat Str_pos = Str_pos + 2 ' LowByte Tmp_str_2 = Mid(serin_dat , Str_pos , Str_laeng) Dat = Hexval(tmp_str_2) Pruefsum = Pruefsum + Dat Adr_hilo(1) = Dat ' Type holen Str_pos = Str_pos + 2 ' LowByte Tmp_str_2 = Mid(serin_dat , Str_pos , Str_laeng) Hex_typ = Hexval(tmp_str_2) Pruefsum = Pruefsum + Hex_typ If Hex_typ = 1 Then Datei_ende = 1 ' test auf EOF End If ' Daten holen Str_pos = 10 Str_laeng = 2 Byte_zaehler = 1 Do Tmp_str_2 = Mid(serin_dat , Str_pos , Str_laeng) Dat = Hexval(tmp_str_2) Daten = Dat Call Wrbyte Tmpdat = &B01000000 ' Modus 0 Call Peps_out Tmpdat = &B00000000 ' Modus 0 Call Peps_out Pruefsum = Pruefsum + Dat Str_pos = Str_pos + 2 Laenge_dat = Laenge_dat - 1 Byte_zaehler = Byte_zaehler + 1 Loop Until Laenge_dat = 0 ' Prüfsumme holen Tmp_str_2 = Mid(serin_dat , Str_pos , Str_laeng) Dat = Hexval(tmp_str_2) Pruefsum = Pruefsum + Dat If Pruefsum <> 0 Then Err_code = 2 End If End Sub '==================================================== ' ' Unterprogramme für die PEPS Schnittstelle ' ' ' Peps_out = Daten auf Port ausgeben ' ' Variable: ' Tmpdat = Zwischenspeicher ' ' Portmaske: ' Bit 7 6 5 4 ' I I I I ' I I I M0 ' I I I ' I I M1 ' I I ' I Clk ' I ' Datenbit ' ' Pepsinit = Initisalisierung (Modus 3 und Startadresse = 0000h) ' ' Variable: 00 ' Tmpdat = Zwischenspeicher ' ' Peps_clear = PEPS mit FFh füllen ' ' Varable: Laenge_prom ' Sub Pepsinit Tmpdat = &B01110000 ' Modus 3 einstellen ' Call Peps_out Tmpdat = &B00110000 ' Modus 3 einstellen ' Call Peps_out End Sub Sub Peps_clear Print " bitte warten ..." Print " PEPS initialisieren (FFh fuellen)" Print "" Do Daten = &HFF Call Wrbyte ' Ein Byte schreiben Tmpdat = &B01000000 ' Modus 0 Call Peps_out Tmpdat = &B00000000 ' Modus 0 Call Peps_out Laenge_prom = Laenge_prom - 1 Loop Until Laenge_prom = 0 Laenge_prom = &H0FFF Tmpdat = &B01110000 ' Modus 3 einstellen ' Call Peps_out Tmpdat = &B00110000 ' Modus 3 einstellen ' Call Peps_out Print "" End Sub ' ' Sub Peps_out Portd = Tmpdat ' eingestellten Modus ausgeben End Sub ' '---------------------------------------------------- ' ' Wrbyte = Ein Byte an PEPS übergeben ' ' Variable: ' Daten = Byte -> PEPS ' Tmpdat = Zwischenspeicher wegen Bitweise Übertragung ' Bitzaehler = Zähler für die Übertragung Sub Wrbyte Bitzaehler = 8 ' ' Treiber IC7 durch 74HC541 ersetzt (nichtinvertierend) ' Daten = Not Daten ' wegen Negation am Datentreiber Reset Led_rt Do Tmpdat = Daten Tmpdat = Tmpdat And &B10000000 ' alles außer Daten ausblenden Tmpdat = Tmpdat Or &B00010000 ' Modus 1 einblenden Call Peps_out Tmpdat = Tmpdat Or &B01010000 ' Modus 1 einblenden Call Peps_out Tmpdat = Tmpdat And &B10010000 Call Peps_out Bitzaehler = Bitzaehler - 1 Rotate Daten , Left ' nächstes Bit in MSB Toggle Led_rt Loop Until Bitzaehler = 0 Tmpdat = &B01100000 ' Modus 2 (Byte schreiben) Call Peps_out Tmpdat = &B00100000 Call Peps_out End Sub ' '==================================================== ' ' RS232 Eingangsbuffer löschen ' und RTS zurücksetzen ' Sub Clear_in_data Clear Serialin Reset Rts_1 Serin_dat = "" End Sub '---------------------------------------------------- ' Interruppt Service Routine RS232 Sub Serial0charmatch() 'Daten vom Buffer auslesen Serin_dat = "" Input Serin_dat Noecho Set Rts_1 End Sub ' End 'end program