Hallöle,
ich habe wieder ein Problem und zwar erstelle ich gerade ein Menü mit
ner switch/case Anweisung. Soweit OK. Bei Tastendruck wird der Menüpunkt
einen hochgezählt
1
// Zahl erhöhen
2
if(R_TRIG(PINC,PIN0)){
3
menuepunkt=menuepunkt+1;
4
lcd_clear();}
Gleichzeitig die LCD Anzeige gelöscht. Das ausgeben auf das Display
erfolgt so:
1
switch(menuepunkt)
2
{
3
4
//################# Schritt 1 ###################
5
case1:
6
7
wert=1;
8
lcd_setcursor(10,2);
9
10
break;
11
12
13
14
//################# Schritt 2 ###################
15
case2:
16
17
wert=2;
18
lcd_setcursor(11,2);
19
20
break;
21
22
//################# Schritt 3 ###################
23
case3:
24
25
wert=3;
26
lcd_setcursor(12,2);
27
28
29
break;
30
31
//################# Schritt 4 ###################
32
case4:
33
34
wert=4;
35
lcd_setcursor(13,2);
36
37
break;
38
39
40
//################# Schritt 5 ###################
41
case5:
42
43
wert=5;
44
lcd_setcursor(14,2);
45
46
break;
47
48
//################# default ###################
49
default:
50
51
lcd_setcursor(1,1);
52
lcd_string("Test");
53
54
break;
55
56
}// Ende der switch
57
58
59
60
61
if(wert>0){
62
itoa(wert,itoa_lcd_buffer,10);
63
lcd_string(itoa_lcd_buffer);}// Ausgabe an das LCD-Display
Nun das Problem. Von 1-5 zählt er ganz vernünftig hoch, es wird auch
immer nur eine Zahl angezeigt. Wenn er dann aber in die "0" springt,
also der default Zweig angezeigt wird. Zeigt das Display das Test an mit
einer 5 dahinter. Also: Test5 steht im Display
Warum frisst er da dieses lcd_clear() nicht ?
Wie man sieht will ich ein Menü erstellen, bin ich da auf dem richtigen
Wege? Oder gibt es da was besseres?
Vielen Dank.
Was ich noch vergessen habe:
Benutze den Atmega8
# 8 kByte Flash-Programmspeicher
# 512 Bytes EEPROM (100.000 Schreib/Lese Zyklen)
# 1K Byte internes SRAM
Dieses Board:
http://shop.myavr.de/Baus%C3%A4tze%20und%20Platinen/myAVR%20Board%20MK2%20USB%20PLUS,%20Bausatz.htm?sp=article.sp.php&artID=47
Und eine Zeile habe ich noch vergessen und zwar das der "wert" > 5
wieder auf Null geschrieben wird und somit die Null in die Zahl kommt
die dann in der default-Anweisung rumzickt.
Hat vielleicht da einer Tips für mich.
PS.: Musste den anderen Benutzernamen löschen, da die email nicht mehr
abrufbar ist und ich das Pwort vergessen habe.
Nachdem dein Programm den Menüpunkt 5 erreicht hat, ist Wert auf 5.
Dieser ändert sich aber im Default-Teil nicht, weshalb er dann hier ein
true erzeugt.
Hallo
Unter default wird lcd_clear überhaupt nicht aufgerufen.
Deine 5 steht da vielleicht noch weiter hinten im Display
und du schreibst Test ab der esrten Position ohne die 5
zu überschreiben.
Gruß
Joachim
Alexander Alexander schrieb:> Nun das Problem. Von 1-5 zählt er ganz vernünftig hoch, es wird auch> immer nur eine Zahl angezeigt. Wenn er dann aber in die "0" springt,
Du zählst "menuepunkt" nur noch. Er springt also nicht in die "0",
sondern in die "6".
Alexander Alexander schrieb:> also der default Zweig angezeigt wird. Zeigt das Display das Test an mit> einer 5 dahinter. Also: Test5 steht im Display
Ja, das soll das Programm auch machen.
Du gibst zunächst "Test" an Position 1,1 aus. Wenn wert>0 gibst Du
zusätzlich "wert" aus. Der ist laut "case 5" auch "5". Es wird also
"Test5" ausgegeben.
Hi und danke schonmal.
Aber bei jedem Tasterdruck wird doch das LCD gelöscht:
1
// Zahl erhöhen
2
if(R_TRIG(PINC,PIN0)){
3
menuepunkt=menuepunkt+1;
4
lcd_clear();}
Über der Switch Anweisung steht auch noch
1
if(menuepunkt>5)
2
menuepunkt=0;
Also kann es doch eigentlich nicht einmal für 1 Zyklus die 6 geben. Aber
auch egal ob 6 oder 0, er springt ja in den default-Zweig.
Da das Display beim Tastendruck ja mit lcd_clear gelöscht wurde muss das
Display dann doch leer sein und im default Zweig nur mit Test
beschrieben werden. Ich finde den Fehler noch nicht.
Aber ich müsste einfach in der default Anweisung noch menuepunkt = 0;
eintragen um somit zu garantieren das der Wert Null ist und nicht noch
über eine evtl. 6 verfügt (Was ich aber nicht verstehe)
Und nicht dann über die Funktion:
1
if(wert>0){
2
itoa(wert,itoa_lcd_buffer,10);
3
lcd_string(itoa_lcd_buffer);}// Ausgabe an das LCD-Display
and das Display geht.
Oder was meint Ihr?
Diesen Fehler werd ich bestimmt noch in den Griff bekommen. Meint Ihr
denn auch das ich so ein Menü aufbauen kann ? Oder gibt es da irgendewas
Resourcenschonenderes? Wobei ich mich mit dem Prog bei 2,8% befinde.
Also nischt....
mfg Alex
Alexander A. schrieb:> Und eine Zeile habe ich noch vergessen und zwar das der "wert" > 5> wieder auf Null geschrieben wird und somit die Null in die Zahl kommt> die dann in der default-Anweisung rumzickt.
"Wert" wird niemals größer 5, weshalb deine if-Anweisung auch "wert"
niemals auf 0 setzen wird.. Da liegt der Hund begraben. Deshalb ist
"wert" auch wenn default ausgeführt wird noch mit 5 belegt und es wird
"Test5" augegeben. Du könntest vor dem Ausführen der switch-Anweisung
"wert" mit 0 belegen, um das Problem aus der Welt zu schaffen.
Gruß Skriptkiddy
Warum wird wert nicht grösser 5 ?
Dieses
if (menuepunkt >5)
menuepunkt = 0;
und dieses
>Und eine Zeile habe ich noch vergessen und zwar das der "wert" > 5> wieder auf Null geschrieben wird und somit die Null in die Zahl kommt> die dann in der default-Anweisung rumzickt.
ist das Gleiche.
Ich weiß nicht, wies denn anderen ergeht.
Ich habe mitlerweile den Überblick verloren, welchen Code du wo
vergessen hast zu posten.
Poste doch bitte komplette Funktionen, dann braucht hier niemand
spekulieren. Am besten übernimmst du die mit Copy&Paste. Noch besser,
wenn das Programm nicht allzulang ist: das komplette Program. Wenns zu
lang ist, dann eben als Anhang. Wenn du lieb bist, speckst du vorher ab,
so dass für das Problem nicht wesentliches rausfliegt, der Fehler aber
noch da ist.
PS: denk mal darüber nach, ob du nicht deinen ganzen switch case mit ein
paar Formeln erschlagen kannst. Rechnen gehört zu den
Lieblingsbeschäftigungen eines Computers :-)
Alexander A. schrieb:> Warum wird wert nicht grösser 5 ?
Wert ist nicht mit menuepunkt gleichzusetzen!!!
Und wie KHB schon sagte: Poste mal deinen aktuellen Code.
Alexander A. schrieb:> Über der Switch Anweisung steht auch noch> if (menuepunkt >5)> menuepunkt = 0;
Nö, in Deinem Ursprungspost nicht.
Alexander A. schrieb:> Und eine Zeile habe ich noch vergessen und zwar das der "wert" > 5> wieder auf Null geschrieben wird und somit die Null in die Zahl kommt> die dann in der default-Anweisung rumzickt.
Dann schreib das bitten in den geposteten Code.
Und an welcher Stelle steht das dann?
Also nochmal deinen kompletten code als Anhang. Nicht abgeschrieben,
sondern direkt hochgeladen.
Skript Kiddy schrieb:> Alexander A. schrieb:>> Warum wird wert nicht grösser 5 ?>> Wert ist nicht mit menuepunkt gleichzusetzen!!!>> Und wie KHB schon sagte: Poste mal deinen aktuellen Code.
Skript Kiddy hat Recht.
Die Variable wert und die Variable menuepunkt sind verschiedene
Variablen.
Die Variable wert wird nirgends hochgezählt, sondern ihr wird direkt ein
Wert zugewiesen(Bsp. wert = 3). Desahlb kann wert niemals größer als 5
werden. Wenn dein Programm nach default springt wird an der Variablen
wert nichts geändert und diese behält somit den zuletzt geschriebenen
Wert und wird auch ausgegeben, da Wert j nie größer 5 werden kann.