PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mit Peter Fleury's Lib mittels lcd_puts_p Daten auslesen



DerSchatten
14.02.2010, 16:24
Ich möchte gerne mittels der Funktion lcd_puts_p von Peter Fleury's LCD-Library Daten aus dem Flash auslesen, die ich von verschiedenen Variablen bereitstelle:



const char menu_000[] PROGMEM = " Multifunktions "; //
const char menu_001[] PROGMEM = "ArcadeController"; //
const char menu_002[] PROGMEM = "** HAUPTMENUE **"; //

const char menu_100[] PROGMEM = "Tastenzuordnung "; // 0
const char menu_101[] PROGMEM = "[X ] 1"; // 1
const char menu_102[] PROGMEM = "[XX ] 2"; // 2
const char menu_103[] PROGMEM = "[XXX ] 3"; // 3
const char menu_104[] PROGMEM = "[XXXX ] 4"; // 4
const char menu_105[] PROGMEM = "[XXXXX ] 5"; // 5
const char menu_106[] PROGMEM = "[XXXXXX ] 6"; // 6
const char menu_107[] PROGMEM = "[XXXXXXX ] 7"; // 7
const char menu_108[] PROGMEM = "[XXXXXXXX ] 8"; // 8
const char menu_109[] PROGMEM = "[XXXXXXXXX] 9"; // 9

const char menu_200[] PROGMEM = " Dauerfeuer "; // 10
const char menu_201[] PROGMEM = "[ ] AUS"; // 11
const char menu_202[] PROGMEM = "[X ] 1"; // 12
const char menu_203[] PROGMEM = "[XX ] 2"; // 13
const char menu_204[] PROGMEM = "[XXX ] 3"; // 14
const char menu_205[] PROGMEM = "[XXXX ] 4"; // 15
const char menu_206[] PROGMEM = "[XXXXX ] 5"; // 16
const char menu_207[] PROGMEM = "[XXXXXX ] 6"; // 17
const char menu_208[] PROGMEM = "[XXXXXXX ] 7"; // 18
const char menu_209[] PROGMEM = "[XXXXXXXX ] 8"; // 19
const char menu_210[] PROGMEM = "[XXXXXXXXX] 9"; // 20

const char menu_300[] PROGMEM = " Beleuchtung "; // 21
const char menu_301[] PROGMEM = "[ ] AUS"; // 22
const char menu_302[] PROGMEM = "[X ] 1"; // 23
const char menu_303[] PROGMEM = "[XX ] 2"; // 24
const char menu_304[] PROGMEM = "[XXX ] 3"; // 25
const char menu_305[] PROGMEM = "[XXXX ] 4"; // 26
const char menu_306[] PROGMEM = "[XXXXX ] 5"; // 27
const char menu_307[] PROGMEM = "[XXXXXX ] 6"; // 28
const char menu_308[] PROGMEM = "[XXXXXXX ] 7"; // 29
const char menu_309[] PROGMEM = "[XXXXXXXX ] 8"; // 30
const char menu_310[] PROGMEM = "[XXXXXXXXX ] 9"; // 31
const char menu_311[] PROGMEM = "[XXXXXXXXXX] 10"; // 32

const char menu_400[] PROGMEM = " LED-Test "; // 33
const char menu_401[] PROGMEM = " [EIN] AUS "; // 34
const char menu_402[] PROGMEM = " EIN [AUS] "; // 35

const char menu_500[] PROGMEM = " Speichern "; // 36

const char menu_600[] PROGMEM = " Beenden "; // 37


typedef struct def_menustruktur
{
const char *text;

unsigned char next;
unsigned char previous;
unsigned char sub;
unsigned char up;

unsigned char ActionCode;
uint8_t ActionValue;
}menustruktur;

// Tabelle von Zeigern auf die Texte erstellen
// ===========================================
menustruktur menu[] PROGMEM =
{
{menu_100, 10, 0, 1, 0, NO_ACTION, 0},
{menu_101, 2, 1, 0, 0, DEF_KEY_ACTION, 1},
{menu_102, 3, 1, 0, 0, DEF_KEY_ACTION, 2},
{menu_103, 4, 2, 0, 0, DEF_KEY_ACTION, 3},
{menu_104, 5, 3, 0, 0, DEF_KEY_ACTION, 4},
{menu_105, 6, 4, 0, 0, DEF_KEY_ACTION, 5},
{menu_106, 7, 5, 0, 0, DEF_KEY_ACTION, 6},
{menu_107, 8, 6, 0, 0, DEF_KEY_ACTION, 7},
{menu_108, 9, 7, 0, 0, DEF_KEY_ACTION, 8},
{menu_109, 9, 8, 0, 0, DEF_KEY_ACTION, 9},
{menu_200, 21, 0, 11, 10, NO_ACTION, 0},
{menu_201, 12, 11, 10, 10, DEF_REPEAT_ACTION, 0},
{menu_202, 13, 11, 10, 10, DEF_REPEAT_ACTION, 1},
{menu_203, 14, 12, 10, 10, DEF_REPEAT_ACTION, 2},
{menu_204, 15, 13, 10, 10, DEF_REPEAT_ACTION, 3},
{menu_205, 16, 14, 10, 10, DEF_REPEAT_ACTION, 4},
{menu_206, 17, 15, 10, 10, DEF_REPEAT_ACTION, 5},
{menu_207, 18, 16, 10, 10, DEF_REPEAT_ACTION, 6},
{menu_208, 19, 17, 10, 10, DEF_REPEAT_ACTION, 7},
{menu_209, 20, 18, 10, 10, DEF_REPEAT_ACTION, 8},
{menu_210, 20, 19, 10, 10, DEF_REPEAT_ACTION, 9},
{menu_300, 33, 10, 22, 21, NO_ACTION, 0},
{menu_301, 23, 22, 21, 21, LCD_ACTION, 0},
{menu_302, 24, 22, 21, 21, LCD_ACTION, 25},
{menu_303, 25, 23, 21, 21, LCD_ACTION, 50},
{menu_304, 26, 24, 21, 21, LCD_ACTION, 75},
{menu_305, 27, 25, 21, 21, LCD_ACTION, 100},
{menu_306, 28, 26, 21, 21, LCD_ACTION, 125},
{menu_307, 29, 27, 21, 21, LCD_ACTION, 150},
{menu_308, 30, 28, 21, 21, LCD_ACTION, 175},
{menu_309, 31, 29, 21, 21, LCD_ACTION, 200},
{menu_310, 32, 30, 21, 21, LCD_ACTION, 225},
{menu_311, 32, 31, 21, 21, LCD_ACTION, 255},
{menu_400, 36, 21, 34, 33, NO_ACTION, 0},
{menu_401, 35, 34, 33, 33, LED_ACTION, 0},
{menu_402, 35, 34, 33, 33, LED_ACTION, 1},
{menu_500, 37, 33, 36, 36, SAVE_ACTION, 1},
{menu_600, 37, 36, 37, 37, EXIT_ACTION, 1}
};

unsigned char menu_index = 0;


Wenn ich jetzt versuche das ganze mittels:



menu_index = menu[menu_index].up;
lcd_puts_p(menu[menu_index].text);

auszulesen bekomme ich nur verstümmelte Zeichen.
Ich vermute das der Fehler bei einer falschen deklaration einer Variable liegt. Nur ich finde den Fehler nicht.
Laut der Funktion lcd_puts_p müssen die Werte ein const char sein.
Was bei mir ja auch zutrifft, oder nicht?

sternst
14.02.2010, 16:39
Ich dachte eigentlich, du hättest längst mitbekommen, dass man Daten aus dem Flash mit den dafür vorgesehen Funktionen lesen muss.

DerSchatten
14.02.2010, 16:42
Und was ist an der Funktion lcd_puts_p falsch?



"print string from program memory on lcd"

sternst
14.02.2010, 16:52
Und was ist mit menu[menu_index].up? Wo ist das gespeichert?
Und was ist mit dem Pointer, den du an die Funktion übergibst? Wo ist der gespeichert?

DerSchatten
14.02.2010, 17:06
Und was ist mit menu[menu_index].up? Wo ist das gespeichert?
Und was ist mit dem Pointer, den du an die Funktion übergibst? Wo ist der gespeichert?
Das ist schon zumindest ein Anhaltspunkt.
Ich muß also meine Struktur in den Flash bringen.

Wäre das so richtig?



typedef struct def_menustruktur
{
const char *text;

unsigned char next;
unsigned char previous;
unsigned char sub;
unsigned char up;

unsigned char ActionCode;
uint8_t ActionValue;
}PROGMEM menustruktur;


Oder muß jede einzelne Variable ins PROGMEN?

sternst
14.02.2010, 17:14
Ich muß also meine Struktur in den Flash bringen.
Die Struktur ist bereits im Flash. Das ist ja der Knackpunkt. Du musst die Elemente der Strktur mit den Flash-Funktionen lesen.

DerSchatten
14.02.2010, 17:41
Ich verstehs zwar nicht (denn lcd_puts_p macht ja nichts anderes als pgm_read_byte davorzuschreiben) aber mit:


lcd_puts_p(pgm_read_byte(&menu[menu_index].text));


funktioniert zumindest der erste Teil schon mal.

Jetzt hab ich jedoch wieder diese öde Warnung:
../main.c:362: warning: passing argument 1 of 'lcd_puts_p' makes pointer from integer without a cast

sternst
14.02.2010, 17:57
funktioniert zumindest der erste Teil schon mal.
Aber nur mit viel Glück. Falsche pgm_read-Funktion benutzt.

DerSchatten
14.02.2010, 18:20
ok, pgm_read_word dürfte korrekt sein.
Wie bekomme ich jetzt noch diese Warnung weg?

uwegw
14.02.2010, 18:28
Indem du den geforderten Cast machst?

DerSchatten
14.02.2010, 18:38
Indem du den geforderten Cast machst?
Aber die eigentliche Ursache muß ja wo anders liegen.

sternst
14.02.2010, 20:20
Die Funktion gibt ein uint16_t zurück, schließlich kann die Funktion ja auch nicht wissen, welchen Datentyp das "Word" eigentlich hat. Also musst du den Rückgabewert in den gewünschten Typ casten.

DerSchatten
15.02.2010, 00:40
Und wie geht das vor sich?

DerSchatten
16.02.2010, 13:18
Kann ich das problem nicht anders lösen? Ohne den Rückgabewert zu verfälschen? (Casten)

sternst
16.02.2010, 16:33
Da wird nichts "verfälscht". Und wenn du partout keinen Cast haben willst, dann musst du halt deine eigene Funktion zum Lesen des Flash schreiben, die dann den richtigen Rückgabe-Typ hat.