Ich habe hier mehrere SRAM ICs, die ich gerne mit einem Mikrocontroller
ansprechen möchte.
Gibt es irgend eine Möglichkeit die Speichergröße der Chips zu
bestimmen?
Die verwendeten Chips haben 12-16 Adressbits.
Der Mikrocontroller sollte irgendwie die Speichergröße ermitteln um
keine Adressen zu setzen, die der Chip nicht unterstützt.
Paul schrieb:> Die verwendeten Chips haben 12-16 Adressbits.> Der Mikrocontroller sollte irgendwie die Speichergröße ermitteln um> keine Adressen zu setzen, die der Chip nicht unterstützt.
Dann überlege mal, wozu bei SRAM-ICs die Adressbits gut sind -
gewöhnlich, um den im IC enthaltenen Speicher zu adressieren.
Bei n Adressbits ergibt sich die Speichergröße dann zu 2^n
Paul schrieb:> Ich habe hier mehrere SRAM ICs ...> Gibt es irgend eine Möglichkeit die Speichergröße der Chips zu> bestimmen?
Du meinst eine andere Möglichkeit, als die Typbezeichnung auf dem IC zu
lesen und dann ins Datenblatt zu schauen?
...
Nein. Eher nicht.
Vielleicht heißt die Aufgabenstellung: Ich schließe einen Speicher an
und der µC soll die Größe ermitteln?
Wenn der TO sich klarer ausdrücken würde, wüssten wir es.
Ein TiP:
SRAMs kann man schreiben und lesen und dann schauen, ob das geschriebene
auch da ist, wo es sein sollte. Oder ob ein Schreibvorgang einen Zelle
überschrieben hat, die man gar nicht adressieren wollte.
Auch bei den einfachsten Aufgabenstellungen brauchts etwas Nachdenken
und etwas Phantasie.
Phantasie schrieb:> Vielleicht heißt die Aufgabenstellung: Ich schließe einen Speicher an> und der µC soll die Größe ermitteln?
So hätte ich sie verstanden.
Ein SRAM-Speicher mit 12 Bit hat einen Adressbereich von 0 bis (2^12)-1.
Schreibt man auf 2^12, dann landet der Wert auf Adr. 0.
Man kann z.B. auf die Adresse 0 einen Wert 0 schreiben und anschließend
auf die Adresse 2^n (n=12, 13, ...) einen von 0 verschiedenen Wert.
Anschließend prüft man, welcher Wert bei Adr. 0 drin steht.
Ist er noch 0, dann wiederholt man das mit dem nächsten n.
Ist er nicht mehr Null, so ist die Speichergröße 2^n.
Phantasie schrieb:> Ich schließe einen Speicher an und der µC soll die Größe ermitteln?
Genau das habe ich vor.
Ich hatte früher Mal einen Atari Portfolio, dort gab es die
Speicherkarten, die einfach nur SRAM und eine Knopfzelle waren, in
unterschiedlichen Größen. Der Portfolio konnte aber die Große anzeigen.
So etwas würde ich auch gern machen. Egal wie groß der angeschlossene
Chip ist, der uC soll die Große irgendwie ermitteln
Das geht nicht, ohne die vorhandenen Daten (teilweise) zu überschreiben.
Für batteriegepufferten Speicher ist das also keine sinnvolle Option.
Ich bin mir sicher, dass der Atari Portfolio die Erweiterung anderweitig
identifizieren konnte (z.B. Pullup/Pulldown-Widerstände). Oder er hat
die Daten vorher woanders zwischengespeichert, d.h. bei einem Absturz in
der Routine waren die Daten trotzdem kaputt.
>Das geht nicht, ohne die vorhandenen Daten (teilweise) zu überschreiben.
Klar geht das. Speicherzelle lesen, in Register oder in anderem Ram
speichern, Test durchführen, Speicherzelle zurückschreiben.
Programmieren ist immer sich eine Methode ausdenken. Programmieren ist
nicht copy&paste.
HildeK schrieb:> Man kann z.B. auf die Adresse 0 einen Wert 0 schreiben und anschließend> auf die Adresse 2^n (n=12, 13, ...) einen von 0 verschiedenen Wert.> Anschließend prüft man, welcher Wert bei Adr. 0 drin steht.> Ist er noch 0, dann wiederholt man das mit dem nächsten n.> Ist er nicht mehr Null, so ist die Speichergröße 2^n.
Njein,
damit prüft man lediglich ob Speicher an der Addresse liegt, aber nicht
welcher. Beim Speicherkartenbeispiel wäre das das man nicht
unterscheiden kann, ob zwei Speicherkarten halber Größe hintereinander
liegen oder nur eine Speicherkarte einfacher Größe. Spassig wird es wenn
man beim Testen den Arbeitsspeicher des Testprogramms erwischt ...
Aber möglicherweise ist das dem TO wurscht.
Im echten Leben speichert man die Installierte Speichergröße
nichtflüchtig ab (bspw BIOS, CMOS-RAM, Config-EEPROM,
Firmeare-datafield) und checkt beim Hochfahren ob man den Speicher in
der Größe wie konfiguriert beschreieben kann. Anders lassen sich
teilweise Speicherausfälle nicht entdecken.
S. R. schrieb:> Ich bin mir sicher, dass der Atari Portfolio die Erweiterung anderweitig> identifizieren konnte (z.B. Pullup/Pulldown-Widerstände).
Nachdem da offenbar nur 3 verschiedene Speicherkarten (namentlich
HPC-201, HPC-202, HPC-203) angeboten wurden, und der Zustand "keine
Karte" dazukommt, reichen 2 Leitungen für die Erkennung eines dieser 4
Zustände aus.
Paul schrieb:> Phantasie schrieb:>> Ich schließe einen Speicher an und der µC soll die Größe ermitteln?>> Genau das habe ich vor.> Ich hatte früher Mal einen Atari Portfolio, dort gab es die> Speicherkarten, die einfach nur SRAM und eine Knopfzelle waren, in> unterschiedlichen Größen. Der Portfolio konnte aber die Große anzeigen.>> So etwas würde ich auch gern machen. Egal wie groß der angeschlossene> Chip ist, der uC soll die Große irgendwie ermitteln
Dann zähl halt durch. Fang bei Adresse 0 an und arbeite dich vor bis
Adresse whatever, was auch immer das Maximum ist.
Wenn du ausschließen willst, dass derselbe Speicher gespiegelt vorhanden
ist, musst du halt in jede vorhandene Zelle einen anderen Wert schreiben
und das zurücklesen und prüfen.
Paul schrieb:> Die verwendeten Chips haben 12-16 Adressbits.
Dann mußt Du erstmal die Datenblätter der fraglichen SRAMs vergleichen,
welche Funktion die 4 Pins haben, wenn sie keine Adressen sind.
Die Größe zu ermitteln ist ganz einfach. Du schreibst an Adresse 0x0000
irgendein Datum und dann prüfst Du, wann wieder das gleiche Datum
ausgelesen wird. An dieser Adresse änderst Du das Datum und prüfst, ob
es sich an 0x0000 auch geändert hat. Wenn ja, dann ist das Ende
erreicht.
Du mußt natürlich nicht alle Adressen abklappern. Es reicht, nur die
Adressbits 12..15 zu prüfen, wenn 4k die kleinste Größe ist. Also 4
Vergleiche.
Paul schrieb:> Gibt es irgend eine Möglichkeit die Speichergröße der Chips zu> bestimmen?
Typennummer ablesen, in Datenblatt gucken, und sich ärgern warum man so
eine idiotisch unklare Frage stellt.
Paul schrieb:> Genau das habe ich vor.
Wenn alle Adressleitungen an die 16 als Adressausgänge verwendeten
PortPins in Reihenfolge angeschlossen wurden, die letzten eben nicht
verbunden, ist es doch simpel: An die letzte Adresse von (12, 13. 14,..)
bit Adresse etas schreiben (z.B. 0xFFF) und gucken ob sich die
Speicherstelle bei 2 x Adresse +1 (z.B. 0x1FFF)verändert hat. Wenn ja,
war der Chip nicht doppelt so gross, sonst weiter probieren.
Phantasie schrieb:>> Das geht nicht, ohne die vorhandenen Daten (teilweise) zu>> überschreiben.>> Klar geht das. Speicherzelle lesen, in Register oder in anderem Ram> speichern, Test durchführen, Speicherzelle zurückschreiben.
Hättest du bessere Lesekenntnisse, wäre dir aufgefallen, dass ich das
bereits erwähnt hatte.
Im Übrigen enthält der von dir vorgeschlagene Ablauf "lesen,
überschreiben, wiederherstellen" den Teil "überschreiben". Ohne den geht
es also trotzdem nicht.