Forum: Mikrocontroller und Digitale Elektronik Verständnissfrage PROGMEM & Flash


von Jörn A. (joern_)


Lesenswert?

Hy

versuche heute meinen Butterfly bzgl. des Display zu nutzen und habe 
nutze eine fertige Funktion zum schreiben des LCD.  Funktioniert so weit 
auch alles wunderbar aber ich kann keine Paramter übergeben!! Er holt ja 
die "Daten" aus dem Flash aber wieso kann ich n nicht mit übergeben??

das klappt:

char MenuItem1[] PROGMEM= "Rot";
char MenuItem2[] PROGMEM= "Gruen";
char MenuItem3[] PROGMEM= "Blau";
char* MenuItemPointers[] PROGMEM= {MenuItem1, MenuItem2, MenuItem3};
....
LCD_puts_f(MenuItemPointers[2]);

das hier nicht: !!!

char MenuItem1[] PROGMEM= "Rot";
char MenuItem2[] PROGMEM= "Gruen";
char MenuItem3[] PROGMEM= "Blau";
char* MenuItemPointers[] PROGMEM= {MenuItem1, MenuItem2, MenuItem3};
....
n=2
LCD_puts_f(MenuItemPointers[1]);

hier die Funktion:

void LCD_puts_f(const char *FlashData)
{
    strcpy_P((char*)&TextBuffer[0], FlashData);
   LCD_puts((char*)&TextBuffer[0]);
}

von (prx) A. K. (prx)


Lesenswert?

Jörn Ahrens wrote:

> char* MenuItemPointers[] PROGMEM= {MenuItem1, MenuItem2, MenuItem3};
> ....
> LCD_puts_f(MenuItemPointers[2]);

Wenn dies funktioniert, dann eher zufällig, denn MenuItemPointers liegt 
im Flash aber der Zugriff auf MenuItemPointers[2] holt den Pointer aus 
dem RAM. Besser:
  LCD_puts_f(pgm_read_word(&MenuItemPointers[2]));

von Karl H. (kbuchegg)


Lesenswert?

Jörn Ahrens wrote:

> auch alles wunderbar aber ich kann keine Paramter übergeben!! Er holt ja
> die "Daten" aus dem Flash aber wieso kann ich n nicht mit übergeben??

Wozu willst du's mit übergeben?

> das hier nicht: !!!
>
> char MenuItem1[] PROGMEM= "Rot";
> char MenuItem2[] PROGMEM= "Gruen";
> char MenuItem3[] PROGMEM= "Blau";
> char* MenuItemPointers[] PROGMEM= {MenuItem1, MenuItem2, MenuItem3};
> ....
> n=2
> LCD_puts_f(MenuItemPointers[1]);

 LCD_puts_f(MenuItemPointers[n]);

von Jörn A. (joern_)


Lesenswert?

also ich glaube das ganze Zusammenwirken von RAM<->FLASH erschließt sich 
mir noch nicht so ganz.

Zur Zeit möchte ich damit eigentlich nur die Menues anzeigen. mit dem 
Joystick Druck gehe ich durch die Menüs...  hab zur Zeit das ganze durch 
switch(n) gelöst aber das ist ja etwas umständlich.

von Karl H. (kbuchegg)


Lesenswert?

Jörn Ahrens wrote:
> also ich glaube das ganze Zusammenwirken von RAM<->FLASH erschließt sich
> mir noch nicht so ganz.

Ich glaub eher, du hast noch Probleme mit Arrays.

MenuItemPointers ist ein Array von Pointern, wobei jeder Pointer auf 
einen Text zeigt.
Wenn du den 0-ten Text ausgeben lassen willst, dann musst du 
logischerweise auch den 0-Eintrag aus dem Pointer Array nehmen. Willst 
du den 2-ten Text ausgeben, dann musst du logischerweise auch den 2-ten 
Eintrag aus dem Pointer Array nehmen.
Willst du allgemein den n-ten Text ausgeben, dann musst du halt den 
n-ten Pointer aus dem Array nehmen.

Daher:
1
  LCD_puts_f( pgm_read_word( &MenuItemPointers[n] ) );

von Jörn A. (joern_)


Lesenswert?

Hy

das mit den Arrays war nicht das Problem sondern das "pgm_read_word" 
fehlte.... (besten Dank, kannste ich noch nicht)
Ich habe denn Array ja gerade eingeführt, um den n-ten Wert, der den 
Pointer auf den String hat, zu nutzen aber da ich ohne PGM auf irgendwas 
zugriffen hatte war ich verwundert...

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.