Moin,
ich bin Einsteiger in der ST32-Welt. Bei 8-Bitern habe ich einiges an
Erfahrung, trotzdem scheitere ich hier an einem einfachen Problem.
Ich möchte mein STM32f100-Discovery Board an ein Display 2x16
anschließen.
Ich habe bisher zwei baugleiche Displays getestet, beide funktionieren
mit einem 8-Bit Prozessor.
Weiterhin habe ich zwei Example Codes ausprobiert, ohne Erfolg.
Um alle Fehler von fremden Code auszuschließen habe ich mir die
Displayansteuerung nun durch simples I/O setzen selbst geschrieben. Aber
das Problem löst sich nicht.
Die Initialisierung scheint zu klappen, zumindest verschwindet die eine
leuchtende Zeile im Display nach dem einschalten.
Im Debug-Modus sieht es ebenfalls gut aus, die Pegel an den I/Os kann
ich messen.
Infos:
- 8Mhz HSI
- Display 5V
- STM32 3,3V
- LCD-Daten 4-Bit an PC0-PC3 --> D4-D7 am Display
- RS an PC8
- RW an PC7
- EN an PC6
> Die Initialisierung scheint zu klappen,> zumindest verschwindet die eine> leuchtende Zeile im Display nach dem einschalten.
Timingprobleme?
> Irgendwas ist faul, die Frage ist nur wo liegt mein Fehler?
Du benutzt den Debugger deiner Entwicklungsumgebung nicht um damit nach
Fehlern zu suchen? :-)
Du hast noch nicht begriffen das man Wartezeiten besser mit Timern
realisiert?
Oh..und du solltest mal ueber den Optimierer in deinem Compiler
nachdenken.
Olaf
Hey,
danke für die schnelle Antwort.
Timingprobleme habe ich auch vermutet, aber dann müsste es
funktionieren, wenn ich Debug-Modus jeden schritt einzeln durchführe und
die Pegel an den Pins messe/vergleiche.
Zum Thema Wartezeiten gebe ich dir recht, aber zum Einstieg wollte ich
Probleme mit Fehlern bei der Timereinstellung vermeiden.
Deshalb habe ich auch auf jegliche Funktionen oder Makros verzichtet.
Für den Optimierer habe ich bisher überhaupt keinen Gedanken verwendet,
da werde ich mich demnächst reinlesen.
Tobi D. schrieb:> - Display 5V> - STM32 3,3V
Da fällt dir nix auf ???
Tobi D. schrieb:> Display 2x16
Dazu passnd: welch Treiber? Display 3V3 kompatibel, ...
Hi Tobi,
also mal abgesehen davon, das dein Programmierstil nicht gerade
effizient ist, ist vermutlicht das hier dein Fehler :
beim schreiben von DATEN auf das Display muss der Pin "RS" High-Pegel
haben (bei Commands Lo-Pegel)
P.S. wenn du nicht alles selbst programmieren willst,
gibt es eine fertige LIB für ein 2x16 Zeichen Text LCD unter :
http://mikrocontroller.bplaced.net
Gruss Uwe
Ich war bei den AVR's mit der Fleury LCD Lib immer sehr zufrieden und
habe sie deshalb auf die STM32 umgestrickt.
Wer also vorher mit der Fleury Lib an AVR's gearbeitet hat sollte
relativ schnell sein Display auch an einem STM zum laufen bringen.
Ich betreibe die normalen 5V Displays am STM.
Das 3.3V Problem loese ich mit einer ChargePump am Contrast Pin des
Displays
welche von einem Pin des STM versorgt wird, auch eine PWM fuer die
Hintergrundbeleuchtung ist in der Lib mit drin.
So laesst sich der Kontrast und die Beleuchtung durch Software
einstellen.
Beides ist per Preprozessor ein oder abzuschalten.
Die Timer die verwendet werden muss natuerlich jeder nach seinen
Beduerfnissen anpassen.
Kleiner Nachtrag, bevor jemand seinen STM beschaedigt.
Im obigen Post habe ich geschrieben das ich die 5V Displays verwende.
Das ist richtig, ich betreibe diese aber mit den gleichen 3.3V am VCC
wie den STM.
im Anhang ein Bild wie man das ganze verkabelt.
Juergen G. schrieb:> Das ist richtig, ich betreibe diese aber mit den gleichen 3.3V am VCC> wie den STM.
Das sieht interessant aus. Kannst du mit PWM auf der Contrastclock dann
den Kontrast einstellen?
Kontrast ist keine PWM, sondern einfach eine Frequenz so um die 70KHz
die die Ladungspumpe versorgt.
Durch Aenderung der Frequenz so zwischen 60kHz und 80KHz kann der
Kontrast eingestellt werden.
Um die Frequenz zu Aendern einfach den Wert im ARR des Timers aendern.
Muss man ein bisschen probieren um die richtigen Werte zu bekommen, das
ist von Display zu Display unterschiedlich.
Linüx: Es ist ein 44780. Pegel sollten passen (High-Pegel_min = 2,4V).
Uwe: Du hast recht! Aber gelöst hat sich mein Problem dadurch leider
nicht, auch wenn es nun ein Fehler weniger ist^^
Das ist kein Programmierstil, sondern extra nur für die Fehlersuche
geschrieben worden. Ich würde/werde fertige Libs benutzen, wenn es
funktioniert.
Jürgen: Jop, die Fleury Lib habe ich bisher immer verwendet, die ist
wirklich toll. Deine Lib macht Sinn, danke fürs veröffentlichen, aber
ich kann nicht bestätigen, dass die 5V Displays mit 3,3V laufen. Laut
Datenblatt brauchen die mindestens 4,5V Versorgung und mit dem STK-Board
habe ich diese Erfahrung auch gemacht.
Tobi D. schrieb:> Linüx: Es ist ein 44780. Pegel sollten passen (High-Pegel_min = 2,4V).
Du weißt, dass nicht überall 44780 drin ist wo 44780 kompatibel drauf
steht? Nur so. Ich würde da immer explizit das Datenblatt meines
Displays befragen.
Sooo, nach nun einigen Stunden mit diesem blöden Fehler ist es
geschafft, danke für eure Hilfe.
Das Problem war die ganze Zeit das Timing, einfach mal ein Delay mit
1000 Takten geht nicht, da MUSS man schon die Zeiten im Datenblatt
einhalten und das ist ohne genauen Takt unmöglich.
Ich hätte mich zuerst mit den Oszillatoreinstellungen befassen sollen
anstatt mit irgendeiner laufenden Einstellung direkt loszuprogrammieren.
Nun heißt es, "Gehe zurück auf Start" und weiter mit Takteinstellungen
und Grundlagen :P
***gelöst und closed ***
Ist zwar geloest und geschlossen, aber ich schreib da trotzdem nochmal
was dazu.
Das mit den 4.5V im Datenblatt der 5V Displays ist richtig, die ASICS
sind aber die selben wie sie auch in den 3V Displays verbaut sind.
Einziger Unterschied ist der Widerstand fuer den internen Oscillator des
ASICS und die Widerstaende fuer die Hintergrundbeleuchtung(falls sie
bestueckt sind).
Das Problem ist, das der Kontrast so um die 4.5V unter VCC sein muss. Da
hat man natuerlich schlechte Karten wenn man das 5V Display ohne
weiteres an 3V haengt.
Die Loesung von oben benutzt die Ladungspumpe um eine negative
Hilfsspannung fuer den Kontrast Pin zu erzeugen.
Ich habe bestimmt schon 30 Displays der verschiedensten Hersteller auf
diese Weise verbaut und alle haben auf Anhieb funktioniert.
>da MUSS man schon die Zeiten im Datenblatt>einhalten und das ist ohne genauen Takt unmöglich.
dann hab ich das unmögliche möglich gemacht :-)
ich benutz auch nur eine Schleife (keinen Timer)
und hab mich von großen Werte zu kleineren rangetastet
(bis das Display nicht mehr reagiert)
hier meine Counterwerte
nach dem PowerOn : 100000
zwischen den Commands : 50000
beim Clock : 1000
wenn die CPU mit 168MHz läuft, passt das bei mir
(aber mit Timer bist du natürlich auf der sichereren Seite)
Gruss Uwe