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?
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?
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?
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.
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.
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")andrw='0'then
2
ee_rw<='0';
3
else
4
ee_rw<='1';
5
endif;
oder auch:
1
if(adr=x"CF00")andrw='0'then
2
ee_rw<=rw;
3
else
4
ee_rw<='1';
5
endif;
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
STACF00
3
JMP600
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.
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
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.
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:
1
load data AA to address 5555
2
load data 55 to address 2AAA
3
load data 80 to address 5555
4
load data AA to address 5555
5
load data 55 to address 2AAA
6
load data 20 to address 5555
7
load data XX to any address
8
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.
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.
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.
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...
Hast du keinen Logicanalyzer mit dem du die relevanten Teile des Bus beobachten kannst? Falls nicht, unbedingt besorgen und weniger Lebenszeit verschwenden.
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!)
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.
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.)
(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)