Forum: Compiler & IDEs AVR progmem array auslesen in Funktion


von Marc (Gast)


Lesenswert?

Da mein RAM im AT90USB1286 voll ist, möchte ich den Text der LCD 
Menüpunkte im Flash ablegen. Das klappt auch soweit. Hier ein Beispiel 
eines Menüs:
1
static const char string_1[] PROGMEM ="1 SWR Alarm";
2
...
3
static const char string_11[] PROGMEM ="0 Exit";
4
5
const char * const level0_menu_items[] PROGMEM =
6
{
7
  string_1, string_2, string_3, 
8
  string_4, string_5, string_6,
9
  string_7, string_8, string_9,
10
  string_10, string_11
11
};

Ich kann nun mit dem Aufruf
1
lcd_scroll_Menu(Pointer auf Menü, menu_size, current_selection);

meine Funktion aufrufen in der die Daten vom level0_menu_items 
dargestellt werden, wobei "Pointer auf Menü" erstmal null ist.
"Pointer auf Menü" soll später der Zeiger für das jeweilge Menü sein.
Jetzt habe ich aber weitere Menüpunkte und daher macht es wenig Sinn für 
jeden Menüpunkt eine eigene Funktion zu erstellen. Daher dachte ich mir 
es müsste doch auch mit Pointer gehen. Nur leider kenn ich mich damit 
nicht gut genug aus und benötige hier Hilfe.
1
void lcd_scroll_Menu(Pointer auf Menu, uint8_t menu_size, uint8_t current_choice)
2
{
3
 char buffer[21];
4
lcdGotoXY(0,1);
5
strcpy_P(buffer, (PGM_P)pgm_read_word(&(level0_menu_items[current_choice])));
6
lcdPrintData(buffer,strlen(buffer));
7
_delay_ms(1000);
8
}

menu_size soll später mit Leben gefüllt werden.

Kann mir jemand zeigen wie ich mit einer Funktion die Inhalte der 
verschiedenen Menüpunkte anzeigen kann? Als Übergabe soll ein Zeiger auf 
das jeweilige Array oder Menü sein.

Gruß Marc

von Falk B. (falk)


Lesenswert?

@ Marc (Gast)

>static const char string_1[] PROGMEM ="1 SWR Alarm";

Bei einem halbwegs aktuellen avr gcc nimmt man besser __flash.

https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Flash_mit_flash_und_Embedded-C
1
const char __flash string_1[]   = "1 SWR Alarm";
2
const char __flash string_11[]  = "0 Exit";
3
4
const __flash char* const __flash menu_items[][10] PROGMEM =
5
{
6
  /* menu 0 */
7
  {string_1, string_2, string_3, 
8
  string_4, string_5, string_6,
9
  string_7, string_8, string_9,
10
  string_10, string_11},
11
12
  /* menu 1 */
13
  {string_1, string_2, string_3, 
14
  string_4, string_5, string_6,
15
  string_7, string_8, string_9,
16
  string_10, string_11}
17
18
};
19
20
void lcd_scroll_Menu(uint8_t menu, uint8_t item)
21
{
22
   char buffer[21];
23
24
   strcpy_P(buffer, menu_items[menu][item]);
25
   lcdGotoXY(0,1);
26
   lcdPrintData(buffer,strlen(buffer));
27
}

Das mit dem _delay_ms(1000) gewöhnst du die am besten gleich wieder ab! 
Siehe Multitasking!!!

>Kann mir jemand zeigen wie ich mit einer Funktion die Inhalte der
>verschiedenen Menüpunkte anzeigen kann? Als Übergabe soll ein Zeiger auf
>das jeweilige Array oder Menü sein.

Dazu reicht hier ein 2D Array, denn es sind ja alles nur Pointer. Man 
kann es auch über ein struct und verkettete Listen machen.

: Bearbeitet durch User
von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Das #include <avr/pgmspace.h> kann i.d.R. entfallen.

Falk B. schrieb:
1
> const __flash char* const __flash menu_items[][10] PROGMEM =

Das PROGMEM kann und sollte weg.

von Marc (Gast)


Lesenswert?

Danke euch beiden. Klappt einwandfrei.

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.