Forum: Mikrocontroller und Digitale Elektronik Arduino Uno zeigt Müll an LCD


von Michael L. (wollschaf)


Lesenswert?

Ich steure mit meinem Arduino Uno ein LCD Display an, parallele 
Schnittstelle. Ich hab einprogrammiert (mit PullUps an digitalen 
Eingängen) dass ich verschiedene Textelemente Anzeigen lasse und das an 
6 Eingängen. Drehe ich jetzt meinen Schalter, so kommt es manchmal vor, 
dass sich die Anzeige "übergibt" und wild durcheinander alle möglichen 
Symbole anzeigt.

Beim resetten oder Versorgungsspannung aus und wieder ein wird es wieder 
normal, wenn ich jedoch wieder ein paar mal Schalte, spinnt es wieder.


Gibts da ein Masseproblem oder hab ich da am LCD einen Kurzschluss beim 
umschalten?

von obfri (Gast)


Lesenswert?

liegt mit Sicherheit an der Verschraubung des Displays .... oder das 
Display ist ein Grauimport ohne WEEE-Mülleimer

Scherz beiseite: welche Antwort erwartest Du ohne Schaltbild und 
Software?

von Michael L. (wollschaf)


Angehängte Dateien:

Lesenswert?

Vor = analogRead(Gangschalterv);
Rueck = analogRead(Gangschalterr);
Modi1 = digitalRead(Modischalter1);
Modi2 = digitalRead(Modischalter2);
Modi3 = digitalRead(Modischalter3);
Modi4 = digitalRead(Modischalter4);

if (Vor & !Rueck)
{
  lcd.setCursor(13,1);
  lcd.print("V");
}
 else
 {
  if (Rueck & !Vor)
  {
  lcd.setCursor(13,1);
  lcd.print("R");
  }
 else
   {
   lcd.setCursor(13,1);
   lcd.print(" ");
   }
 }



if (!Modi1 & Modi2 & Modi3 & Modi4)
{
  lcd.setCursor(12,1);
  lcd.print("1");
}
 else
 {
  if (Modi1 & !Modi2 & Modi3 & Modi4)
  {
  lcd.setCursor(12,1);
  lcd.print("2");
  }
  else
 {
  if (Modi1 & Modi2 & !Modi3 & Modi4)
  {
  lcd.setCursor(12,1);
  lcd.print("3");
  }
  else
 {
  if (Modi1 & Modi2 & Modi3 & !Modi4)
  {
  lcd.setCursor(12,1);
  lcd.print("4");
  }
 else
   {
   lcd.setCursor(12,1);
   lcd.print(" ");

von Michael L. (wollschaf)


Lesenswert?

ich bin mir nicht sicher, welchen teil du genau brauchst, es kommen noch 
einige dinge aufs lcd drauf..

von Pink S. (pinkshell)


Lesenswert?

Normalerweise wird der RW auf GND gelegt und der RS mit dem Arduino 
verbunden, nicht umgekehrt.

von Michael L. (wollschaf)


Lesenswert?

kann es daran liegen, dass es komisches zeug anzeigt ?

Hier mal das gesamte Programm:

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 6, 5, 4, 3);

// entgangene Ah
int Stromsensor = A0;
int Spannungssensor = A1;
int WertI = 0;
long WertU = 0;
int Strom0 = 0;
float Strom1 = 0;
const int Abtastzeit = 100; // = 100 millisekunden
long Flaeche = 0;
long Aktivflaeche = 0;
long VZ = 0;
unsigned long Start = 0; // vollgeladen = 25200000
unsigned long Anzeigewert = 0;
float Anzeige = 0;
float Prozentanzeige = 0;
float Hilfswert = 0;

// Vor, Rück, Modi1234
int Gangschalterv = A2;
int Gangschalterr = A3;
const int Modischalter1 = 10;
const int Modischalter2 = 9;
const int Modischalter3 = 8;
const int Modischalter4 = 7;  // pin nummern der digitalen Modieingänge
int Vor = 0;
int Rueck = 0;
int Modi1 = 0;
int Modi2 = 0;
int Modi3 = 0;
int Modi4 = 0;


//Geschwindigkeit
const int Eingang = 2;
volatile unsigned long dauer = 0;
volatile unsigned long last = 0;
long Geschwindigkeit = 0;
//long Drehzahl = 0; statt Drehzahl --> Geschw.
char buf[17];
const float Radius = 0.02;
const float ZahlPI = 3.1415;


void setup()
{
lcd.begin(20, 4);
//pinMode(Stromsensor, INPUT);
//pinMode(Spannungssensor, INPUT);  --> sowieso analoge Eingänge
pinMode(10, INPUT);
pinMode(9, INPUT);
pinMode(8, INPUT);
pinMode(7, INPUT); // Pins sind INPUT
digitalWrite(10, HIGH);
digitalWrite(9, HIGH);
digitalWrite(8, HIGH);
digitalWrite(7, HIGH); // pull up programmieren

initial(); // Akku Konfiguration

pinMode(Eingang, INPUT);     // V-Messung
digitalWrite(Eingang, HIGH); // V-Messung
//lcd.print("Geschwindigkeit");// V-Messung
attachInterrupt(0,Messung, RISING); // bei pos Flanke von Pin 2 ist 
Interrupt
}


void initial()
{
WertU = analogRead(Spannungssensor);
Hilfswert = map(WertU,0,1023,0,100);
Start = Hilfswert*252000;
lcd.setCursor(2,0);
lcd.print("Akku-Konfig.");
delay(1000);
}

void loop()
{
//Drehzahl =   (60000000/dauer);                                   // 
Drehzahl ausrechnen für evtl. Balken
Geschwindigkeit = ((60000000/dauer)*ZahlPI*3600)/(Radius*30*1000); // 
Umrechnung in Geschwindigkeit
sprintf(buf, "kmh %4lu    ", Geschwindigkeit);
lcd.setCursor(0,0);
lcd.print(buf);

Vor = analogRead(Gangschalterv);
Rueck = analogRead(Gangschalterr);
Modi1 = digitalRead(Modischalter1);
Modi2 = digitalRead(Modischalter2);
Modi3 = digitalRead(Modischalter3);
Modi4 = digitalRead(Modischalter4);

if (Vor & !Rueck)
{
  lcd.setCursor(0,3);
  lcd.print("Rueckwaertsgang  ");
}
 else
 {
  if (Rueck & !Vor)
  {
  lcd.setCursor(0,3);
  lcd.print("Vorwaertsgang  ");
  }
 else
   {
   lcd.setCursor(0,3);
   lcd.print("Leerlauf       ");
   }
 }



if (!Modi1 & Modi2 & Modi3 & Modi4)
{
  lcd.setCursor(0,2);
  lcd.print("E-Mode        ");
}
 else
 {
  if (Modi1 & !Modi2 & Modi3 & Modi4)
  {
  lcd.setCursor(0,2);
  lcd.print("Eco-Mode    ");
  }
  else
 {
  if (Modi1 & Modi2 & !Modi3 & Modi4)
  {
  lcd.setCursor(0,2);
  lcd.print("Sport-Modus    ");
  }
  else
 {
  if (Modi1 & Modi2 & Modi3 & !Modi4)
  {
  lcd.setCursor(0,2);
  lcd.print("Charge-Mode     ");
  }
 else
   {
   lcd.setCursor(0,2);
   lcd.print("                   ");
   }
 }}}


WertI = analogRead(Stromsensor);
Strom1 = map(WertI,0,1023,0,120.00); // Strom kann bis zu 120 Amper hoch 
sein
Flaeche = ((Strom1 + Strom0)/2)*Abtastzeit; // Fläche anhand der 
Trapezregel in [mAs] = milliAmperesekunden
Aktivflaeche = VZ + Flaeche; // Vorzustand addiert
Anzeigewert = Start - Aktivflaeche; // verbrauchte Fläche wird abgezogen 
[dAs]

//lcd.setCursor(11,0);
//lcd.print(Strom1);
//lcd.setCursor(14,0);
//lcd.print("A ");

if (Anzeigewert < 0)
{
  Anzeigewert = 0;
}
if (Anzeigewert > 25200000)
{
  Anzeigewert = 25200000;
}

Anzeige = Anzeigewert/3600; // umwandlung in [mAh]
Prozentanzeige = map(Anzeige,0,7000.0,0,100); // umwandlung in Prozent

if (Prozentanzeige == 100)
{
  lcd.setCursor(0,1);
  lcd.print("voll geladen");
}
 else
 {
 lcd.setCursor(1,1);
 lcd.print(Prozentanzeige);
 lcd.setCursor(3,1);
 lcd.print("% geladen");
 lcd.setCursor(0,1);
 lcd.print(" ");  // Anzeige der prozent in 2. Zeile
 }

//lcd.setCursor(0,0);
//lcd.print(Anzeige);
//lcd.setCursor(6,0);
//lcd.print(" mAh ");  // Anzeige der Ah in 1. Zeile

Strom0 = Strom1;
VZ = Aktivflaeche;
delay(Abtastzeit);
}

void Messung()
{                     // Interrupt Funktion
detachInterrupt(0);                  // ausschalten
unsigned long m = micros();
unsigned long v = m- last;
if (v>5000)

{                        // unter 5ms prellen
  dauer = v;
  last = m;
}
attachInterrupt(0, Messung, RISING);// einschalten
}

von Read pls (Gast)


Lesenswert?

Nochmal
***********************************************************************


Normalerweise wird der RW auf GND gelegt und der RS mit dem Arduino
verbunden, nicht umgekehrt.


***********************************************************************

von Stefan D. (Gast)


Lesenswert?

Hatte auchmal so einen Fall. Da kam das ganze durch Spannungseinbrüche 
durch nen fehlenden Stützkondensator an einem 74HC14 zustande. 
Überprüfen mal, ob Deine Spannung sporadisch zusammenbricht.

Gruß Stefan

von Michael L. (wollschaf)


Lesenswert?

> Normalerweise wird der RW auf GND gelegt und der RS mit dem Arduino
> verbunden, nicht umgekehrt.


Nochmal: Es funktioniert einwandfrei, bis auf die zufälligen 
LCD-Durchfallanzeigen


Danke Stefan, istn guter tipp !
so nebenbei: kann es auch sein, dass sich anschlüsse bei unsauber 
verlöteten kontakten kreuzen und so evtl ein kurzschluss das problem 
verursacht ? werde das morgen auch noch prüfen..

von Michael L. (wollschaf)


Lesenswert?

aja: stützkondensator am vcc eingang ?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Michael Leitner schrieb:
> Nochmal: Es funktioniert einwandfrei, bis auf die zufälligen
> LCD-Durchfallanzeigen

Es ist aber trotzdem falsch. Sieh Dir doch einfach mal im Datenblatt die 
Bedeutung der verschiedenen Signale an.

von Wolfgang (Gast)


Lesenswert?

Michael Leitner schrieb:
>> Normalerweise wird der RW auf GND gelegt und der RS mit dem Arduino
>> verbunden, nicht umgekehrt.
>
> Nochmal: Es funktioniert einwandfrei, bis auf die zufälligen
> LCD-Durchfallanzeigen

Von einwandfrei funktionieren ist das also weit entfern, wenn man es 
genau betrachtet.

Wenn du das mit RS nicht glaubst, guck in die Beschreibung der Arduino 
Liquid Chrystal Library, die du ja wohl benutzt. Da steht "LCD RS pin to 
digital pin 12". Von deinem R/W ist nicht die Rede, der liegt brav auf 
Gnd.
http://www.arduino.cc/en/Tutorial/LiquidCrystal

von Stefan D. (Gast)


Lesenswert?

Miss mal die Spannung direkt am Vcc des Displays mit nem Oszi - falls 
vorhanden.  Wenn Du auch nur einen kurzen tiefen Einbruch hast, kann es 
dieses Phänomen auslösen.

Gruß Stefan

von Stefan D. (Gast)


Lesenswert?

Womit betreibst Du das Ganze? USB, Labornetzteil...?

von Stefan D. (Gast)


Lesenswert?

OK grad gesehen USB scheidet aus. Aber was ist das für ein Netzteil? 
Und: Selbstredend, dass wenn dein fliegender Aufbau Kurzschlüsse 
verursacht, Du alle möglichen Effekte bekommen kannst. Also lieber 
erstmal den Aufbau in Ordnung bringen, bevor Du nach Fehlern im Code 
suchst.

von Kaj (Gast)


Lesenswert?

Stefan D. schrieb:
> Also lieber
> erstmal den Aufbau in Ordnung bringen

Da gibt es nichts in ordnung zu bringen, denn:

Michael Leitner schrieb:
> Nochmal: Es funktioniert einwandfrei

Verstehe gar nicht warum hier ein Fred aufgemacht wurde, wenn es doch 
funktioniert^^

von Beratungsresistenz (Gast)


Lesenswert?


von Michael L. (wollschaf)


Lesenswert?

>
> Verstehe gar nicht warum hier ein Fred aufgemacht wurde, wenn es doch
> funktioniert^^

fertig lesen bevor du statements gibst, ich hab gesagt es funktioniert 
einwandfrei bis auf die gelegentlichen lcd-datendurchfälle

mittlerweile hab ich das problem auch schon entdeckt, da es so gute 
menschen mit konstruktiven beiträgen gibt: wenn ich meinen motor zu 
schnell hochfahre, bricht die versorgung kurz ein bzw. wenn ich einen 
freigabekontakt auf 24V gegen masse durchschalte. mit nem größeren elko 
(470µF) hab ich das problem mit dem durchschalten gelöst, aber wie 
gesagt, bei schnellem hochfahren des motors habe ich anscheinend auch 
einen kurzen spannungseinbruch, ergo --> größeren kondensator

danke an stefan, ich schätze du hast mein problem gelöst :D

von Michael L. (wollschaf)


Lesenswert?

achja und wolfgang: das mit dem rs hab ich dir von anfang an geglaubt, 
mir wurden diese anschlussarten so vermittelt, ich hab nicht groß 
nachgefragt, da es alleine gut funktioniert hat. mit der 
schaltungselektronik hat sich das jedoch geändert ^^ ich denke das 
rauschen krieg ich mit dem elko in den griff, anscheinend ist es aber 
nicht entscheidend dafür, ob rs oder r/w gegen masse ist. ich denke man 
kann beides verwenden :D

: Bearbeitet durch User
von Kaj (Gast)


Lesenswert?

Michael Leitner schrieb:
> fertig lesen bevor du statements gibst, ich hab gesagt es funktioniert
> einwandfrei bis auf die gelegentlichen lcd-datendurchfälle
Also funktioniert es eben nicht einwandfrei! oder wie willst du das 
verkaufen?

"Funktioniert die Anlage?"
"Ja, funktioniert, ABER der Roboterarm wirft hin und wieder mal ein Rohr 
durch die Halle."

von Michael L. (wollschaf)


Lesenswert?

damit wollte ich nur sagen, dass die funktion von einem anderen bauteil 
gestört wird.

von Wolfgang (Gast)


Lesenswert?

Michael Leitner schrieb:
> anscheinend ist es aber
> nicht entscheidend dafür, ob rs oder r/w gegen masse ist. ich denke man
> kann beides verwenden :D

Ich bin bisher immer gut damit gefahren, mich ans Datenblatt zu halten 
und nicht zu riskieren, das Ausgangstreiber von µC und LCD-Controller 
gegeneinander arbeiten, auf das der Stärkere gewinnt.
Mit R/W steuerst du genau die Datenrichtung und wenn deine LCD-Lib da 
nicht mitspielt, passiert genau das (Datenblatt p. 175f, PDF 9f)
https://www.parallax.com/sites/default/files/downloads/603-00006-Hitachi-HD44780-Datasheet.pdf

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.