komische uart ausgabe bei atmega32

OP #1450968
Lesenswert?

Hallo!

Ich definiere folgende arrays mit 256 werten:

typedef struct PWM_ {
  unsigned char r[256];
  unsigned char g[256];
  unsigned char b[256];
} PWM;

PWM pwm_conf[2] = {
       {  { 255,254,253,252,251,250,249,248,247,...,0 },
          { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,...,255 },
          { 0,1,5,9,13,17,21,25,29,33,37,41,45,49,53,57...0}
       },

       { { 255,254,253,252,251,250,249,248,247,....0 },
         { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,...,255 },
         { 0,1,5,9,13,17,21,25,29,33,37,41,45,49,53,57...0}
       }
};

Wenn ich nun im main program per UART (baud 9600, datenbits 8, paritaet 
keine, stoppbits 1) zB pwm_conf[1].r[2] ausgebe, bekomme ich 
richtigerweise 253 zurueckgeliefert.


Wenn ich nun aber zu pwm_conf weitere 2 arrays hinzufuege, kommt auf der 
uart nur mehr schrott raus - zB ü2ü2ü2ü2ü2ü2

array schaut zB so aus:

PWM pwm_conf[4] = {
       {  { 255,254,253,252,251,250,249,248,247,...,0 },
          { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,...,255 },
          { 0,1,5,9,13,17,21,25,29,33,37,41,45,49,53,57...0}
       },

       { { 255,254,253,252,251,250,249,248,247,....0 },
         { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,...,255 },
         { 0,1,5,9,13,17,21,25,29,33,37,41,45,49,53,57...0}
       },
       { { 255,254,253,252,251,250,249,248,247,....0 },
         { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,...,255 },
         { 0,1,5,9,13,17,21,25,29,33,37,41,45,49,53,57...0}
       },
       { { 255,254,253,252,251,250,249,248,247,....0 },
         { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,...,255 },
         { 0,1,5,9,13,17,21,25,29,33,37,41,45,49,53,57...0}
       }
};


Kann mir vielleicht jemand weiterhelfen, warum dies so ist?
Vielen Dank,
Thomas
OP #1451011
Lesenswert?

Ahhh, das leuchtet ein -danke fuer die schnelle Antwort!

Ich werde wahrs. sonst keine möglichkeit haben die Werte am uC zu 
speichern?
EEPROM ist auch zu klein.
Jetzt habe ich nur noch die moeglichkeit einen anderen uC zu nehmen bzw 
die Daten extern einzulesen (zB Flash datenspeicher).
Oder gibt es noch was anderes?
#1451024
Lesenswert?

> Was ist mit dem internen Fash? Oder sollte das etwa durch den
> Programm-Code schon voll sein?

Das enthält jetzt schon die ganze Initialisierung (die Daten müssen ja 
irgendwie ins Ram kommen), kann also nicht voll sein.  Wenn man die 
Ram-Zugriffe aufs Flash verlegt, ändert sich an der Flashgröße fast 
nichts und das Ram wird frei.
OP #1451186
Lesenswert?

Patrick De zordo schrieb:
> Hallo Tom,
> musst du die Werte eigendlich in einem Array ablegen ?
>
> Wenn die Werte diese sind die du im Beispiel angegeben hast,
> dann empfehle ich dir die Werte im Controller zu berechnen.
>
> Grüße !

Die Werte schauen anders aus, sind leider nicht 1,2,3..usw.
Die Werte werden mit Matlab berechnet um RGB leds anzusteuern. Die 
formel dazu kenne ich noch nicht, macht ein Freund. Aber vielleicht kann 
ich sie im uC nachbilden.
OP #1451191
Lesenswert?

Hazeh Zimmerer schrieb:
>> Was ist mit dem internen Fash? Oder sollte das etwa durch den
>> Programm-Code schon voll sein?
>
> Das enthält jetzt schon die ganze Initialisierung (die Daten müssen ja
> irgendwie ins Ram kommen), kann also nicht voll sein.

Der flashspeicher liegt nur bei ~6kb.

> Wenn man die
> Ram-Zugriffe aufs Flash verlegt, ändert sich an der Flashgröße fast
> nichts und das Ram wird frei.

wie macht man das?
OP #1451251
Lesenswert?

Justus Skorps schrieb:

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

:-)
Ich bin leider kein uC Experte, dafuer gibts ja dieses tolle Forum!
Auf jeden Fall, hab ich heute wieder was gelernt und vor allem 
funktioniert es jetzt!

mein aufruf lautet nun:  const PWM pwm_conf[4] PROGMEM = { ..}
die werte lese ich dann mit: pgm_read_byte()

vielen dank nocheinmal an justus!
#1451270
Lesenswert?

> die werte lese ich dann mit: pgm_read_byte()

So war's gedacht und Du hast Dich selbst dahin durchgebissen.  Du wirst 
auch festgestellt haben, dass sich der Flashverbrauch kaum geändert hat, 
denn die Arrays wurden vorher von dort ins Ram kopiert, verbrauchten 
also bereits denselben Platz.  Gratulation zum Lernerfolg (nicht 
ironisch, sondern ernst gemeint).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren