Forum: Mikrocontroller und Digitale Elektronik C-Problem mit Arrayzugriff im FLASH, AVR


von Hans (Gast)


Lesenswert?

Auf ein Array im FLASH greife ich wie folgt zu:

Variante 1

DDR[0] = pgm_read_byte( number[1][0] ) ;

Ergebnis: 0


Variante 2 (Value ist 1)

DDR[0] = pgm_read_byte( number[value][0] ) ;

Ergebnis: 26

Erhalte aber bei beiden Varianten nicht die Werte aus der Tabelle.
Was mache ich falsch?


Hier das Array:

prog_char number [8][3] =
  {
   {0x00, 0x00, 0x00},
   {0x04, 0x00, 0x00},
   {0x00, 0x00, 0x00},
   {0x01, 0x04, 0x00},
   {0x01, 0x02, 0x00},
   {0x01, 0x02, 0x04},
   {0x01, 0x02, 0x03},
   {0x03, 0x00, 0x00},
  } ;

Compiler GCC f. AVR. Controller ATTiny13V.

von Falk B. (falk)


Lesenswert?

@  Hans (Gast)

>DDR[0] = pgm_read_byte( number[1][0] ) ;

>Ergebnis: 0

Logisch, weil falsch. Eher so
1
DDR[0] = pgm_read_byte( &number[1][0] ) ;

MFG
Falk

von Hans (Gast)


Lesenswert?

Danke für deine rasche Antwort, Falk.

Funktioniert 'leider' nicht. Ist aber auch verständlich, da number... 
bereits eine Adresse ist, so dass die Angabe von '&' nicht sinnvoll ist.

von Hans (Gast)


Lesenswert?

Wenn ich eine reine Adressberechnung verwende geht es - aber auch nur im 
Prinzip.

DDR[0] = pgm_read_byte( number + 0) ;
DDR[1] = pgm_read_byte( number + 1) ;
DDR[2] = pgm_read_byte( number + 2) ;

Hier taucht ein neues Problem auf - das Programm geht jeweils 3 Bytes 
weiter! Bedingt durch die zweidimensionale Definition?

number + 0 * 3,
number + 1 * 3,
number + 2 * 3,

usw.

Wenn ich ein eindimensionales Array verwende ist dies kein Problem, aber 
bei mehrdimensionalen ist das ziemlich doof.

von Falk B. (falk)


Lesenswert?

@  Hans (Gast)

>Funktioniert 'leider' nicht.

Dann ist deine Arraydefinition Schrott, weil du schlauer sein wolltest 
und einen eigenen Datentyp falsch definiert hast.

So ist es richtig.
1
char number [8][3] PROGMEM =
2
  {
3
   {0x00, 0x00, 0x00},
4
   {0x04, 0x00, 0x00},
5
   {0x00, 0x00, 0x00},
6
   {0x01, 0x04, 0x00},
7
   {0x01, 0x02, 0x00},
8
   {0x01, 0x02, 0x04},
9
   {0x01, 0x02, 0x03},
10
   {0x03, 0x00, 0x00},
11
  } ;

> Ist aber auch verständlich, da number...
>bereits eine Adresse ist,

Keine Sekunde. number[1][0] ist der INHALT.

> so dass die Angabe von '&' nicht sinnvoll ist.

Und ob. Hab ich vor kurzem sehr ausführlich prorammiert, und es lief 
sehr gut.

MFG
Falk

von Hans (Gast)


Lesenswert?

> Dann ist deine Arraydefinition Schrott, weil du schlauer sein wolltest
> und einen eigenen Datentyp falsch definiert hast.

Immer langsam mit den Pferden: Der Typ prog_char stammt nicht von mir, 
sonder stammt aus <avr/pgmspace.h>, die zu WinAVR gehört.

> Keine Sekunde. number[1][0] ist der INHALT.

Ich habe geschrieben, dass number eine Adresse ist, nicht das 
numer[1][0] eine ist.

von Hans (Gast)


Lesenswert?

Hier die Lösung aus dem Arduino Forum: 
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1252379907

von Hansi (Gast)


Lesenswert?

Hans schrieb:
> Hier die Lösung aus dem Arduino Forum:
> http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1252379907
Die Lösung stand also die ganze Zeit schon im zweiten Beitrag...

von Klaus W. (mfgkw)


Lesenswert?

Das wäre ja zu einfach; man kann auch mehrere Foren gleichzeitig mit 
diffusen Beschreibungen beschäftigen.
Sind ja nur gelangweilte Arbeitslose hier...

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.