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?
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?
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(" ");
ich bin mir nicht sicher, welchen teil du genau brauchst, es kommen noch einige dinge aufs lcd drauf..
Normalerweise wird der RW auf GND gelegt und der RS mit dem Arduino verbunden, nicht umgekehrt.
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 }
Nochmal *********************************************************************** Normalerweise wird der RW auf GND gelegt und der RS mit dem Arduino verbunden, nicht umgekehrt. ***********************************************************************
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
> 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..
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.
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
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
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.
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^^
> > 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
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
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."
damit wollte ich nur sagen, dass die funktion von einem anderen bauteil gestört wird.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.