Forum: Mikrocontroller und Digitale Elektronik Atmega64 und XMEM


von Schorsch (Gast)


Lesenswert?

Hallo,

ich bastele mir gerade eine Platine mit einem Atmega64 zusammen, der 
zusätzlichen SRAM benötigt. Der 64 hat ein XMEM interface, was das 
eigentlich vereinfachen sollte. Dennoch bin ich verwirrt:

Ja, es gibt diese tolle Schaltungsbeschreibung im Datenblatt, wo auch 
drinsteht, welches Latch man nehmen sollte, etc.

Dennoch: Kann ich jetzt 64K oder 8x64K anschließen. Was für einen SRAM 
soll ich nehmen? Ich bestelle gerne bei Reichelt, habe dort keinen mit 
8x64K gefunden, kann ich auch einen größeren nehmen?

Hab mittlereile auch rausgefunden, dass ich bei meiner Taktfrequenz 
(14,7..MHz), den 74HTC573 nehmen muß, aber wie siehts mit dem SRAM aus?

Wie gesagt ich bin verwirrt....

Hat jemand sowas schonmal ohne viel gebastel gemacht? Wie gesagt ich 
möchte einfach nur das XMEM Interface benutzen. Könnt Ihr mir eine 
Schaltung zeigen?


Danke im Voraus

Schorsch

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Schorsch schrieb:
> Kann ich jetzt 64K oder 8x64K anschließen.

64kByte oder 8x64kBit. Auf dem Baustein sollte irgendwas mit 512xxx 
draufstehen, wenn es die ältere Markierungsweise ist. Neuere 
High-Speed-SRAMs von Cypress oder ähnlichen Anbietern werden anders 
markiert.

Schorsch schrieb:
> dass ich bei meiner Taktfrequenz
> (14,7..MHz), den 74HTC573 nehmen muß

Nö, den HC oder HCT.

Schorsch schrieb:
> aber wie siehts mit dem SRAM aus?

Unter 40ns Zugriffszeit wäre schon ein guter Richtwert.

Schorsch schrieb:
> Hat jemand sowas schonmal ohne viel gebastel gemacht?

Tausende Leute vor Dir.

Schorsch schrieb:
> Könnt Ihr mir eine
> Schaltung zeigen?

Die aus dem Datenblatt funktioniert hervorragend. Ansonsten gibt es auch 
noch AppNotes dazu im Netz.

von Schorsch (Gast)


Lesenswert?

Hallo,

danke...

Knut Ballhause schrieb:
> Schorsch schrieb:
>> Kann ich jetzt 64K oder 8x64K anschließen.
>
> 64kByte oder 8x64kBit. Auf dem Baustein sollte irgendwas mit 512xxx
> draufstehen, wenn es die ältere Markierungsweise ist. Neuere
> High-Speed-SRAMs von Cypress oder ähnlichen Anbietern werden anders
> markiert.
>

aso...

> Schorsch schrieb:
>> dass ich bei meiner Taktfrequenz
>> (14,7..MHz), den 74HTC573 nehmen muß
>
> Nö, den HC oder HCT.

typo :-p
>
> Schorsch schrieb:
>> aber wie siehts mit dem SRAM aus?
>
> Unter 40ns Zugriffszeit wäre schon ein guter Richtwert.

Hab bei Reichelt nur diesen hier gefunden: 6264-70 M - Cycle time ist 
hier 70ns... ich kenn mich mit Anologelektronik aus, mal vielleicht 
irgendwo n Multiplexer, ich hab keine Ahnung, was das bedeutet... ich 
vermute, der ist dann wohl zu langsam?


>
> Schorsch schrieb:
>> Hat jemand sowas schonmal ohne viel gebastel gemacht?
>
> Tausende Leute vor Dir.

das glaube ich, dennoch wird dann hier und da mehr und weniger 
drangestickt, wie man doch mit 3 zusätzlichen Bits mehr addressieren 
kann...
>
> Schorsch schrieb:
>> Könnt Ihr mir eine
>> Schaltung zeigen?
>
> Die aus dem Datenblatt funktioniert hervorragend. Ansonsten gibt es auch
> noch AppNotes dazu im Netz.

Hab ich leider nicht gefunden - Ich stoße immer wieder beim Googlen auf 
diesen Artikel

Schorsch

von Schorsch (Gast)


Lesenswert?

Hallo,

ich finde wirklich keinen passenden SRAM mit 40ns, einzig bei rs-online 
habe ich einen ic für 76EUR gefunden - soviel wollte ich nicht ausgeben.

Daher nochmal die Frage, wenn das schon soviele Menschen vor mir gemacht 
haben, welchen SRAM Chip haben sie verwendet und wo haben sie ihn 
bestellt?

Schorsch

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Schorsch schrieb:
> welchen SRAM Chip haben sie verwendet

Müsste ich zu Hause mal nachsehen, ist schon Jahre her, dass ich mir
eine 64-KiB-Erweiterung für eine ATmega128-Experimentierplatine
gebaut habe.

> und wo haben sie ihn
> bestellt?

Ausgebaut aus alten Festplatten. ;-)  Gab's dann dafür nur im
TSSOP-Gehäuse, das mich durch das 0,5-mm-Raster ein wenig an die
Grenzen meiner damaligen Platinenbestückungsfertigkeiten gebracht
hat.

Du kannst ja für Externspeicher auch zusätzliche wait states mit
einplanen, wenn der, den du findest, nicht schnell genug ist.  Man
sollte dann halt möglichst nicht den Stack in den Externspeicher
legen, sondern ans obere Ende des internen SRAM.

Denk dran, dass (ohne Tricks und Kniffe) ein Teil des externen
64-KiB-Bereichs nicht zugänglich ist, da er duruch den internen
Speicher überschattet wird.

von Schorsch (Gast)


Lesenswert?

Hallo,


Jörg Wunsch schrieb:
> Denk dran, dass (ohne Tricks und Kniffe) ein Teil des externen
> 64-KiB-Bereichs nicht zugänglich ist, da er duruch den internen
> Speicher überschattet wird.

Du meinst, weil die ersten 4K schon vom internen Speicher benutzt 
werden?

Die Anwendung wird ein Datenlogger sein, der momentan mit 1kHz Daten 
über die ADCs aufzeichnet. Im Augenblick schiebe ich alles on-the-fly 
per USB raus. ich stoße jetzt aber so langsam an die Grenzen, wenn ich 
nochmehr aufzeichnen will. Daher will ich jetzt erst Puffern, dann am 
Ende rausschreiben.

Ich hab mich mit der Programmierung noch nicht beschäftigt; kann ich 
dann in meinen C-Code variablen direkt in den internen oder den externen 
Speicher legen?

Habe überlegt einen größeren (oder kleineren) SRAM zu nehmen. Gibt es da 
etwas zu beachten? Es gibt z.B. 64kx16, ich schätze ich könnte die 
übrigen 8 beinchen einfach auf GND ziehen? oder wenn ich 256Kx8 nehme 
und die Adressbeinchen auf GND ziehe? Geht sowas, ich hab keine Ahnung?

Georg

von Patrick D. (oldbug) Benutzerseite


Angehängte Dateien:

Lesenswert?

Externes memory, das ist lange her!

Ich hab mal eins der Testprogramme ausgebuddelt. Das CPLD erweitert den 
Adressbereich um den gesamten Speicher adressieren zu können, kann man 
aber "ignorieren".

Da sollte eigentlich alles drin beschrieben sein...

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Schorsch schrieb:

>> Denk dran, dass (ohne Tricks und Kniffe) ein Teil des externen
>> 64-KiB-Bereichs nicht zugänglich ist, da er duruch den internen
>> Speicher überschattet wird.
>
> Du meinst, weil die ersten 4K schon vom internen Speicher benutzt
> werden?

Ja, genau genommen sind es 0x1100 Bytes, die intern adressiert
werden (wegen der IO-Register, die unterhalb der 4 KiB internen
SRAMs liegen).

> Daher will ich jetzt erst Puffern, dann am
> Ende rausschreiben.

Naja, einer Situation, bei der der Zufluss permanent größer ist
als der Abfluss, wird man aber auch mit mehr Puffer nicht Herr. ;-)

> Ich hab mich mit der Programmierung noch nicht beschäftigt; kann ich
> dann in meinen C-Code variablen direkt in den internen oder den externen
> Speicher legen?

RTFHandbook ;-)

http://www.nongnu.org/avr-libc/user-manual/malloc.html

> Habe überlegt einen größeren (oder kleineren) SRAM zu nehmen. Gibt es da
> etwas zu beachten? Es gibt z.B. 64kx16, ich schätze ich könnte die
> übrigen 8 beinchen einfach auf GND ziehen? oder wenn ich 256Kx8 nehme
> und die Adressbeinchen auf GND ziehe? Geht sowas, ich hab keine Ahnung?

Ja, geht.  Prinzipiell könnte man auch die verbleibenden auf einen
IO-Port legen, dann hat man memory banking.  Ist aber schwierig im
Kontext mit Variablen, die durch den Compiler darin verwaltet werden
sollen, denn der rechnet nicht damit, dass er vor dem Zugriff noch an
einem IO-Port herumfummeln muss.  Wenn man nur eigene Puffer da
unterbringen will, kann man das aber machen.

x16 würde ich aber nicht nehmen, ist schade ums Geld.

32 Ki x 8 geht natürlich, würde man dann vorzugsweise ab 0x8000
adressieren.  (Der Bereich von 0x1100 bis 0x7FFF spiegelt in so
einer Konfiguration den Bereich 0x9100 bis 0xFFFF, aber den kann
man einfach ignorieren.)

von Schorsch (Gast)


Lesenswert?

Hallo,

vielen Dank für den Code und die Links...

...das mit dem Zufluss und dem Abfuss .. und der Rohrgröße... nun ich 
sample 1 sekunde lang mit 1kHz dann mache ich ca 10 Sekunden lang 
nichts. Der UART ist im Vergleich zu allen anderen Dingen, die man 
während der Samplezeit mahen kann, so langsam, dass er das alles 
begrenzt. Je mehr strings ich rausschreibe, umso langsamer wird dass, 
irgendwann schaffe ich das nicht mehr alle variablen innerhalb von 1ms 
rauszuschreiben. Dann puffe ich lieber, und schicke ein großes Paket in 
den 10 Sekunden danach

nochwas....

Muß ich das im externen Speicher unbedingt auf dem Heap machen? Ich 
hatte die naive Vorstellung im global Scope einfach eine großes array 
anzulegen, und dann immerwieder reinzuschreiben

so á la

uint8_t value[10][1024];

direkt auf dem Stack...

Schorsch

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Schorsch schrieb:

> Muß ich das im externen Speicher unbedingt auf dem Heap machen?

Nein, natürlich nicht.  Es ging mir da mehr darum, wie die
Speicheraufteilung überhaupt ist.

Das hier vielleicht noch dazu:

http://www.nongnu.org/avr-libc/user-manual/mem_sections.html

> Ich
> hatte die naive Vorstellung im global Scope einfach eine großes array
> anzulegen, und dann immerwieder reinzuschreiben
>
> so á la
>
> uint8_t value[10][1024];
>
> direkt auf dem Stack...

Nicht auf dem Stack.  Externer Speicher ist immer langsamer als
interner, dann machst du dir zwangsweise den ganzen Stack langsam.

global scope ist aber auch nicht auf dem Stack.

Pack' das in eine eigene memory section rein, die du dann mit dem
Linker auf 0x801100 bindest.

von Frank K. (fchk)


Lesenswert?

Schorsch schrieb:

> ...das mit dem Zufluss und dem Abfuss .. und der Rohrgröße... nun ich
> sample 1 sekunde lang mit 1kHz dann mache ich ca 10 Sekunden lang
> nichts. Der UART ist im Vergleich zu allen anderen Dingen, die man
> während der Samplezeit mahen kann, so langsam, dass er das alles
> begrenzt. Je mehr strings ich rausschreibe, umso langsamer wird dass,
> irgendwann schaffe ich das nicht mehr alle variablen innerhalb von 1ms
> rauszuschreiben. Dann puffe ich lieber, und schicke ein großes Paket in
> den 10 Sekunden danach

Dann wechsle doch die Plattform. Ein PIC32MX795F512L kann über sein 
eingebautes 100 MBit Ethernet und UDP etwa 8 Megabyte pro Sekunde 
rausblasen (2 Megabyte per TCP) und hat 128k RAM eingebaut. Du darfst 
alternativ auch ein äquvalentes ÄRMchen verwenden, aber ein PIC32 ist 
für den Anfang einfacher zu handhaben - Microchip hat alles für Dich 
vorbereitet.

Das sind doch schon ganz andere Dimensionen, oder?

fchk

von Holger S. (223rem)


Lesenswert?

Hallo Schorsch,

64kx8 ist nicht üblich.
Verbaue ein 128kx8 und lege A16 auf GND oder für weitergehendes
memory mapping auf eine Portpin.
z.B: AS7C1025C-12JIN  hab ich verwendet auf dem STK503 Borad.
Bei RS: 538-227

Gruß Holger

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Frank K. schrieb:
> Dann wechsle doch die Plattform.

Bitte lass deinen Evangelismus in den Threads, in denen er angebracht
ist.  Niemand hat hier die Frage gestellt, welche alternative
Plattform besser geeignet wäre, und 10 Sekunden Pause sollten allemal
genug sein, um die Daten an den Mann oder die Frau zu bringen.

Wer sagt dir denn, dass Ethernet auf der Gegenseite überhaupt
akzeptabel wäre?

Holger Sch schrieb:
> 64kx8 ist nicht üblich.

Dürfte einfach damit zusammenhängen, dass RAMs allgemein jeweils
um den Faktor 4 größer wurden von Generation zu Generation.
64 Ki x 8 wären 512 Kibit, eine unübliche Größe.  Die übliche
Staffelung war 16 Ki, 64 Ki, 256 Ki, 1 Mi.

> Verbaue ein 128kx8

Oder eben 32 Ki x 8, falls das auch reicht.

von Schorsch (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

dem Kommentar mit den Plattformen von Jörg kann ich mich nur 
anschließen. PICs mögen mich nicht, und die Erfahrung der Vergangenheit 
hat mir gezeigt, dass man soweit möglich bei den Dingen bleiben sollte, 
mit denen man sich auskennt.

Hab mal eine Schaltskizze angehängt, wo ich einen 32kx8 sram an den 
atmega64 gehängt habe. Hab ich alles richtig gemacht?

In der Doku steht, dass man A15 in der Luft hängen lassen sollte, bzw 
noch als Portpin benutzen kann. ALE,WR und RE sind die ersten Pins von 
Port G.

Ich hab einfach mal vermutet, dass man !OC vom Latch und !E vom SRAM an 
GND hängt?

Als sram hätte ich den AS7C256A von farnell genommen (1.60 EUR find ich 
ok).

Würde ich mich doch für einen größeren Entscheiden könnte ich einfach 
die zusätzlichen beinchen an beliebige Pins hängen, und meinen 
Adressraum erweitern, müsste dann natürlich die bereich "per Hand" 
umschalten, hätte also unterschiedliche Variableninhalte an der selben 
Speicherstelle, je nachdem wie die Adressleitungen stehen? Stimmts?

Danke Georg

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Schorsch schrieb:

> Hab mal eine Schaltskizze angehängt, wo ich einen 32kx8 sram an den
> atmega64 gehängt habe. Hab ich alles richtig gemacht?

Hab' mir jetzt das Datenblatt deines RAMs nicht angesehen, aber
sieht erstmal OK aus.

> Würde ich mich doch für einen größeren Entscheiden könnte ich einfach
> die zusätzlichen beinchen an beliebige Pins hängen, und meinen
> Adressraum erweitern, müsste dann natürlich die bereich "per Hand"
> umschalten, hätte also unterschiedliche Variableninhalte an der selben
> Speicherstelle, je nachdem wie die Adressleitungen stehen? Stimmts?

Dann müsstest du dir nochmal genau ansehen, welches Signal man darüber
schalten muss.

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
Noch kein Account? Hier anmelden.