Forum: Mikrocontroller und Digitale Elektronik Atmega 32 speicherplatz


von Otto (Gast)


Lesenswert?

Guten Abend/Nacht,


so habe gestern den ganzen Tag ein Programm geschrieben, welches mir die 
Timerwerte mit bestimmten Werten versieht.

So, nun passt mein Array aber nicht mehr auf den Controller^^

Aber was ich nicht verstehe:

    Device: atmega32
    Program:    7570 bytes (23.1% Full)
    (.text + .data + .bootloader)
    Data:      18090 bytes (883.3% Full)
    (.data + .bss + .noinit)

Das zeigt mir AvrStudio 5 an.
Aber wieseo ist das Programm nur zu 23% voll und .data zu 883%?
Kann ich mein Array irgendwie anders speichern, so dass es drauf 
passt???

lg otto

von Roland H. (batchman)


Lesenswert?

Otto schrieb:
> Aber wieseo ist das Programm nur zu 23% voll und .data zu 883%?

Weil Dein Programm ins Flash kommt (32k), und die veränderlichen Daten 
ins RAM (2k).

Otto schrieb:
> Kann ich mein Array irgendwie anders speichern, so dass es drauf
> passt???

Nein. Vermutlich nicht. Nicht auf dieses Ding.

Wie sieht die Array-Deklaration aus?

von Chris D. (m8nix)


Lesenswert?

Hi Otto,


poste doch mal deine Array Deklaration

LG
Chris

von Chris D. (m8nix)


Lesenswert?

Wieder war einer schneller *tzzzz   :-D

von Otto (Gast)


Lesenswert?

huh super, schnell!!

sieht gerade so aus:

uint32_t array[4434] = {
0x4ffff,  0x34c4a,  0x29896,  0x265b9,  0x24c4a,  0x23d08,  0x232dc, 
0x22b98,  0x22625,  0x221e8,
...
};

Was heißt denn veränderliche Daten? Hab ich schon gelesen konnte aber 
nix damit anfangen.
Und 32k höhrt sich doch nach viel an, kriegt ich das da denn nicht rein?

von Eumel (Gast)


Lesenswert?

Nö, ins Ram passen nur 2kb :)
Ins Flash kommt das Programm und unter umständen Daten die SEHR SEHR 
selten verändert werden oder statisch sind. Z.b. Bilder oder 
Schriftarten für ein grafik Display. Die Daten im Flash können auch 
verändert werden....aber das Flash macht nur eine bestimme Anzahl von 
Schreibzyklen mit ( gelesen werden kann es unbegrenzt)

von Otto (Gast)


Lesenswert?

Achso und zum Zweck des ganzen. Es soll ein Stroboskop Licht werden. Hab 
da eine nette Formel im Atm32 Datenblatt gefunden um den ocr-Wert von 
einer bestimmten Frequenz zu bekommen. Dann hab ich mir ein Programm 
geschrieben, was diesen Werte ausrechnet und den besten Vorteiler dazu 
findet. Nun wollte ich das ganze aufspielen und dann mit nem Pointer das 
array "abfahren". Momentan wird der ocr Wert in Echtzeit berechnet, was 
aber ziemlich "ruckelig" ist.

@Eumel: Ja die müssen nicht geändert werden! Einfach einmal drauf. Wie 
geht das?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Konstante Daten sollten im Flash bleiben. Aufgrund der praktischen 
Harvard-Architektur ist beim AVR hierfür mehr erforderlich als nur das 
Schlüsselwort const, das auf Controllern mit der 
von-Neumann-Architektur genügen würde.

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmspeicher_.28Flash.29

von Eumel (Gast)


Lesenswert?

Otto, schau mal hier oben links im AVR Tutorial im Kapitel über LCDs. Da 
wird beschrieben, wie man einen konstanten Text im Flash speichert und 
dann ausgibt. Da müsste alles drinstehen was du brauchst.

von Roland H. (batchman)


Lesenswert?

Otto schrieb:
> Was heißt denn veränderliche Daten?

Sorry, hatte ich überlesen - bzw. aus dem RAM-Bedarf geschlossen.

Wenn Du einen ARM hättest, dann würde ein const in Deiner Deklaration 
ausreichen. Für atmega ist PROGMEM Dein Helfer.

Was machst Du mit 32-Bit-Werten? Ich sehe nur 2,5 Byte pro Wert.

von Otto (Gast)


Lesenswert?

Hallo,

danke für Eure Hilfe!!

Habe es nun geschaft, mittels "#include <avr/pgmspace.h>" und "PROGMEM" 
alles in den Flash zu bekommen!!
sieht jetzt so aus:

    Program:   25306 bytes (77.2% Full)
    (.text + .data + .bootloader)
    Data:        354 bytes (17.3% Full)
    (.data + .bss + .noinit)

Nun noch mal zum uint32_t, ja es sind immer nur 2,5Bytes!
Aber ein uint16_t wäre ja zu klein.
Wie bekomm ich denn genau die 2,5Bytes?

Lg Otto

von fdssd (Gast)


Lesenswert?

brauchst du wirklich alle 4434 mwerte ?
oder hast du das mal eben nur auf vorat gebaut?

ich meine für ein strobo licht ..
das ist eher mit kanonen auf spatzen  und so ..

von Otto (Gast)


Lesenswert?

@fdssd Nun ja das sind alle Möglichkeiten mit 1Mhz Quarz und den 5 
Vorteilern von 0.1 bis 10kHz.
Ja ich will das Stroboskop Licht ja auch nehmen um z.B. 
Lüftergeschwindikeit zu messen oder so.
So richtig funktionieren wird das dann nur bis so 500Hz, weil ab da die 
"Frequenzschritte" zu groß werden.
Aber ich fand, dass es eine nette Idee ist :)

von Roland H. (batchman)


Lesenswert?

Otto schrieb:
> Aber ein uint16_t wäre ja zu klein.
> Wie bekomm ich denn genau die 2,5Bytes?

Mit einem struct, welches z. B. 1x uint16_t und 1x uint8_t hat. Oder 
3x uint8_t.

Danach ein array mit diesem struct.

von Karl H. (kbuchegg)


Lesenswert?

Otto schrieb:
> @fdssd Nun ja das sind alle Möglichkeiten mit 1Mhz Quarz und den 5
> Vorteilern von 0.1 bis 10kHz.

Das kann man doch sicher auch zur Laufzeit ausrechnen, oder nicht?

Ob der µC nach dem Umschalten der Frequenz erst nach 1 oder 10ms 
reagiert (weil er mit rechnen beschäftigt ist), ist bei einem Stroboskop 
ja wohl zweitrangig.

Auf der anderen Seite: Für nicht benutztes Flash gibts kein Geld zurück.

von Karl H. (kbuchegg)


Lesenswert?

> So richtig funktionieren wird das dann nur bis so 500Hz,
> weil ab da die "Frequenzschritte" zu groß werden.

Das geht durchaus noch feiner.
Du brauchst dazu einen Timer, der einen PWM Modus mit variabler 
Obergrenzen hat.

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.