arduino lcd probleem

hallo mede co ers

ik heb een raar probleem met de volgende sketch
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
lcd.begin(20,4);
}

void loop() {
lcd.setCursor(8, 0);
lcd.print("hallo");
lcd.setCursor(5, 1);
lcd.print("Temp: ");
lcd.setCursor(12, 2);
lcd.print("drie");
lcd.setCursor(16, 3);
lcd.print("vier");

je zou verwachten dat het woord hallo op positie 8 komt dit is ook zo
maar iets zet ook hallo op positie 0 van de eerste regel
ik snap niet wat of waar het fout gaat
wie kan mij helpen?

alvast bedankt

buckfast_beekeeper

Golden Member

Is dat je volledige code? Zet je code ook tussen code tags. dat leest veel makkelijker.

c code:

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
    lcd.begin(20,4);
}

void loop() {
    lcd.setCursor(8, 0);
    lcd.print("hallo");
    lcd.setCursor(5, 1);
    lcd.print("Temp: ");
    lcd.setCursor(12, 2);
    lcd.print("drie");
    lcd.setCursor(16, 3);
    lcd.print("vier"); 

Er ontbreekt dan een } in je loop.

12, 11, 5, 4, 3, 2 voor welke pennen op het lcd staat dit? Wordt er gebruik gemaakt van de busy flag of wordt er gewoon na elkaar verzonden zonder controle? In dat geval zou het kunnen dat de setCursor(8, 0); in het niets verdwijnt. Zet een keer een vertraging van enkele ms tussen de opdrachten.

Van Lambiek wordt goede geuze gemaakt.

"vier" print je op positie 16.
De "r" staat dan op positie 20 en dat valt buiten beeld want de telling begint vanaf 0.

c code:


// lcd.setCursor(16, 3);
 lcd.setCursor(15, 3);
 lcd.print("vier"); 

Te snel willen antwoorden zonder te verifieren, hierboven staat onzin.

Rap eens getest (met een I2C) aangestuurd 20*4 display : dat werkt correct, ook als je buiten beeld iets print.

[Bericht gewijzigd door Pertinax op woensdag 31 januari 2018 22:16:46 (31%)

Mijn thuis is waar mijn Weller staat
buckfast_beekeeper

Golden Member

Op 31 januari 2018 21:18:54 schreef Pertinax:
"vier" print je op positie 16.
De "r" staat dan op positie 20 en dat valt buiten beeld want de telling begint vanaf 0.

c code:


// lcd.setCursor(16, 3);
 lcd.setCursor(15, 3);
 lcd.print("vier"); 

dat verklaart niet waarom setCursor(8, 0) niet wordt uitgevoerd. Normaal gaat bij een overflow het karakter naar de volgende positie. Dus normaal positie 0 van regel 0.

Van Lambiek wordt goede geuze gemaakt.

Op 31 januari 2018 20:37:19 schreef buckfast_beekeeper: Zet een keer een vertraging van enkele ms tussen de opdrachten.

Lijkt mij ook de meest waarschijnlijke oorzaak. Je bent nu als een klapjostie, zo snel als de nano maar kan, commando's naar het display aan het verzenden. Niet wetende of je display dat wel kan verhapstukken.

Rustig aan, dan breekt het (seriele) lijntje niet.

Schimanski

Golden Member

Waarom alles binnen de loop afhandelen, zeker om te testen (zoals hier) kan het gewoon in de setup. Dan wordt alles eenmaal naar LCD geschreven, zou goed moeten werken.

c code:


#include <LiquidCrystal.h>
 
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
 
void setup() {
    lcd.begin(20,4);

    lcd.setCursor(8, 0);
    lcd.print("hallo");
    lcd.setCursor(5, 1);
    lcd.print("Temp: ");
    lcd.setCursor(12, 2);
    lcd.print("drie");
    lcd.setCursor(16, 3);
    lcd.print("vier"); 
}

void loop() {
}
What, me worry? // Radiozendamateur - PA2HGJ // Stuff is the junk you keep -- Junk is the stuff you throw away // Tinkeo Ergo Sum
buckfast_beekeeper

Golden Member

Dan was hij zeker niet bij de fout uitgekomen.

Ik ga me niet verdiepen in de specs van een arduino nano, mega of hoe ze ook allemaal mogen noemen. Wie ziet er door het bos de bomen nog?

Verder blijf ik 'sketch' een verschrikkelijk ding vinden. Dat hoort thuis in een toneelstuk. Wat is er mis met programma? Maar dit ter zijde.

Als de µC klokt op zijn interne klok van 8MHz dan zijn de ingebouwde vertragingen normaal toereikend. Controle van de busy flag levert dan net extra vertraging op. Is de µC geklokt op 20MHz, dan kan je best de busy flag gebruiken. Daarom de vraag welke pennen van het display worden gebruikt. Tot nu toe niet beantwoord door TS.

Misschien kan TS er best een keer een datasheet van een display er bij nemen en kijken hoeveel tijd elke 'bewerking' op het display duurt. Van clear tot plaatsen cursor en schrijven van een karakter.

Van Lambiek wordt goede geuze gemaakt.

het probleem is de loop. jouw arduino gaat daar heel snel door.

vanaf de 2de keer wordt jouw hallo op de eerste regel herschreven.

zet eens als laatste regel in je loop
delay(100);

zodat de loop 1x doorloopt, dan jouw programma even stopt, en erna het zelfde nog eens schrijft. het gaat allemaal VEEL te snel nu.
2de opmerking: na jouw lcd begin, zou ik een lcd clear doen zodat de hele buffer van het lcd leeggemaakt wordt.
ook kan het geen kwaad om tussen elke schrijfactie eens wat wachttijd in te steken .
knippert jouw display ook niet als gek nu?

c code:

#include <LiquidCrystal.h>
 
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
 
void setup() {
    lcd.begin(20,4);
    lcd.clear();
}
 
void loop() {
    lcd.setCursor(8, 0);
    lcd.print("hallo");
    delay(100);
    lcd.setCursor(5, 1);
    lcd.print("Temp: ");
    delay(100);
    lcd.setCursor(12, 2);
    lcd.print("drie");
    delay(100);
    lcd.setCursor(16, 3);
    lcd.print("vier"); 
    delay(100);

}

ik doe ook alles zoals shimanski. ik laat alle test invullen in de setup, en ga erna pas de temperaturen op de correcte plaats schrijven. het voorkomt veel knipperen van het display

[Bericht gewijzigd door fcapri op donderdag 1 februari 2018 07:34:38 (11%)

ik hou van werken ..., ik kan er uren naar kijken

Een Arduino nano loopt standaard op 16 MHz. De interne clock gebruiken of een ander xtal plaatsen is in combinatie met alternatieve hardware packages of zelf editen van de hardware definities natuurlijk mogelijk, maar zeker niet gebruikelijk.

De standaard Arduino lib, LiquidCrystal, heeft het RW signaal als optie, maar maakt het bij mijn weten alleen laag en leest nooit. Het is gebruikelijk dit signaal niet te gebruiken en vast aan gnd te hangen.

Ik heb het probleem nooit gezien, maar ik had het ook nooit in zo een korte loop geprobeerd, wat inderdaad geen handig idee lijkt. Dit soort HD44780 displays en hun interface stammen uit de prehistorie, de wat rustigere Z80 en 6502 tijd. Met een moderne microcontroller kan men allicht VEEL te snel data duwen.

Met een Micro (32U4@16MHz) op een 16x2 LCD laat het zich hier niet direct reproduceren. Ik zou wat verdere tests doen om te kijken waar het hem in zit.

c code:

 
/*
 * LCD test 
 */
 
#include <LiquidCrystal.h>
 
LiquidCrystal lcd(4, 5, 6, 7,8, 9);
 
void setup() {
    lcd.begin(16,2);
    lcd.clear();
}
 
void loop() {
    lcd.setCursor(8, 0);
    lcd.print("hallo");
    lcd.setCursor(5, 1);
    lcd.print("Temp: ");
}

Geeft:

buckfast_beekeeper

Golden Member

Ik gebruik het RW signaal altijd bij een ATmega. Ik schrijf dikwijls custom karakters naar het display. Op 20MHz nog geen problemen gekend.

Van Lambiek wordt goede geuze gemaakt.

.

[Bericht gewijzigd door rwk op donderdag 1 februari 2018 11:05:45 (99%)