Forum: Mikrocontroller und Digitale Elektronik Hilfe zu einem Programm


von Anfänger158 (Gast)


Lesenswert?

hallo,

Ich habe ein kleines menü für das LCD display geschrieben.
Ich verwende das MY avr MK2 board mit atmege 8.
Meine frage wäre, wie ich das Blinken(aktualisiern) des Display weg 
bekomme.
Hier der Programm code

  while(1){

  if (!(PINB & (1<<PB0)))
    {
      zaehler++;
    }

    if (!(PINB & (1<<PB1)))
    {
      zaehler--;
    }




  if (zaehler == 0)
  {
  lcd_clear();
  lcd_write_s("Drahtmessung");
  if (!(PINB & (1<<PB0)))
    {
      zaehler++;
      _delay_ms(300);
    }
  }
    else if (zaehler == 1)
    {
    lcd_clear();
    lcd_write_s("Messung Starten");
    if (!(PINB & (1<<PB0)))
    {
      zaehler++;
      _delay_ms(300);
    }

    if (!(PINB & (1<<PB1)))
    {
      zaehler--;
      _delay_ms(300);
    }

    }
      else if (zaehler == 2)
      {
      lcd_clear();
      lcd_write_s("Messung Beenden");
      if (!(PINB & (1<<PB0)))
    {
      zaehler++;
      _delay_ms(300);
    }

    if (!(PINB & (1<<PB1)))
    {
      zaehler--;
      _delay_ms(300);
    }

      }
        else if (zaehler == 3)
        {
        lcd_clear();
        lcd_write_s("Verarbeitete M.:");
            lcd_write_s(itoa(Meter, buffer0, 10));
        if (!(PINB & (1<<PB0)))
    {
      zaehler++;
      _delay_ms(300);
    }

    if (!(PINB & (1<<PB1)))
    {
      zaehler--;
      _delay_ms(300);
    }

        }

          else if (zaehler == 4)
          {
          lcd_clear();
          lcd_write_s("Geschwindigkeit:");
          lcd_write_s(itoa(Geschwindigkeit, buffer0, 10));


    if (!(PINB & (1<<PB1)))
    {
      zaehler--;
      _delay_ms(300);
    }

          }

  else {zaehler = 0;}

}

}

von Kilo K. (kilo81)


Lesenswert?

Dein lcd_clear() wird jedes Mal aufgerufen solange der Zähler 0,1,2,3 
oder 4 ist.

Wenn du lcd_clear() hingegen nur bei einem Tastendruck aufrufst, dann 
wird es auch nur bei einem Tastendruck aufgerufen.

von Anfänger158 (Gast)


Lesenswert?

Hey vielen Dank das Funktioniert jetzt.

Jetzt schreibt er mir allerdings ständig das Display mit dem selben text 
voll.

von Kilo K. (kilo81)


Lesenswert?

Richtig!
Dafür gibt es viele Lösungsansätze im Netz zu finden.

Du kannst da natürlich auch tricksen und den alten Wert mit Leerzeichen 
überschreiben.
Beispiel:

"Drahtmessung    "
"Messung Starten "
"Verarbeitete M.:"
"Geschwindigkeit:"

So ist jede Bezeichnung "gleich lang". DRAHTMESSUNG überschriebt quasi 
alle anderen Bezeichnungen durch die angefügten Leerzeichen.

: Bearbeitet durch User
von Anfänger158 (Gast)


Lesenswert?

habe das menue jetzt mal so angepasst das Zählen als unterprogramm für 
die übersicht:
int zaelen(void)
{
  if (!(PINB & (1<<PB0)))
    {
      zaehler++;
      lcd_clear();
      _delay_ms(300);
    }

    if (!(PINB & (1<<PB1)))
    {
      zaehler--;
      lcd_clear();
      _delay_ms(300);
    }

und das hauptprogramm:

while(1){

  if (zaehler == 0)
  {

  lcd_write_s("Drahtmessung    ");
  if (!(PINB & (1<<PB0)))
    {
      zaehler++;
      _delay_ms(300);
    }
  }
    else if (zaehler == 1)
    {

    lcd_write_s("Messung Starten ");
    zaelen();

    }


      else if (zaehler == 2)
      {

      lcd_write_s("Messung Beenden ");
      zaelen();

      }
        else if (zaehler == 3)
        {

        lcd_write_s("Verarbeitete M.:");
        lcd_setcursor(0,2);
            lcd_string(itoa(Meter, buffer0, 10));
        zaelen();

        }

          else if (zaehler == 4)
          {

          lcd_write_s("Geschwindigkeit:");
          lcd_setcursor(0,2);
          lcd_string(itoa(Geschwindigkeit, buffer0, 10));
          zaelen();



          }

  else {zaehler = 0;}

Jetzt schreibt er mir allerdings beide Zeilen und alle Zeichen des 
Display voll. Der Text wird immer wiederholt.

von Kilo K. (kilo81)


Lesenswert?

Erstmal:
was ist "lcd_write_s"? Warum muss hier keine setcursor Anweisung gegeben 
werden?

Wie viele Zeilen hat dein Display?
lcd_setcursor(0,2) sagt mir, dass er den Wert in die 3. Zeile schreiben 
soll!

(0,0) 1. Zeile
(0,1) 2. Zeile
(0,2) 3. Zeile
(0,3) 4. Zeile

von Anfänger158 (Gast)


Lesenswert?

Bei der von mir verwendet Bibliothek ist
(0,1) 1. Zeile
(0,2) 2. Zeile
Habe 2 Zeilen

Auszug aus der Bibliothek
*
 * lcd_write(..) - sendet eine Zeichenkette an LCD
 */
void lcd_write_s(char *buf)
{
  while(buf[0]!='\0') {
    lcd_write(buf[0]);
    buf++;
  }
}

von Kilo K. (kilo81)


Lesenswert?

Wie hast du denn die Taster angeschlossen?
Gegen Masse oder gegen Vcc?
Sind die int. Pullups am PortB aktiviert oder nicht?

Und was genau wird auf das LCD geschrieben? Welcher Text, welche 
Zeichen?

von Anfänger158 (Gast)


Lesenswert?

Danke für die Hilfe bisher.
Hab jetzt selbst rausgefunden was mein fehler war.

von Kilo K. (kilo81)


Lesenswert?

Und der wäre?

von W.S. (Gast)


Lesenswert?

Anfänger158 schrieb:
> Auszug aus der Bibliothek

Ich geb dir nen dringenden Rat: schreibe dir deinen LCD-Treiber um, und 
zwar so, daß er die Schreib-Position mitführt, sodaß du mit einer 
Funktion clreol() (die du dir selber schreibst) die Zeile ab aktueller 
Position bis zum Ende ablöschen kannst. Natürlich muß die nicht zwingend 
clreol() heißen, was anderes, z.B. karlheinz() ginge auch. Hauptsache du 
kannst dir den namen gut merken.

W.S.

von Feldkurat K. (feldkurat)


Lesenswert?

W.S. schrieb:
> Natürlich muß die nicht zwingend
> clreol() heißen, was anderes, z.B. karlheinz() ginge auch.

Wenn die Funktion ab der letzten Schreibposition löscht, dann nenne sie 
doch "Moderator". Der tut das Gleiche.

SCNR

:-/

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.