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
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
Oliver Schmutz schrieb: > if(puffer1==puffer1alt & puffer2==puffer2alt....) aber wie komme ich auf sone variablen.? sprich puffer1alt
Ist doch trivial... while(1) calculate(&neu) if(alt!=neu) update_lcd() alt=neu end if end while
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?
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...
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.
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...
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 ;-)
Johannes Adler schrieb: > schon...aber ich kann ja nicht schreiben: > > > calculate(&neu) Naja, du musst schon die Funktion dazu schreiben... (nennt sich "programmieren"!)
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.
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...
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.