komische uart ausgabe bei atmega32

OP #1450968
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
Gast
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.
OP
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?
> 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
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
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
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!
> 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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.