Forum: Mikrocontroller und Digitale Elektronik pgmspace.h mehrere dateien speichern.


von E. L. (robo-man)


Lesenswert?

Hallo! Ich spiele hier gerade mit einem Grafikdisplay und probiere 
gerade aus mit der pgmspace.h zwei verschiedene bilder in den flash zu 
schreiben.
Aber aus irgend einem Grund wird mir immer nur das erste bild 
ausgegeben. Warum? Ich habs schonmal probiert das erste bild im programm 
auszukommentieren und nur das zweite zu brennen aber es kommt immer nur 
das erste bild.

Ausschnitt:

const prog_uint8_t  bild [] = {0x00,0x02,0x03........};
const prog_uint8_t  bild_2 [] = {0x04,0x05,0x06.........};


GLCD_Write_String2(bild_2,0x0C00);
_delay_ms(5000);
GLCD_Display_Clear(0x0C00,graphic_mode,0xff);
_delay_ms(5000);
GLCD_Write_String2(bild,0x0C00);



void GLCD_Write(prog_uint8_t *string, uint16_t ram_adr)
{
GLCD_Write_Data(ram_adr & 0xFF);
GLCD_Write_Data(ram_adr >> 8);
GLCD_Write_Command(0x24);
for(uint16_t i=0; pgm_read_byte_near(&bild[i]) != 2560; i++)
{
//string[i]-=0x20;
GLCD_Write_Data(pgm_read_byte(&bild[i]));
GLCD_Write_Command(0xC0);
if(i>=2560)
break;
}
}

von Karl H. (kbuchegg)


Lesenswert?

Solange du hier
1
for(uint16_t i=0; pgm_read_byte_near(&bild[i]) != 2560; i++)

direkt auf bild zugreifst und nicht den übergebenen Pointer benutzt, 
wird sich das auch nicht ändern :-)

Hier nochmal
1
GLCD_Write_Data(pgm_read_byte(&bild[i]));

von Karl H. (kbuchegg)


Lesenswert?

?

pgm_read_byte_near(&bild[i]) != 2560

wie kann ein Byte den Wert 2560 haben?

von Karl H. (kbuchegg)


Lesenswert?

?

Was'n das?
if(i>=2560)
break;


Schreib doch erst mal die Funktion ordentlich. So richtig mit 
Einrückungen, einer sauberen Struktur und allem drum und drann. Dann 
hast du auch nicht so blödsinnige Fehler.
Und da in einem Bild wohl so ziemlich alle Bytewerte vorkommen werden, 
wird es eine gute Idee sein, wenn der Aufrufer der Funktion die 
Bildgröße bekannt gibt, weil die Funktion die selber nicht ermitteln 
kann.

von E. L. (robo-man)


Lesenswert?

Es sind 2560 Bytes 20x128 Bytes = 2560 Bytes (Horizontal 8bits)
Dislplay 160x128 pixel

von Karl H. (kbuchegg)


Lesenswert?

Eugen L. schrieb:
> Es sind 2560 Bytes 20x128 Bytes = 2560 Bytes (Horizontal 8bits)
> Dislplay 160x128 pixel

Mag alles sein.
Wenn der Aufrufer der Funktion das weiß, ist das in Ordnung. Aber die 
Funktion soll dann doch ja wohl jede beliebige Bildgröße ausgeben 
können. Von daher hat diese Zahl in der Funktion nix verloren. Genau 
dafür gibt es Funktionsargumente, damit ein Aufrufer einer Funktion die 
Funktion mit 'Wissen' versorgen kann.

von E. L. (robo-man)


Lesenswert?

Vielen Dank! Es läuft jetzt endlich. Ich werde aber eure tipps befolgen 
und es ordentlicher schreiben, damit ich das nächste mal selbst den 
fehler sehen kann. Danke Karl Heinz Buchegger!

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.