Forum: Mikrocontroller und Digitale Elektronik LCD Display___


von Johannes A. (kleinerkeiler96)


Lesenswert?

Hallo zusammen :)

Wie kann man es schreiben, dass sich das LCD nur bei Veränderungen 
aktualisiert?

Denn in folgenden Code schreibe ich 4 Variablen auf mein LCD. Damit ich 
die Anzeige auch lesen kann, schreibe ich noch ein delay rein und danach 
noch LCD löschen, damit gleich wieder alles aktualisiert wird...


#include <avr/io.h>
#include "lcd-routines.h"
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdlib.h>
#include <avr/pgmspace.h>

uint16_t adc_messung(uint8_t channel) {
ADMUX = 0b01000000;
ADMUX |= channel;
uint16_t messwert=0;

for (uint8_t i=0; i<5; i++) {
ADCSRA |= (1<<ADSC);
while ( !(ADCSRA & (1<<ADIF)) )
;
messwert = (ADC)+messwert;
}
messwert /= 5;
return messwert*5;
}


int main(void){
  DDRA = 0xff;

  ADMUX |= (0<<REFS1)|(1<<REFS0);
  ADCSRA |= (1<<ADEN);
  ADCSRA |= (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);

  uint16_t m1=0;    char puffer1[16];
  uint16_t m2=0;    char puffer2[16];
  uint16_t m3=0;    char puffer3[16];
  uint16_t m4=0;    char puffer4[16];

  lcd_init();

while (1) {

    // = adc_messung(ADC0-7)
    m1 = adc_messung(0);
    m2 = adc_messung(3);
    m3 = adc_messung(1);
    m4 = adc_messung(2);
  #include "ifs.h"

    itoa(m1,puffer1,10);
    itoa(m2,puffer2,10);
    itoa(m3,puffer3,10);
    itoa(m4,puffer4,10);

    lcd_setcursor(0,1);    lcd_string("x=");
    lcd_setcursor(2,1);    lcd_string(puffer1);
    lcd_setcursor(0,2);    lcd_string("y=");
    lcd_setcursor(2,2);    lcd_string(puffer2);

    lcd_setcursor(7,1);    lcd_string("x=-");
    lcd_setcursor(10,1);          lcd_string(puffer3);
    lcd_setcursor(7,2);    lcd_string("y=-");
    lcd_setcursor(10,2);          lcd_string(puffer4);

    _delay_ms(100);
    lcd_clear();
  }

}


Hat jemand eine Idee.?


MfG. Jo

von Oliver S. (eragon)


Lesenswert?

Hei...na am einfachsten wäre es doch die werte zu vergleichen.
Also z.B. So:

if(puffer1==puffer1alt & puffer2==puffer2alt....)
{

//do nothing
}


else{
    lcd_clear();
    lcd_setcursor(0,1);    lcd_string("x=");
    lcd_setcursor(2,1);    lcd_string(puffer1);
    lcd_setcursor(0,2);    lcd_string("y=");
    lcd_setcursor(2,2);    lcd_string(puffer2);

    lcd_setcursor(7,1);    lcd_string("x=-");
    lcd_setcursor(10,1);          lcd_string(puffer3);
    lcd_setcursor(7,2);    lcd_string("y=-");
    lcd_setcursor(10,2);          lcd_string(puffer4);
}

Gruss

von Johannes A. (kleinerkeiler96)


Lesenswert?

klasse idee, danke...


werde es gleich probieren :)

von Johannes A. (kleinerkeiler96)


Lesenswert?

Oliver Schmutz schrieb:
> if(puffer1==puffer1alt & puffer2==puffer2alt....)

aber wie komme ich auf sone variablen.? sprich puffer1alt

von i2c (Gast)


Lesenswert?

Ist doch trivial...

while(1)
  calculate(&neu)
  if(alt!=neu)
    update_lcd()
    alt=neu
  end if
end while

von Johannes A. (kleinerkeiler96)


Lesenswert?

versteh ich nicht...


while(1){
  calculate(&neu)
  if(alt!=neu)
    update_lcd()
    alt=neu
  }
}

was ist calculate.? und meine frage, wie komme ich auf die variablen alt 
und neu?

von i2c (Gast)


Lesenswert?

Johannes Adler schrieb:
> versteh ich nicht...
>
>
> while(1){
>   calculate(&neu)
>   if(alt!=neu)
>     update_lcd()
>     alt=neu
>   }
> }
>
> was ist calculate.?
Das berechnet den neuen Wert.

> und meine frage, wie komme ich auf die variablen alt
> und neu?
Was heisst "Wie komme ich?" Neu wird jeweils berechnet und alt ist der 
Wert aus dem vorigen Durchgang...

von Johannes A. (kleinerkeiler96)


Lesenswert?

schon...aber ich kann ja nicht schreiben:


calculate(&neu)

von Wolfgang (Gast)


Lesenswert?

Johannes Adler schrieb:
> Damit ich die Anzeige auch lesen kann, schreibe ich noch ein delay rein
> und danach noch LCD löschen, ...

Wozu das Löschen? Schreib einfach den neuen Inhalt rein.

von Johannes A. (kleinerkeiler96)


Lesenswert?

Wolfgang schrieb:
> Schreib einfach den neuen Inhalt rein.

weil es sein kann, das die neue variable kleiner ist, sprich der rest 
der alten ist noch vorhanden...

von Cyblord -. (cyblord)


Lesenswert?

Johannes Adler schrieb:
> Wolfgang schrieb:
>> Schreib einfach den neuen Inhalt rein.
>
> weil es sein kann, das die neue variable kleiner ist, sprich der rest
> der alten ist noch vorhanden...

YMMD!!!! Magst nicht lieber auf Gärtner oder so machen? Ich glaube 
programmieren liegt dir nicht ;-)

von i2c (Gast)


Lesenswert?

Johannes Adler schrieb:
> schon...aber ich kann ja nicht schreiben:
>
>
> calculate(&neu)

Naja, du musst schon die Funktion dazu schreiben... (nennt sich 
"programmieren"!)

von Bastler (Gast)


Lesenswert?

Wenn man eine Ausgabe z.B. so macht:

Spannung1: 123V
Spannung2: 456V

Dann schreibt man Spannung1: und Spannung2: nur einmal hin.
Die Werte danach werden immer neu geschrieben und mit den Curserbefehlen 
an die entsprechende Stelle gesprungen.
Schau mal in den Befehlssatz des LCD, dort steht sowas.

> weil es sein kann, das die neue variable kleiner ist, sprich der rest
> der alten ist noch vorhanden...

Ich vermute er meinte den Wechsel einer dreistelligen zur zweistelligen 
Anzeige.
So ein Fehler hatte ich Anfangs auch.
Dafür gibt es Leerzeichen.

von Johannes A. (kleinerkeiler96)


Lesenswert?

Bastler schrieb:
> Dann schreibt man Spannung1: und Spannung2: nur einmal hin.
> Die Werte danach werden immer neu geschrieben und mit den Curserbefehlen
> an die entsprechende Stelle gesprungen.

genau so mach ich es ja...das problem ist halt das flakkern, also 
flakkern nicht ganz, sondern die pixel rechts vom lcd sind erst später 
da, als die vorderen...

von Josef D. (jogedua)


Lesenswert?

Johannes Adler schrieb:
> sondern die pixel rechts vom lcd sind erst später
> da, als die vorderen...

Das sieht man aber normalerweise nur, wenn vorher das Display gelöscht 
wurde, weshalb man das vermeiden sollte.

Lass doch mal den aktuellen Code sehen.

von Karl H. (kbuchegg)


Lesenswert?

Johannes Adler schrieb:

> genau so mach ich es ja...das problem ist halt das flakkern, also
> flakkern nicht ganz, sondern die pixel rechts vom lcd sind erst später
> da, als die vorderen...

Wenn du dir das Löschen des LCD in die Haare schmierst und immer nur die 
Werte überschreibst (und gegebenenfalls ein paar Leerzeichen um die 
Zeichen zu entfernen, die nicht mehr benötigt werden), dann flackert da 
auch nichts.

Millionen von Programmierern weltweit machen das so. Das wird wohl auch 
für dich gut genug sein. Nur darf man halt nicht naiv an die Sache 
rangehen.

von Karl H. (kbuchegg)


Lesenswert?

Hinweis:
Wenn du schon _delay_ms benutzt, dann kannst du auch gleich sprintf 
anstelle von itoa benutzen. Damit ist dein 'Problem' mit den eventuellen 
Leerzeichen ein Kinderspiel.

von Karl H. (kbuchegg)


Lesenswert?

Johannes Adler schrieb:
> versteh ich nicht...
>
>
> while(1){
>   calculate(&neu)
>   if(alt!=neu)
>     update_lcd()
>     alt=neu
>   }
> }
>
> was ist calculate.?

Der Programmteil, in dem du deinen auszugebenden Wert bestimmst.


> und meine frage, wie komme ich auf die variablen alt
> und neu?

"Neu" ist der Wert den du ausgerechnet hast.
Zb den neuen Benzinpreis, weil du Tankstellenpächter bist und du eine 
schöne große Anzeigetafel vor der Tankstelle stehen hast (auf der man 
leider so wie früher noch hochklettern muss um Täfelchen auszutauschen, 
was leider auf deine alten Tage nicht mehr so einfach ist wie früher, 
als du noch ein junger SpringInsFeld warst)

Nachdem du den neuen Verkaufspreis berechnet hast und um dir das Kraxeln 
auf die Anzeigetafel wenn möglich zu ersparen, schaust du auf den Zettel 
neben der Kasse, auf dem du dir aufgeschrieben hast, welcher Preis jetzt 
gerade auf der Anzeige zu sehen ist. Sind die beiden gleich, dann zeigt 
die Anzeige schon den neu ausgerechneten Wert an. Du musst also nicht 
ruafkraxeln. Sind die Werte aber nicht gleich, dann musst du die Anzeige 
wohl oder übel auf den neuen Preis ändern. Und nachdem du das getan 
hast, nimmst du den Zettel neben der Kassa zur Hand, streichst den alten 
Wert durch und notierst dir diesen jetzt eben neu ausgerechneten und 
angezeigten Wert. Denn .... es kommt die Zeit an dem du wieder einen 
Benzinpreis ausrechnest und den Zettel zur Hand nimmst um zu 
vergleichen, ob der Wert an der Anzeige nicht zufällig schon mit dem 
jetzt neu ausgerechneten Benzinpreis übereinstimmt. Und mit ein bischen 
Glück sind die dann auch tatsächlich gleich und du musst nicht zur 
Anzeigetafel hochklettern.


Und jetzt nimmst du dir nochmal den Code vor (der übrigens symbolisch 
gemeint war und nicht als Copy&Paste Vorlage für dich) und siehst nach, 
wo du die Einzelteile dieser erfundenen 'Geschichte' in Codeform 
wiederfindest:
1
 while(1){               // den ganzen Tag mach ich nix anders, als:
2
3
   calculate(&neu)       // einen neuen Benzinpreis ausrechnen
4
5
   if(alt != neu)        // Zettel her. Passt die Anzeige vielleicht schon?
6
     update_lcd();       //    Nö. Leider. Passt nicht. Muss ich wohl kraxeln
7
     alt = neu;          //    aber ich notier mir für 'später', was auf der Anzeige zu sehen ist
8
   }
9
 }

und dann überlegst du mal, wie du dieses allgemeine Kochrezept auf deine 
spezielle Situation von ADC Werten anstelle von Benzinpreisen anwenden 
kannst.

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.