Forum: Mikrocontroller und Digitale Elektronik Daten in Array speichern (ATmega2561)


von cyberfoxx (Gast)


Lesenswert?

Hallo!
Ich habe vor ein Datenarray (1-dimensional mit 38400 bool'schen Werten), 
von einem µC, in den internen RAM eines anderen (beides ATmega 2561er) 
zu speichern. Vom Speicherplatz hat der 2561er 8k internen RAM und ich 
würde ja nur 4,8k benötigen, müsste also leicht Platz haben.
Verbunden sind die ATmega's über PA0-PA6, sowie über PD0 und PD1 (dies 
sind die SCL&SDA Anschlüsse.)
Allerdings habe ich keine Ahnung wie ich auf ein internes RAM schreibe.
Im Netz habe ich auch nur folgenden Beitrag gefunden, der mir aber auch 
nur mäßig weitergeholfen hat: 
Beitrag "atmega - Daten in SRAM speichern und wieder ausgeben"

Nun also meine 2 Fragen:
Kann mir einer von euch sagen,
1) ob man direkt auf den RAM eines anderen µC's schreiben kann, oder 
muss der µC die Daten emprangen und selbst in seinen RAM ablegen?
2) wie man unter C den internen RAM beschreiben kann.


Zum Programmieren verwende ich WINAVR unter C, und zum beschreiben der 
µC verwende ich AVR Studio 4

Danke im voraus,
lg Cyberfoxx

PS: Noch ein Problem ist, dass wenn ich dieses boolsche Array erstellen 
möchte (bool data_array[38400]) einen Fehler bekomme, dass das Array zu 
Groß ist. Dieser Fehler ist aber für mich momentan noch eher 
nebensächlich

von Karl H. (kbuchegg)


Lesenswert?

cyberfoxx schrieb:

> Kann mir einer von euch sagen,
> 1) ob man direkt auf den RAM eines anderen µC's schreiben kann,

nein

> oder
> muss der µC die Daten emprangen und selbst in seinen RAM ablegen?

ja

> 2) wie man unter C den internen RAM beschreiben kann.

so wie immer.
Eine Variable anlegen und die Werte dort reinschreiben.


> PS: Noch ein Problem ist, dass wenn ich dieses boolsche Array erstellen
> möchte (bool data_array[38400])

logisch.
Die kleinste Datengröße ist in C ein Byte.
Selbst dann wenn ein einzelner bool theoretisch nur 1 Bit benötigt, wird 
trotzdem für jeden bool ein neues Byte angelegt.
Damit ist dein Array 38400 Bytes (oder knapp 38kByte) gross. Und damit 
hast du ein Problem mit deinen 8K die du zur Verfügung hast.

von cyberfoxx (Gast)


Lesenswert?

Danke für die schnelle Antwort!
Ich dachte dafür muss ich die Daten irgendwie Byte-weise auf eine von 
mir selbst definierte Adresse schreiben (so machten es wir für eine 
Projektarbeit wo wir Daten auf einen externen EEPROM schrieben, soweit 
ich mich richtig Erinnere).
Der Nachteil an der Sache... Der ATmega sollte eigentlich nicht damit 
beschäftigt werden auf Daten zu warten und diese zwischen zu speichern, 
sondern eine andere Arbeit ausführen, aber nützt ja nichts.

danke nochmals für deine Hilfe

von Karl H. (kbuchegg)


Lesenswert?

cyberfoxx schrieb:

> Der Nachteil an der Sache... Der ATmega sollte eigentlich nicht damit
> beschäftigt werden auf Daten zu warten und diese zwischen zu speichern,
> sondern eine andere Arbeit ausführen, aber nützt ja nichts.

Dafür gibts ja auch Interrupts.
Warten muss da niemand auf irgendwas, wenn man es richtig macht.

von cyberfoxx (Gast)


Lesenswert?

Ja aber während dem Interrupts ist er beschäftigt und kann seine andere 
Arbeit (für die Interruptzeit) nicht ausführen... Aber mal schaun was 
die Zukunft bringt, wird sich schon ausgehen ;-)

von Karl H. (kbuchegg)


Lesenswert?

cyberfoxx schrieb:
> Ja aber während dem Interrupts ist er beschäftigt

Aber nur sehr kurz. Die paar Taktzyklen, die man braucht um einen Wert 
vom Port abzuholen und in eine Variable zu speichern, kannst du an den 
Fingern von 2 Händen abzählen.

von cyberfoxx (Gast)


Lesenswert?

Wir dachten nur an eine Updaterate von 4 mal / Sekunde. Aber mit dieser 
Zeit können wir schon noch weiter rauf gehen.

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.