4x20 LCD Bildschirm fängt sich Störungen ein

Gast #4727737
Lesenswert?

Hallo,
ich habe eine Atmega 328 basierende Steuerung im industriellen Umfeld im 
Einsatz, die hauptsächlich ein paar Magnetventile schaltet und eine 
Lichtschranke sowie einen  Drehencoder ausliest. Anfangs traten 
mannigfaltige Störungen auf, weil ich naiv wie ich bin natürlich keine 
Optokoppler für Ein und Ausgänge vorgesehen hatte. Da das ein totler 
Fehlschlag war und ich dazugelernt habe, baute ich alle Ein- und 
Ausgänge komplett auf Optokoppler um. Alles zusammen ist verbaut in 
einem Metallgehäuse aus Stahlblech. Nun funktioniert das ganze ziemlich 
gut, oft tagelang oder wochenlang, und irgendwann kommt ein Fehler: Das 
Display zeigt Mist an (irgendwas aus dem Schriftensatz), der Controller 
an sich läuft dabei weiter ohne Probleme.
Das ist sehr unschön. Der LCD ist in einer Ausssparung des Gehäuses 
angebracht, ragt also etwas nach außen. Weiterhin ist dieser NICHT mit 
irgendwelchen Abblockkondensatoren versehen, die Datenleitungen gehen 
direkt per Flachbandkabel zum Controller. Lediglich an der Versorgung 
des LCD habe ich 100nF hingepappt.
Nun ist meine Vermutung, dass über das LCD Display oder das 
innenliegende Flachbandkabel Störungen eingekoppelt werden.
Kann ich an die Datenleitungen ein paar pF an beiden "Enden" also 
controllerseitig und LCDseitig jeweils gegen GND anschließen? Besteht 
Aussicht auf Erfolg, oder wird es nur noch schlechter, weil die 
Flankensteilheit leidet?
Wie kann man solche sporadischen absolut unvorhersehbaren Fehler 
beheben?

Vielen Dank im Voraus
(Ich bin kein Profi, betreibe die Microcontrollerbastelei nur als Hobby, 
und bin eigentlich Maschinenbauer)
Gast #4727750
Lesenswert?

Des könnte evtl. auch daran liegen, dass im Datenstrom zum Display ein 
Übertragungsfehler auftrat, und dann der LCD Controller durcheinander 
kommt.

Wie wird das Display aktualiert, bei jedem Loop (Programmdurchlauf), 
oder nur wenn sich die Anzeigewerte ändern.

Der Displaycontroller speichert im Normalfall die letzten gesendeten 
Daten, diese werde dann angezeigt solange keine neuen Daten kommen.
Wenn vorlaufend Daten geschickt werden kann es immer wieder zu solchen 
Fehlern kommen (meine Erfahrung), daher das Display nicht fortlaufend 
aktualisieren, sondern nur bei Bedarf.

Ebenfalls helfen manchmal Ferritringe an den Displayleitungen.

Da der µC ja weiterläuft, denke ich dass das Display einfach zu oft 
aktualisiert wird.

Abblock C's an den Datenleitungen habe ich noch nie gesehen, denke dass 
würde die Übertragungsprobleme nur noch erhöhen

Gruß Stefan
Gast #4727770
Lesenswert?

Harry D. schrieb:
> Beim Schalten von Induktivitäten benötigt man einen Snubber

Warum unbeding ein Snubber?

Den braucht man nur bei Wechselspannung. Eine Freilaufdiode tut es bei 
Gleichstrom einfacher. Falls die Magnetventile schnell abschalten 
sollen, nimmt man Zenerdioden oder ein geeigneter Widerstand in Serie.
Gast #4727775
Lesenswert?

rbcn schrieb:
> Wie kann man solche sporadischen absolut unvorhersehbaren Fehler
> beheben?

Notfalls durch einen gelegentliche Reset des Display.

Vorher solltest du sicher stellen, dass auch die Stromversorgung von 
Display und µC gut gegen Transienten auf dem Netz gefiltert ist.
Gast #4727787
Lesenswert?

Servus,
meistens liegt es an der Spannungsversorgung, die nicht ausreichend 
gepuffert wird oder es fließt etwas über die Masse. Es reicht schon, 
wenn man einen anderen Verbraucher an die gleiche Steckdose anbringt, 
sodass dann der LCD anfängt zu spinnen.

Das sind die s.g.: worst case. Als Programmierer muss man halt hier 
gegenhalten. Lese das busy flag aus und starte ggf. den lcd neu.

Oder schreibe eine Routine, die veranlasst den lcd alle 10s 
neuzustarten.
Gast #4727832
Lesenswert?

Servus,
danke für die Antworten. Ich denke auch, ich muss das Display ab und zu 
resetten.
Momentan ist es so, es wird nur auf den LCD geschrieben, wenn der Wert 
sich auch aktualisiert. Alleine wegen auftretendem Flimmern machte ich 
das von Anfang an so. Die geschalteten Ventile (induktiven Lasten) 
hängen ja alle an einem eigenen Netztal, das galvanisch getrennt von dem 
Netzteil des Controllers und des LCD ist (Optokoppler). Freilaufdioden 
sind natürlich vorhanden. Was mich immer schon etwas irritiert hat ist, 
dass auf den LCDs meistens Footprints für smd Kondensatoren sind, diese 
sind aber NIE bestückt. Aus Kostengründen?!?
Nun ist die frage, wie kann ich den Displaycontroller am besten reseten, 
ohne die ganze Schaltung zu reseten? Würde es reichen, es neu zu 
initialisieren mit lcd.begin(x,x,x);? Nun, mal testen.

Es ist einfach so, dass in der Nähe haufenweise andere Magneten, 
Schütze, FUs und Gott weiß was alles sind. Diese kann ich nicht alle mit 
Snubbern versehen, sondern meine Schaltung muss die Umgebung tolerieren.
#4728080
Lesenswert?

rbcn schrieb:
> Momentan ist es so, es wird nur auf den LCD geschrieben, wenn der Wert
> sich auch aktualisiert. Alleine wegen auftretendem Flimmern machte ich
> das von Anfang an so.

Dann machst Du was falsch. Man kann den gleichen Text beliebig oft an 
das LCD schicken, da flimmert nichts.
Man darf natürlich nicht das LCD ständig löschen, sondern einfach nur 
den alten Text mit dem neuen überschreiben.

Ich lege immer einen Textspeicher im SRAM an (z.B. 4*20 Byte), der alle 
200ms an das LCD gesendet wird. Und in den Textspeicher schreibt dann 
die Applikation geänderte Zeichen ein.
Gast #4728133
Lesenswert?

Hast Recht, das Flimmern kommt nur vom Clear. Ist schon so lang her, das 
Projekt zieht sich schon über knapp 4 Jahre in verschiedensten 
Ausbaustufen :)
Trotzdem möchte ich nicht wie du, zyklisch z.B. alle 200ms aufs Display 
schreiben. Die eigentliche Aufgabe des Controllers ist Zeitkritisch, da 
will ich nicht haben, dass Aufgabe und LCD Aktualisierung 
aufeinandertreffen. Stattdessen habe ich einen reservierten Zeitslot im 
Ablauf, wo nichts zu tun ist und in Ruhe der Bildschirminhalt 
geschrieben werden kann.
Ich werde die Anregungen ausprobieren und mich ggf. wieder melden.
#4728265
Lesenswert?

Hi,
komment es schon mal vor, dass plötzlich nur noch schwarze Balken in 
Zeile 1 zu sehen sind?
Das ist bei meiner Schaltung immer dann aufgetreten, wenn es eine kurze 
aber ausreichende "Brounoutdetection" gab.
D.h. uP fängt das ab, LCD aber nicht, so dass zwar die 
Initialisierungsroutine vom uP wieder durchlaufen wird, das LCD aber 
nicht genügend Zeit hatte, vorher den Power on self reset durchführen zu 
können. Der braucht ja einen definierten Spannungsanstieg innerhalb 
einer bestimmten Zeit. (Deswegen keine zu grossen Konds. vor die Vcc des 
Displays. In diesem Falle wäre das kontraproduktiv. Ab ca. 100 uF wirds 
IMHO kritischer.)
Dann völliger "Reset" der Vcc nötig.

Oder Trennung der Versorgungsspannungen von LCD und uP, so dass 
sichergestellt ist, dass immer zuerst LCD Vcc bekommt, dann erst der uP.

ciao
gustav
#4728280
Lesenswert?

Karl B. schrieb:
> D.h. uP fängt das ab, LCD aber nicht, so dass zwar die
> Initialisierungsroutine vom uP wieder durchlaufen wird, das LCD aber
> nicht genügend Zeit hatte, vorher den Power on self reset durchführen zu
> können.

Dann ist die Ursache aber eine fehlerhafte Init-Routine für das LCD.
Mit einem korrekten Init kann man das LCD aus jedem unbekannten Zustand 
in den gewünschten Zustand zurück setzen, quasi ein SW-Reset. Die VCC zu 
schalten ist unnötig.
#4728317
Lesenswert?

Peter D. schrieb:
> Dann ist die Ursache aber eine fehlerhafte Init-Routine für das LCD.
> Mit einem korrekten Init kann man das LCD aus jedem unbekannten Zustand
> in den gewünschten Zustand zurück setzen, quasi ein SW-Reset.

Wenn der uC die Initialisierung anfängt, bevor das LCD bereit ist, hilft 
dir das auch nichts. Im Zweifelsfall muss der uC abwarten, bis Vcc auch 
am LCD stabil ist.
#4728383
Lesenswert?

Pete K. schrieb:
> Aber das steht ja auch im Datenblatt des LCDs, wann es bereit ist.

OK,
da ist einmal die Bedingung drin, die für einen ordnungsgemässen POSR 
verlangt wird.
Gleichzeitig aber auch, was gemacht werden soll, kann diese Bedingung 
nicht eingehalten werden.
Dann sollen die Befehle, die normalerweise beim POSR automatisch 
ablaufen,  "manuell" eingegeben werden. Tatsächlich wird die MCU die 
Scharte dann auswetzen, indem dieser "worst case" in Form von 
Warteschleifen in der Initialisierungsroutine mit berücksichtigt wird.
Also, von 40 ms ist da die Rede,
(1-2 Sekunden sind aber reichlich.)
Komisch, ich dachte, die Warteschleifen wären lang genug bei meinem 
Programm, sehe mich also genötigt, diese noch länger zu machen.




ciao
gustav
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren