Forum: Mikrocontroller und Digitale Elektronik ATMEGA16 RAM


von Holger (Gast)


Lesenswert?

Hallo,

ich möchte gerne ein 240x128 Grafik LCD ansteuern. Das ganze wird in C
programmiert. Will ich nun eine Grafik ins LCD schicken, so werden ja
3840 Bytes übermittelt. Tue ich diese knapp 4kByte in ein Array und
will dann die Einträge nacheinander senden, so verweigert mein ATMega16
seinen Dienst.
Mache ich dieses Array nur z.B. 240 Byte groß, funktioniert das so wie
ich es wollte. Nur sind das ja zu wenig Daten für das ganze Bild.
Sobald ich mehrere Arrays habe mit je 240 Byte Einträgen sagt der
Controller wieder "nö". Ich vermute dass das SRAM da irgendwie seine
finger mit im Spiel hat, welches ja auch nur 1k groß ist.
Hat einer ne Idee, wie ich dieses Problem lösen kann?
Geht vielleicht ganz einfach, bin aber leider kein C-Gott.

Vielen Dank
Holger

von Michael (Gast)


Lesenswert?

Ich bin auch auf der Suche nach einer Routine, die 3,8kB in 1KB
unterbringt :-) Bei mir meckert der Compiler immer, daß der Mega16
nicht genug RAM hat.

"Hat einer ne Idee, wie ich dieses Problem lösen kann?"

Anderen Prozessor (Mega128) nehmen, oder ext. RAM anstöpseln.
Prinzipiell könntes Du auch das RAM vom Display byteweise read/write
ansprechen; ist aber nicht sonderlich schnell.

von Rufus T. Firefly (Gast)


Lesenswert?

Wo legst Du denn das Array mit 3840 Bytes Größe ab?

Daß es nicht ins RAM passt, hast Du ja schon selbst herausgefunden - Du
solltest Dir also ansehen, wie Du das (konstant) ins ROM bekommst.

Die "storage class specifiers", die in der Dokumentation Deines
Compilers beschrieben sind, könnten ein Anlaufpunkt sein - irgendwo
dort wird auch beschrieben, wie man konstante Daten im ROM definiert.


(Allerdings frage ich mich, wozu das gut sein sollte; ein statisches
Bild auf ein LC-Display auszugeben ist ja nicht so sonderlich sinnvoll)

von sicily (Gast)


Lesenswert?

schonmal mit 12 leuten in nem trabi gesessen?
also, wenn es darum geht, ein einziges bild mit knapp 4kB auf dem
display anzuzeigen, dann kannst du beim mega16 die information
eigentlich nur im flash speichern!

gruss,
sicily

von Peter D. (peda)


Lesenswert?

38L Wasser in einen 10L-Eimer gibt in jedem Fall eine riesen Sauerei,
d.h. es geht nicht.

Du brauchst also einen externen SRAM, da ist der ATMega162 besser
geeignet.


Peter

von Holger (Gast)


Lesenswert?

...ja, dass die daten nicht ins ram passen hab ich wohl gemerkt. aber
wenn ich mein hex-file in den controller lade wird ja zunächst nur der
flash mit beschrieben, oder nicht? und der ist ja groß genug. wenn der
controller dann die ersten 240 byte gesendet hat, kann man ihm dann
nicht irgendwie sagen, dass er die aus dem ram rausnehmen soll und die
nächsten 240 byte reinschieben kann?
ich kann mir ja auch bilder auf meinem computer angucken, die insgesamt
mehr als z.b. 2 GByte haben. und der arbeitsspeicher ist ja auch nicht
so groß.

von Peter D. (peda)


Lesenswert?

Es ist kein Problem, das Bild in Häppchen zu je 240 Byte zu erzeugen.

Du must nur das Programm so schreiben, daß Du immer den gleichen 240
Byte Puffer benutzt.

Ein Array ist dagegen immer die Summe aus allen Elementen. Woher soll
der Compiler denn auch wissen, welches Feld Du nicht mehr benötigst ?


Peter

von sicily (Gast)


Lesenswert?

sagst du deinem compiler explizit, dass er die daten im flash ablegen
soll?
was für einen benutzt du denn??

von Holger (Gast)


Lesenswert?

ich benutze den avr-gcc. oder muss es noch genauer sein? ich weiß nicht,
wie ich ihm explizit sagen kann, dass er die daten nur im flash ablegen
soll, da sie ja nur gelesen werden. ich habe es schon mit constant vor
meinem array probiert. haut aber auch nicht hin.
ich habe auch schon probiert ein array mit 240 byte anzulegen und
dieses dann im programmablauf mit neuen daten zu beschreiben. der
compiler meckert dann aber, dass es solch eine deklaration schon gibt.
zieht sich der controller denn alle daten zum programmstart komplet in
den sram? oder kann er wärend des programmablaufs neue daten in den
sram ablegen?

danke und gruß
holger

von OldBug (Gast)


Lesenswert?


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.