28C256 programmieren

#7824710
Lesenswert?

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.

#7824720
Lesenswert?

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?

#7824723
Lesenswert?

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?

#7824736
Lesenswert?

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?

Beitrag #7824740 wurde von einem Moderator gelöscht.
#7824758
Lesenswert?

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.

#7824762
Lesenswert?

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.

#7831446
Lesenswert?

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?

#7831448
Lesenswert?

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

#7831477
Lesenswert?

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.

#7831694
Lesenswert?

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:

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.

#7831702
Lesenswert?

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.

#7831719
Lesenswert?

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...

#7831746
Lesenswert?

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!

#7831766
Lesenswert?

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.

Angehängte Dateien:
#7831825
Lesenswert?

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!)

#7831837
Lesenswert?

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.

#7831845
Lesenswert?

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!

Angehängte Dateien:
#7831877
Lesenswert?

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.

#7831900
Lesenswert?

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.

#7843470
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren