Forum: Mikrocontroller und Digitale Elektronik Problem mit lcd_clear ?


von Alexander A. (alex0815)


Lesenswert?

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
 case 1:
6
 
7
  wert  = 1;
8
  lcd_setcursor( 10, 2 );
9
10
 break;
11
12
13
14
//################# Schritt 2 ###################
15
 case 2:
16
 
17
 wert  = 2;
18
 lcd_setcursor( 11, 2 );
19
20
 break;
21
22
//################# Schritt 3 ###################
23
 case 3:
24
 
25
 wert  = 3;
26
 lcd_setcursor( 12, 2 );
27
28
29
 break;
30
31
//################# Schritt 4 ###################
32
 case 4:
33
 
34
 wert  = 4;
35
 lcd_setcursor( 13, 2 );
36
37
 break;
38
39
40
//################# Schritt 5 ###################
41
 case 5:
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.

von Alexander A. (alexander_der_grosse)


Lesenswert?

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.

von Oliver J. (skriptkiddy)


Lesenswert?

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.
1
if (wert >0)

von XXX (Gast)


Lesenswert?

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

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

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.

von Alexander A. (alexander_der_grosse)


Lesenswert?

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.

von Alexander A. (alexander_der_grosse)


Lesenswert?

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

von Oliver J. (skriptkiddy)


Lesenswert?

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

von Alexander A. (alexander_der_grosse)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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 :-)

von Oliver J. (skriptkiddy)


Lesenswert?

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.

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

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.

von Uwe P. (strom12)


Lesenswert?

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.

von Alexander A. (alexander_der_grosse)


Lesenswert?

Ihr habt ja mit den wert = menuepunkt recht. Fehler erkannt.

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.