Hallo,
ich habe einen etwas kuriosen Fehler.
Ich habe ein etwas umfangreicheres projekt, welches unter anderem ein
menü enthält.
Um das Menü dynamischer zu machen, wird für jeden Menüpunkt eine
Variable mit der Struktur
Meine Menüfunktion wechselt dann entsprechend der Eingabe zum vorherigen
(prev), nächsten (next) darunterliegenden (child) oder darüberliegenden
(parent) Menüpunkt, bzw. ruft, falls vorhanden die entsprechende
Menüfunktion (z.B. Einstellungen vornehmen) auf.
Menüfunktion:
1
// Funktionen für die Menünavigation
2
voidmenue(structmenueP*tmp)
3
{
4
5
void(*function)(uint8_t);
6
uint8_tkeybrd;
7
8
deact_tmr();// alle Timer aus
9
10
lcd_bg(1);// Displaybeleuchtung an
11
lcd_bg_time=1;// beleuchtung dauernd an
12
13
while(tmp){
14
15
// -- Innerhalb des Menüs
16
17
// Funktion zuordnen
18
function=tmp->func;
19
20
// Tastaturpuffer löschen
21
keybrd=0x00;
22
23
24
// Anzeigen des Menüpunktes
25
lcd_clear();// Display löschen
26
27
while(!(keybrd)){
28
29
if(_KEYBRD)_keybrd(&keybrd);// Tastatur abfragen
30
31
lcd_string(tmp->name);// Menüpunkt-Namen anzeigen
32
33
// Symbol anzeigen
34
lcd_setcursor(7,2);
35
lcd_string(">");
36
37
// ggf.Funktion aufrufen
38
if((keybrd&BTN_ENTER)&&*function){
39
40
// Display löschen
41
lcd_clear();
42
43
// Tastaturpuffer löschen
44
keybrd=0x00;
45
46
// Funktion aufrufen
47
(*function)(tmp->fdata);
48
49
// Tastaturpuffer löschen
50
keybrd=0x00;
51
52
// Display löschen
53
lcd_clear();
54
55
}
56
57
// Warten auf Benutzereingabe
58
if((keybrd&BTN_MENUE))tmp=tmp->parent;// nach oben
59
if((keybrd&BTN_ENTER)&&!function)tmp=tmp->child;// nach unten
60
if((keybrd&BTN_UP))tmp=tmp->prev;// zurück
61
if((keybrd&BTN_DOWN))tmp=tmp->next;// vorwärts
62
63
_delay_ms(100);
64
65
}
66
67
}
68
69
lcd_clear();// Display löschen
70
act_int();// alle Timer wieder an
71
72
flash_time=0;// Alarmflag aus
73
lcd_bg_time=0;// LCD Hintergrundbeleuchtung aus
74
75
_delay_ms(100);
76
77
}
Das Funktioniert auch einwandfrei.
Füge ich jetzt aber einen weiteren mMenüunkt '05' mit zwei Unterpunkten
hinzu, über die Einstellungen im EEPROM gespeichert bzw. aus dem EEPROM
geladen werden sollen, erscheinen beim Wechsel von Punkt 02 zu 03 oder
von 04 zu 03 nur kryptische Zeichen auf dem Display und eine Steuerung
ist nicht möglich.
Teilweise wird beim Drücken der Menütasten dann auch meine Startfunktion
(die alles initialisiert) aufgerufen, was sonst nur in der main() vor
meiner while(1){...}-Schleife (aus der wird das Menü aufgerufen)
geschieht.
Der Datnespeicher ist dann auch bei 98% und der Programmspeicher bei 60%
Der Menüpunkt '05' funktioniert einwandfrei.
Ich vermute, dass die Variable für Menüpunkt 03 irgendwo am Ende des
RAMs liegt und die Speicherzelle nicht richtig beschreibbar ist (ev. ist
dort der Bootloader?).
Kann mir jemand helfen, dieses Problem zu lösen?
Hannes E. schrieb:> Teilweise wird beim Drücken der Menütasten dann auch meine Startfunktion> (die alles initialisiert) aufgerufen,
Passiert dann beim Drücken einer Taste immer das selbe?
Oder jedesmal was anderes?
> Ich vermute, dass die Variable für Menüpunkt 03 irgendwo am Ende des> RAMs liegt und die Speicherzelle nicht richtig beschreibbar ist
Der Stack braucht auch noch Platz im Datenspeicher...
Würde es dazu nicht genügen Variabeln mit den Strings als Wert zu
initialisieren?
Durch die Seite (hinterm Link) steige ich noch nicht ganz durch.
Das bläst meinen RAM doch nur noch mehr auf oder?
Hannes E. schrieb:> Würde es dazu nicht genügen Variabeln mit den Strings als Wert zu> initialisieren?
Nein.
Im Moment machst du dir dein SRAM mit Texten dicht, die eigentlich kein
Mensch im SRAM braucht.
> Durch die Seite (hinterm Link) steige ich noch nicht ganz durch.http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmspeicher_.28Flash.29> Das bläst meinen RAM doch nur noch mehr auf oder?
Das genaue Gegenteil ist der Fall.
Das entlastet dein RAM