Forum: Mikrocontroller und Digitale Elektronik komische uart ausgabe bei atmega32


von Tom E. (hallo02)


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

von holger (Gast)


Lesenswert?

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

PWM pwm_conf[4] = {

768 x 4 ist nun mal mehr als 2kB RAM.

von Tom E. (hallo02)


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?

von Stefan E. (sternst)


Lesenswert?

Tom Eichw schrieb:

> Oder gibt es noch was anderes?

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

von Hc Z. (mizch)


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.

von Patrick D. (Firma: Pronet) (zordo)


Lesenswert?

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 !

von Tom E. (hallo02)


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.

von Tom E. (hallo02)


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?

von Justus S. (jussa)


Lesenswert?

Tom Eichw schrieb:

>> 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?

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

von Tom E. (hallo02)


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!

von Hc Z. (mizch)


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).

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.