Hallo, ich habe eine Schaltung mit einem 6502 und einem 28C256 EEPROM sowie einen XILINX 9572 PLD (als Adress-Decoder u.A.). Nun ist es so, das EEPROM wird nur zur Hälfte benutzt, also 16K. (A14 auf HIGH) Diese 16K sind im Bereich $C000 - $FFFF eingeblendet und schreibgeschützt. Nur die Adresse $CFFF wird vom PLD zum lesen UND schreiben freigegeben. Leider ist es nun so, daß wenn ich einen Wert nach $CFFF schreibe, das EEPROM diesen nicht übernimmt. Ich habe WE an das PLD angeschlossen, CE ist auf LOW und OE ist mit einem Adressdecoder zwischen $C000-$FFFF verbunden. Weiss jemand, warum man das EEPROM nicht beschreiben kann? Gruß, Wolfram.
:
Bearbeitet durch User
Wolfram F. schrieb: > Ich habe WE an das PLD angeschlossen, CE ist auf LOW und OE ist mit > einem Adressdecoder zwischen $C000-$FFFF verbunden. Das ist nicht gut. CE sollte durch den Adressdecoder decodiert werden und OE sollte während des Schreibvorgangs (wahrscheinlich) high sein. Beim Read-Vorgang ist OE dann low. Um welches EEPROM handelt es sich denn? Schon mal ins Datenblatt geschaut? Kann das überhaupt 1-Byte-Write-Cycles?
Wolfram F. schrieb: > Leider ist es nun so, daß wenn ich einen Wert nach $CFFF schreibe, das > EEPROM diesen nicht übernimmt. Also das EEPROM übernimmt den Wert falls die Adresse korrekt ist, kein Schreibschutz aktiv und du WE und OE und evt. CE korrekt bedienst. Das meiste davon kann man leicht prüfen. Schreibschutz gibt es bei den 28C diverse. Software und Hardware. Den SW Schreibschutz kann man per bestimmter Ansteuersequenz an und ausschalten. Mal ins DB geschaut?
:
Bearbeitet durch User
OE soll High sein! Software Data Protection nicht enabled? Siehe: https://ww1.microchip.com/downloads/en/DeviceDoc/doc0006.pdf
danke für die schnellen Tips! hmm, nein, OE geht nicht auf HI wenn WE auf LO geht. Das muss ich mal probieren! So wie ich es verstanden habe, programmiert das EEPROM immer eine Page von 64Bytes. Es handelt sich um ein XICOR X28C256 https://www.google.com/url?sa=t&source=web&rct=j&opi=89978449&url=https://www.jameco.com/Jameco/Products/ProdDS/74878XICOR.pdf%3Fsrsltid%3DAfmBOoqB44h2hTA29lh08-qeth62WWYosiB08fctSlMNsnVbksGcawiX&ved=2ahUKEwj6he_Msa-LAxWsRvEDHVucKtcQFnoECBQQAQ&usg=AOvVaw3WsX0HiY7slRfH-qY-QuE9 bedeutet das, daß ich selber 64 Bytes schreiben muss oder das das EEPROM auch bei nur 1 Byte seine 64 Bytes schreibt?
:
Bearbeitet durch User
Wolfram F. schrieb: > bedeutet das, daß ich selber 64 Bytes schreiben muss oder das das EEPROM > auch bei nur 1 Byte seine 64 Bytes schreibt? Page Write ist Optional. Bis 64 Byte. man kann auch einfach byte weise schreiben. Aber OE muss high sein!
Beitrag #7824740 wurde vom Autor gelöscht.
Die Datenpins sind doch bidirektional. Wenn Du Output Enable aktiviert lässt beim Schreiben, treiben das EEPROM und die CPU die Leitungen. Das kann nicht gesund sein. Bestensfalls schreibst Du dann einfach wieder den alten Wert, wenn das EEPROM gewinnt.
Das verlinkte Datenblatt ist eindeutig: Write operations are initiated when both CE and WE are LOW and OE is HIGH.
ok. Blöd nur, daß ich keinen weiteren Pin am PLD mehr frei habe, aber mit nem Gatter könnte man bei WE=LOW OE=HI erledigen. Software-Schreibschutz ist laut GALEP deaktiviert.
Wolfram F. schrieb: > bedeutet das, daß ich selber 64 Bytes schreiben muss oder das das EEPROM > auch bei nur 1 Byte seine 64 Bytes schreibt? So wie auch das Original scheint deiner auch Byte- und Page-Write zu können. Schau dir mal die Seite 14/15 in dem von dir verlinkten Datenblatt an...
12V zum Schreiben angelegt? Die 28er wollen 12V Schreibspannung, ähnlich wie ein EPROM. Erst die 29er können lesen und schreiben mit 5V
Gerald B. schrieb: > 12V zum Schreiben angelegt? Die 28er wollen 12V Schreibspannung, ähnlich > wie ein EPROM. Erst die 29er können lesen und schreiben mit 5V Nein. Weder der verlinkte Baustein noch ein normaler AT28CXXX brauchen das.
:
Bearbeitet durch User
Hm, ist zwar schon über 20 Jahre her, aber ich hatte mal ein EEPROM, da war es exakt so. Weiß nicht mehr den Hersteller und genauen Typ. Könnte Intel oder Winbond gewesen sein.
Gerald B. schrieb: > Hm, ist zwar schon über 20 Jahre her, aber ich hatte mal ein EEPROM, da > war es exakt so. nur für Chip Erase sin 12V notwendig
Gerald B. schrieb: > Hm, ist zwar schon über 20 Jahre her, aber ich hatte mal ein EEPROM, da > war es exakt so. Ach so, na dann kann natürlich ganz selbstverständlich so eine totale Falschinfo raushauen. Sorry mein Fehler. Thomas Z. schrieb: > nur für Chip Erase sin 12V notwendig Auch nicht. Aus welcher Zeit sind eure Infos? Geschichten aus der Gruft. Aber tröstet euch, die ATC28 bieten einen ID Bereich an, wenn man 12V anlegt.
:
Bearbeitet durch User
Wolfram F. schrieb: > Leider ist es nun so, daß wenn ich einen Wert nach $CFFF schreibe, das > EEPROM diesen nicht übernimmt. Ein EEPROM ist kein RAM. Wolfram F. schrieb: > Ich habe WE an das PLD angeschlossen, CE ist auf LOW und OE ist mit > einem Adressdecoder zwischen $C000-$FFFF verbunden. Du aktivierst WE und OE gleichzeitig beim Zugriff auf $CFFF ? Warum kann das wohl nicht funktionieren ? Fang nochmal von vorne an: Timing, Betriebsspannung und Aktivierung im Datenblatt von genau deinem Chip nachlesen.
Cyblord -. schrieb: > Thomas Z. schrieb: >> nur für Chip Erase sin 12V notwendig > > Auch nicht. siehe Beitrag "Re: 28C256 programmieren" gerade noch mal bei Microchip überprüft. Da steht eindeutig VH = 12V bei Chip Erase Cyblord -. schrieb: > Warum liest du das von dir verlinkte Datenblatt nicht einfach mal?
:
Bearbeitet durch User
Das gilt anscheinend für den Microchip AT28C256. Im Datenblatt von Xicor gibt es keinen Chip-Erase. Die Adresse oben geht auch kürzer: https://www.jameco.com/Jameco/Products/ProdDS/74878XICOR.pdf
Christoph db1uq K. schrieb: > Das gilt anscheinend für den Microchip AT28C256. Korrekt. > Im Datenblatt von Xicor > gibt es keinen Chip-Erase. Die Adresse oben geht auch kürzer: > https://www.jameco.com/Jameco/Products/ProdDS/74878XICOR.pdf Ja da gibts nichts mit 12V. Und Chip Erase ist auch gar nicht das Problem des TE sondern normales Schreiben.
war ein langer Tag, daher bin ich grade etwas verwirrt... ist die Logik so richtig? /EEPROM_OE = /OE * WE
EDIT: CE muss in dem Falle ja ans OE Signal, damits auch beim schreiben richtig adressiert wird...
Wolfram F. schrieb: > ist die Logik > so richtig? Nimm dir einen Zettel und mal dir eine Wahrheitstabelle. Warum so kompliziert? Du brauchst nur einen Inverter, der das WE-Signal invertiert an OE gibt und CE steuerst du direkt. Verinnerliche dir einfach mal die drei Pin-Namen, dann erklärt sich die Funktion von alleine.
:
Bearbeitet durch User
Hui, ja stimmt! Manchmal programmiert man einfach zu kompliziert ums eigentliche herum... Danke Dir, das ist natürlich ne super-einfache Lösung! Bin gespannt, obs dann funktioniert.
also ich muss leider berichten, daß das beschreiben nicht funktioniert. Ich habe einen Transistor, der mit dem WE Signal angesteuert wird und wenn WE HI ist, OE auf LO zieht und andersrum. Die Schaltung selber funktioniert (mit LEDs an WE und OE zur Sicherheit getestet) in meinem PLD ist als Dekoder folgendes:
1 | if (adr = x"CF00") and rw = '0' then |
2 | ee_rw <= '0'; |
3 | else
|
4 | ee_rw <= '1'; |
5 | end if; |
oder auch:
1 | if (adr = x"CF00") and rw = '0' then |
2 | ee_rw <= rw; |
3 | else
|
4 | ee_rw <= '1'; |
5 | end if; |
wenn ich nun CF00 mit 55 beschreibe und es danach auslese, ist der alte Inhalt (77) drin. Ebenso keine Änderung wenn ich
1 | 600: LDA #$55 |
2 | STA CF00 |
3 | JMP 600 |
als mini-assembler-routine es beschreiben lasse. Die WE LED leuchtet, wenn die Dauerschleife läuft. Im GALEP habe ich nochmals geprüft, ob evt. ein Softwareschutz aktiv ist, ist deaktiviert. Hat jemand noch ne Idee?
Wolfram F. schrieb: > lso ich muss leider berichten, daß das beschreiben nicht funktioniert. > > Ich habe einen Transistor, der mit dem WE Signal angesteuert wird und > wenn WE HI ist, OE auf LO zieht und andersrum. Ich sehe keinen Schaltplan der alle 3 Signale zeigt. Dir ist schon klar dass nach einem Schreibvorgang warten musst oder per data polling das Ende abwarten musst. Da du in einer Dauerloop schreibst aktivierst do page write willst du das? Aus dem Datenblatt:
1 | Write |
2 | Write operations are initiated when both CE and WE are |
3 | LOW and OE is HIGH. The X28C256 supports both a CE |
4 | and WE controlled write cycle. That is, the address is |
5 | latched by the falling edge of either CE or WE, whichever |
6 | occurs last. Similarly, the data is latched internally by the |
7 | rising edge of either CE or WE, whichever occurs first. |
8 | A byte write operation, once initiated, will automatically |
9 | continue to completion, typically within 5ms" |
Datenblatt lesen hilft
:
Bearbeitet durch User
Gerald B. schrieb: > 12V zum Schreiben angelegt? Dann macht es kurz mal Puff und der Deckel hebt ab. Im Datenblatt steht doch eindeutig: "Voltage on any Pin with Respect to VSS: –1V to +7V"
Wolfram F. schrieb: > Im GALEP habe ich nochmals geprüft, ob evt. ein Softwareschutz aktiv > ist, ist deaktiviert. Der Galep kann nicht hellsehen. Er kann bestenfalls die 6 Bytes zum Deaktivieren schreiben. Der aktive Softwareschutz kann nur indirekt durch einen Schreibversuch festgestellt werden, d.h. der EEPROM Inhalt wird geändert oder nicht. Ohne explizites Kommando macht kein Programmiergerät einen Schreibzugriff von sich aus.
Wolfram F. schrieb: > Ich habe einen Transistor, der mit dem WE Signal angesteuert wird und > wenn WE HI ist, OE auf LO zieht und andersrum. Das kann nicht funktionieren. /OE muß um die t_OES vor /WE = low auf high gehen.
Thomas Z. schrieb: > Wolfram F. schrieb: >> lso ich muss leider berichten, daß das beschreiben nicht funktioniert. >> >> Ich habe einen Transistor, der mit dem WE Signal angesteuert wird und >> wenn WE HI ist, OE auf LO zieht und andersrum. > > Ich sehe keinen Schaltplan der alle 3 Signale zeigt. > Dir ist schon klar dass nach einem Schreibvorgang warten musst oder per > data polling das Ende abwarten musst. Da du in einer Dauerloop schreibst > aktivierst do page write willst du das? > > Aus dem Datenblatt: >
1 | > Write |
2 | > Write operations are initiated when both CE and WE are |
3 | > LOW and OE is HIGH. The X28C256 supports both a CE |
4 | > and WE controlled write cycle. That is, the address is |
5 | > latched by the falling edge of either CE or WE, whichever |
6 | > occurs last. Similarly, the data is latched internally by the |
7 | > rising edge of either CE or WE, whichever occurs first. |
8 | > A byte write operation, once initiated, will automatically |
9 | > continue to completion, typically within 5ms" |
10 | > |
> > Datenblatt lesen hilft wie ich schon geschrieben hatte, hab ich es auch mit nur 1 Byte schreiben versucht, die Schleife war nur ein weiterer Test. Schaltplan? Dafür brauch man keinen Schaltplan... 4k7 von BC546 Basis an WE, 4k7 vom BC546 Collector nach +5V, BC546 Emitter an GND. OE an Collector BC546 (invertiertes WE) WE an PLD (nur LOW, wenn RW=LOW und Adresse = CF00) CE an Adressdecoder (nur LOW, wenn Adresse C000-FFFF) Leider kann ich in der vorhandenen Schaltung nicht folgende Schritte ausführen da ich nicht auf alle Adressen des EEPROMs zugreifen kann: load data AA to address 5555 load data 55 to address 2AAA load data 80 to address 5555 load data AA to address 5555 load data 55 to address 2AAA load data 20 to address 5555 load data XX to any address load last byte to last address um SDP zu deaktivieren, muss wohl mit nem Arduino was basteln um das zu beschreiben. Obwohl, eigentlich sollte das der Galep können. Im Galep kann ich den 28C256 ohne jeglche Probleme programmieren. Ob 1 Byte oder 32K.
Einfach systematisch prüfen. Adresse anlegen -> am EEPROM messen ob Adresse anliegt. Daten anlegen -> am EEPROM messen ob Daten korrekt anliegen Steuerleitungen einzeln einschalten -> prüfen ob die korrekt am EEPROM anliegen. Wolfram F. schrieb: > Schaltplan? Dafür brauch man keinen Schaltplan... ja weißt du, wenn die Schaltung ok ist und die SW ok ist, dann muss es ja funktionieren. D.h. wenn es dann doch nicht funktioniert dann bildest du dir vielleicht nur ein dass es nicht funktioniert, weil es zwingend funktionieren muss.
:
Bearbeitet durch User
bis auf das Schreiben geht ja alles. Im EEPROM ist ein Betriebssystem welches auch läuft. Es ist ein alter Atari 8Bit Computer in dem das ganze läuft. In dem Betriebssystem ist bei CF00-CFFF noch unbenutzter Platz frei und es befindet sich auch ein kleiner Maschinensprache-Monitor drin, mit dem ich alle Adressen anschauen und verändern kann, zusätzlich ist auch noch ein Mini-Assembler drin. Die Grundlegenden Funktionen wie Daten, richtige Adressen und richtiges CE/OE/WE verwenden sind also vorhanden und funktionieren. Zusätzlich habe ich eine weitere kleine Hardware dran, mit der ich auf 7Segment-Anzeigen eine ausgewählte Adresse in Echtzeit überwachen kann. Daran kann ich auch sehen, daß Schreibzugriffe auf CF00 auch geschrieben werden. Beim erneuten lesen jedoch ist der alte Wert vorhanden. Also muss es rein mit dem EEPROM sein. EDIT: Das mit ner Wartepause nach dem Schreiben von 1Byte hatte ich bereits auch probiert... Fraglich ist nur, muss während des Wartens WE LOW bleiben oder wieder HIGH sein? Ich probiere mal einen anderen Chip.. wer weiss...
:
Bearbeitet durch User
Hast du keinen Logicanalyzer mit dem du die relevanten Teile des Bus beobachten kannst? Falls nicht, unbedingt besorgen und weniger Lebenszeit verschwenden.
Wolfram F. schrieb: > ja hab daran auch schon gedacht... > werde den nachher mal anklemmen.. Interessant dass man diese offensichtliche Option erst wählt, nach dem man wochenlang in Foren gepostet hast. Sollte das nicht einer der ersten Schritte sein?
Wolfram F. schrieb: > richtiges > CE/OE/WE verwenden sind also vorhanden und funktionieren. Eben nicht! Schau nochmal ins Datenblatt. "WE Controlled Write Cycle": /CE darf dauerhaft auf low bleiben, aber /OE muß t_OES vor /WE umschalten! Wolfram F. schrieb: > EDIT: Das mit ner Wartepause nach dem Schreiben von 1Byte hatte ich > bereits auch probiert... Nicht nur probieren, muß sein! Wolfram F. schrieb: > Fraglich ist nur, muss während des Wartens WE LOW bleiben oder wieder > HIGH sein? Siehe "Figure 2. DATA Polling Bus Sequence" oder "Figure 4. Toggle Bit Bus Sequence" /WE muß dabei high sein! Und ohne eine dieser Sequenzen, minimal t_BLC warten!
:
Bearbeitet durch User
Wolfram F. schrieb: > Fraglich ist nur, muss während des Wartens WE LOW bleiben oder wieder > HIGH sein? was für eine Frage.... Nach deiner Aussage ist !WE ein invertiertes !OE. Wenn du also liest ist OE automatisch 0 und WE 1-> data polling > Schaltplan? Dafür brauch man keinen Schaltplan... nö Schalpläne werden überbewertet, die braucht kein Mensch solange das funktioniert. Ich würde das so wie im Anhang machen dann gehen auch die Sonderkommandos.
also ich habe eben den LA angeklemmt und herausgefunden, das bei WE=0 OE immer 0 bleibt! dies passiert aber NUR im laufenden Rechner! Wenn ich WE von Hand auf LO lege, wird OE HI. (Und das EEPROM teilweise mit Schrott beschrieben...) Dann scheint die TransistorSchaltung wohl zu langsam zu sein. Muss wohl nen richtigen Inverter nehmen! Bzw. die 139er Schaltung! (danke dafür!)
:
Bearbeitet durch User
Wolfram F. schrieb: > Bzw. die 139er Schaltung! (danke dafür!) ich hab für solche Zwecke immer ein paar 139er in der Bastelkiste, ein passend beschalteter 138er geht natürlich auch. Ein Fallstrick gibt es noch: Eventuell ist das EEprom nach dem Schreiben nicht ansprechbar bis der Write Zyklus abgeschlossen ist. Dann musst du die Schreibroutine ins Ram kopieren und vom Ram starten. Das ist z.B. bei Flashs oft notwendig.
:
Bearbeitet durch User
ja hab auch etliche 139,138 und eigentlich alles ab 7400 da. Das mit deiner Schaltung hat nun geklappt! :-) Da noch IRQs im Hintergrund laufen, stürzt der beim direkten Schreiben ab, das geht aber in dem man für die Schreibzeit die IRQs/NMIs deaktiviert. Aber die Schreibroutine kommt später sowieso in Ram, also kein Problem! Super! Nur schade, daß ich absolut keinen IO am PLD mehr frei habe, sonst hätte man auf den externen 74139 verzichten können... Werde noch ne Routine zum testen schreiben, die alle 1Sek. den Wert erhöht und vergleicht, wenn das 24h erfolgreich läuft, braucht man wohl die o.g. Pause OE->HI bevor WE->LOW nicht. Ich hatte in den 90ern bereits mal ne 6502 Schaltung mit 28C256 EEPROM gesehen, da war das WE einfach nur an R/W dran, finde das aber nicht mehr. (Warum der Transistor das nicht schnell genug invertierte, ist mir ein Rätsel.. ein BC547 sollte das doch locker schaffen.) Allen sehr vielen Dank für die Tips und Hilfen!
:
Bearbeitet durch User
Wolfram F. schrieb: > (Warum der Transistor das nicht schnell genug invertierte, ist mir ein > Rätsel.. ein BC547 sollte das doch locker schaffen.) Hast du mal die Kurvenform mit Oszi angesehen? Bei 4k7 an Basis und Kollektor könnte es je nach Kapazität durchaus sein, dass das zu langsam wird. Dann könnten kleinere Widerstände helfen ... Aber du hast jetzt ja eh schon eine funktionierende Schaltung, daher wäre das höchstens noch aus reinem Forscherdrang relevant.
nein, habe z.z. kein Oszi mehr. Für die Platine wäre es nur toll gewesen, nur einen Transistor zusätzlich zu benutzen. Aber ein 74LS139 im SO8 passt da auch noch. Vielleicht gelingt es mir ja doch noch, irgendwie einen freien IO im PLD herzuzaubern.. dann könnte die Logik aus extern verschwinden.
So, endlich funktioniert das Beschreiben des EEPROMs richtig! Ich hatte bislang noch das Problem, das der Rechner nach/während des schreibens abgestürzt ist. eine kleine Routine hat dazu beigetragen, daß es nun reibungslos funktioniert:
1 | write_eeprom: LDA Latch_final Lese Wert aus RAM |
2 | STA $CFFF Schreibe ins EEPROM |
3 | loop: LDA $CFFF Lese vom EEPROM |
4 | CMP Latch_final Vergleiche mit RAM |
5 | BNE loop solange wiederholen... |
6 | RTS ... bis der Wert stimmt. |
Damit hat das EEPROM dann seinen internen Programmierauftrag abgeschlossen. Also wie weiter oben schon beschrieben MUSS man tatsächlich solange warten, bis der Wert stimmt (bzw. D7 signalisiert das auch) Gruß, Wolfram.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.