Forum: Mikrocontroller und Digitale Elektronik selbstdefiniertes Zeichen wird am LCD nicht richtig ausgegeben


von Jan P. (jiss)


Lesenswert?

Hallo,

ich habe mir bei einem LCD 8 Zeichen selbst definiert, welche auf den 
Adressen 0x00 bis 0x07 liegen.
Wenn ich mit lcd_write_char(0x00) z.b. das erste zeichen anzeigen lassen 
will, dann funktioniert dies ohne probleme.
wenn ich mit lcd_write_char(LCD_SYMBOL_CANCEL) das auszugebende Zeichen 
an das LCD senden will, wird dieses auch richtig angezeigt.

Nun möchte ich aber folgendes machen:
1
  menu_content[0][0].button.level_up.symbol    = LCD_SYMBOL_CANCEL;
2
  menu_content[0][0].button.back.symbol        = LCD_SYMBOL_UP;
3
  menu_content[0][0].button.forward.symbol     = LCD_SYMBOL_DOWN;
4
  menu_content[0][0].button.ok.symbol          = LCD_SYMBOL_OK;

wobei die Zeichen über defines wie folgt definiert sind:
1
  // self-defined symbols for LCD
2
  #define        LCD_SYMBOL_CANCEL    0b00000000      // symbol cancel
3
  #define        LCD_SYMBOL_LEFT      0b00000001      // symbol left
4
  #define        LCD_SYMBOL_RIGHT     0b00000010      // symbol right
5
  #define        LCD_SYMBOL_UP        0b00000011      // symbol up
6
  #define        LCD_SYMBOL_DOWN      0b00000100      // symbol down
7
  #define        LCD_SYMBOL_OK        0b00000101      // symbol ok
8
  #define        LCD_SYMBOL_SELECT    0b00000110      // symbol select
9
  #define        LCD_SYMBOL_LEVEL_UP  0b00000111      // symbol level up

Wenn ich nun mit lcd_write_char-Funktion das CANCEL-Symbol ausgeben 
lassen möchte, dann wird mir nur mist angezeigt (irgendwelche anderen 
ascii-zeichen):
1
lcd_write_char(menu_content[0][0].button.level_up.symbol);

als datentyp für "menu_content[0][0].button.level_up.symbol" habe ich 
sowohl char als auch int ausprobiert und es funktioniert bei beiden 
nicht.
mit char als 8-bit datentyp sollte es doch aber funktionieren???

das display wird im 4-bit modus betrieben.

von Falk B. (falk)


Lesenswert?

Wahrscheinlich hast du beim Laden des CG-RAMs einen Bug drin. Lass man 
den ganzen Schnulli weg ud gibt einfach direkt die Zeichen 0-7 aus. Dann 
weißt du woran du bist.

MFG
Falk

von Jan P. (jiss)


Lesenswert?

Falk Brunner schrieb:
> Wahrscheinlich hast du beim Laden des CG-RAMs einen Bug drin. Lass man
> den ganzen Schnulli weg ud gibt einfach direkt die Zeichen 0-7 aus. Dann
> weißt du woran du bist.
>
> MFG
> Falk

Wieso sollte da ein Bug sein? Wenn ich wie gesagt die Adresse direkt in 
lcd_write_char eintrage, dann funktioniert es doch.
hier liegt irgendwie ein problem beim datentyp vor, denn wenn ich.z.b. 
mittels
1
if (menu_content[0][0].button.level_up.symbol == LCD_SYMBOL_CANCEL)
2
{ ...
3
}
4
else
5
{
6
...
7
}

abfrage, was in der variablen steht, wird immer der else-zweig 
aufgerufen.

von Falk B. (falk)


Lesenswert?

@Jan Peukert (jiss)

>Wieso sollte da ein Bug sein? Wenn ich wie gesagt die Adresse direkt in
>lcd_write_char eintrage, dann funktioniert es doch.

Das hast du aber scheinbar nur für Adresse 0 geprüft.

>Wenn ich mit lcd_write_char(0x00) z.b. das erste zeichen anzeigen lassen
>will, dann funktioniert dies ohne probleme.

>abfrage, was in der variablen steht, wird immer der else-zweig
>aufgerufen.

Kann es sein, dass du auf einem AVR programmierst und die Menus im FLash 
liegen? Dann muss man nämlich mit pgm_read_byte drauf zugreifen. Bzw. 
Zeig doch einfach mal deinen VOLLSTÄNDIGEN Quelltext als Anhang.

MFG
Falk

von Helfer (Gast)


Lesenswert?

1) Wenn du in Zeile
> if (menu_content[0][0].button.level_up.symbol == LCD_SYMBOL_CANCEL)
einen Breakpoit im Debugger setzt und dir beim Auftreffen auf den 
Breakpoint den Inhalt der Variablen anzeigen lässt - was steht in der 
Variablen drin? Ich würde mir

2) Solltest du bei der Definition von 
menu_content[0][0].button.level_up.symbol unions verwendet haben, denk 
daran, dass Variablen mit unterschiedlichem Namen auf dem gleichen 
Speicherplatz liegen. Es ist dann hochwahrscheinlich nicht den 
erwarteten Inhalt zu finden.

von Walter S. (avatar)


Lesenswert?

Jan Peukert schrieb:
> Wieso sollte da ein Bug sein? Wenn ich wie gesagt die Adresse direkt in
> lcd_write_char eintrage, dann funktioniert es doch.
> hier liegt irgendwie ein problem beim datentyp vor, denn wenn ich.z.b.
> mittels

wenn du das schon selber vermutest warum zeigst du verdammt noch Mal 
nicht wie du dieses ominöse Menu definiert hast

von Jan P. (jiss)


Angehängte Dateien:

Lesenswert?

Hier mal alle notwendigen Projektdateien von mir.
in der main() wird die Funktion menu_show_select_and_scroll(...) (siehe 
menu.c) aufgerufen und an diese mit den zuvor definierten Dimensionen 
dim_1 und dim_2 mitgeteilt, dass das MAIN-MENU dargestellt werden soll.
In der menu_init() werden die Menüstrukturen angelegt und dort auch die 
Symbole für die letzte Zeile, welche meine Button-Zeile werden soll, in 
der zuvor genannten Struktur angelegt.

Mit den beiden Funktionen lcd_init() und lcd_selfdefined_symbols() 
werden das Display initialisiert und die selbsterstellten Symbole in den 
CGRAM geladen. Die Symboladressen sind über meine Defines LCD_SYMBOL_XXX 
mit den Adressen 0x00 bis 0x07 festgelegt (in binärschreibweise)

von Walter (Gast)


Lesenswert?

wie gross ist dein Speicherbedarf?
Allein das Menue schätze ich schon Mal auf ca. 1KByte

von Jan P. (jiss)


Lesenswert?

Walter schrieb:
> wie gross ist dein Speicherbedarf?
> Allein das Menue schätze ich schon Mal auf ca. 1KByte
1
Program:   14538 bytes (22.2% Full)
2
(.text + .data + .bootloader)
3
4
Data:       1738 bytes (42.4% Full)
5
(.data + .bss + .noinit)

Bewegt sich immer um diese Zahlen herum. Also noch genügend Luft

von Jan P. (jiss)


Lesenswert?

Ich habe gerade etwas seltsames rausgefunden, wo der Fehler anscheinend 
liegt. Nur kann ich mir den Fehler nicht erklären.
Ist vielleicht der Zugriff auf das übergebene Array innerhalb der 
Funktion fehlerhaft?

Wenn ich alles in der Funktion menu_init() hinter der Zeile
1
  menu_content[1][0].line_menu[2].scroll      = 0;
rauskommentiere, dann funktioniert die Übertragung des Symbols und die 
Anzeige des Menüpunkts main-menu.
Sobald jedoch die Zeile
1
  // button symbols
2
  menu_content[1][0].button.level_up.symbol = LCD_SYMBOL_LEVEL_UP;
hinzukommt ist es aus. Das Menü main-menu wird nicht mehr richtig 
angezeigt und es erscheint Code-Kauderwelsch auf dem LCD:
Schaut euch bitte mal an wie ich die der Datei config_and_constants.h 
den Datentyp für menu_content (als t_menu_content) festgelegt habe. Dort 
muss der Hund scheinbar begraben sein??!??

Hier nochmal der gesamte Inhalt der menu_init() bis zu dieser Stelle:
1
void menu_init(  t_menu_content     menu_content[MENU_ARRAY_DIM_1][MENU_ARRAY_DIM_2], 
2
        t_butt_state     *butt_state,
3
        t_config_pins    *config_pins
4
        )
5
{
6
  // variables & constants
7
  char    string[MENU_LINE_DIM];
8
  char    add_string[MENU_LINE_DIM];
9
  t_string  string_array;
10
11
  // program-code
12
  // fill menu_menu_content with menu structure
13
14
  // main-menu [0][0]
15
  menu_content[0][0].show_line_2          = 1;
16
  menu_content[0][0].show_line_3          = 2;
17
  menu_content[0][0].submenu_count        = 5;
18
  
19
  // title: main-menu
20
  strcpy(menu_content[0][0].line_title,      "<<<< MAIN-MENU >>>> ");
21
  
22
  // menu-lines
23
  strcpy(menu_content[0][0].line_menu[1].text,    "  conf. analog  pins");
24
  menu_content[0][0].line_menu[1].selected     = 0;
25
  menu_content[0][0].line_menu[1].scroll      = 0;
26
27
  strcpy(menu_content[0][0].line_menu[2].text,    "  conf. digital pins");
28
  menu_content[0][0].line_menu[2].selected     = 0;
29
  menu_content[0][0].line_menu[2].scroll      = 0;
30
31
  strcpy(menu_content[0][0].line_menu[3].text,    "  setup controller  ");
32
  menu_content[0][0].line_menu[3].selected     = 0;
33
  menu_content[0][0].line_menu[3].scroll      = 0;
34
35
  strcpy(menu_content[0][0].line_menu[4].text,    "  rev. information  ");
36
  menu_content[0][0].line_menu[4].selected     = 0;
37
  menu_content[0][0].line_menu[4].scroll      = 0;
38
39
  strcpy(menu_content[0][0].line_menu[5].text,    "--------------------");
40
  menu_content[0][0].line_menu[5].selected     = 0;
41
  menu_content[0][0].line_menu[5].scroll      = 0;
42
43
  // button symbols
44
  menu_content[0][0].button.level_up.symbol    = LCD_SYMBOL_CANCEL;
45
  menu_content[0][0].button.back.symbol      = LCD_SYMBOL_UP;
46
  menu_content[0][0].button.forward.symbol    = LCD_SYMBOL_DOWN;
47
  menu_content[0][0].button.ok.symbol        = LCD_SYMBOL_OK;
48
  // enable buttons
49
  menu_content[0][0].button.level_up.enabled    = 0;
50
  menu_content[0][0].button.back.enabled      = 1;
51
  menu_content[0][0].button.forward.enabled    = 1;
52
  menu_content[0][0].button.ok.enabled      = 1;
53
54
55
56
57
58
59
  // sub-menu configure analog pins [1][0]
60
  menu_content[1][0].show_line_2          = 1;
61
  menu_content[1][0].show_line_3          = 2;
62
  menu_content[1][0].submenu_count        = 6;
63
64
  // title: configure analog pins
65
  strcpy(menu_content[1][0].line_title,      " CONFIG ANALOG PINS ");
66
67
  // menu-lines
68
  strcpy(menu_content[1][0].line_menu[1].text,  "  1  2  3  4  5  6  ");
69
  menu_content[1][0].line_menu[1].selected     = 0;
70
  menu_content[1][0].line_menu[1].scroll      = 0;
71
72
  // check status and show symbols
73
  string_array = menu_get_analog_pin_conf_string(config_pins);
74
  strcpy(menu_content[1][0].line_menu[2].text,  string_array.str);
75
  menu_content[1][0].line_menu[2].selected     = 0;
76
  menu_content[1][0].line_menu[2].scroll      = 0;
77
78
  // button symbols
79
  menu_content[1][0].button.level_up.symbol    = LCD_SYMBOL_LEVEL_UP;
80
/*
81
 .
82
 .
83
 .
84
*/
85
}

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.