mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit lcd_clear ?


Autor: Alexander Alexander (alex0815)
Datum:

Bewertung
0 lesenswert
nicht 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
// Zahl erhöhen
if( R_TRIG( PINC, PIN0 )) {
    menuepunkt = menuepunkt + 1;     
    lcd_clear();}

Gleichzeitig die LCD Anzeige gelöscht. Das ausgeben auf das Display 
erfolgt so:


switch(menuepunkt)
{

//################# Schritt 1 ###################
 case 1:
 
  wert  = 1;
  lcd_setcursor( 10, 2 );

 break;



//################# Schritt 2 ###################
 case 2:
 
 wert  = 2;
 lcd_setcursor( 11, 2 );

 break;

//################# Schritt 3 ###################
 case 3:
 
 wert  = 3;
 lcd_setcursor( 12, 2 );


 break;

//################# Schritt 4 ###################
 case 4:
 
 wert  = 4;
 lcd_setcursor( 13, 2 );

 break;


//################# Schritt 5 ###################
 case 5:
 
 wert  = 5;
 lcd_setcursor( 14, 2 );

 break;

//################# default ###################
 default:

 lcd_setcursor( 1, 1 );
 lcd_string("Test");

break;

} // Ende der switch




if (wert >0) {
 itoa( wert, itoa_lcd_buffer, 10 );
 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.

Autor: Alexander A. (alexander_der_grosse)
Datum:

Bewertung
0 lesenswert
nicht 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%20Platine...


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.

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht 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.
if (wert >0)

Autor: XXX (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christian H. (netzwanze) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Alexander A. (alexander_der_grosse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi und danke schonmal.
Aber bei jedem Tasterdruck wird doch das LCD gelöscht:
// Zahl erhöhen
if( R_TRIG( PINC, PIN0 )) {
    menuepunkt = menuepunkt + 1;     
    lcd_clear();}

Über der Switch Anweisung steht auch noch
if (menuepunkt >5)
    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.

Autor: Alexander A. (alexander_der_grosse)
Datum:

Bewertung
0 lesenswert
nicht 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:
if (wert >0) {
 itoa( wert, itoa_lcd_buffer, 10 );
 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

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alexander A. (alexander_der_grosse)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christian H. (netzwanze) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Uwe P. (strom12)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Alexander A. (alexander_der_grosse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ihr habt ja mit den wert = menuepunkt recht. Fehler erkannt.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.