Wieder Mal LCD Init Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte
Autor |
Wieder Mal LCD Init Suche nach: lcd (4684) |
|
|
|
|
BID = 460033
peterschrott Gesprächig
Beiträge: 167 Wohnort: Düsseldorf
|
|
Hallo Mituser,
ich verzweifle fast an der Initialisierung eines LCD Displays.
Das Display (HD44780) läßt sich mit der LCD Routine von Sprut auf einem 16F84 einwandfrei initialisieren.
Nach Init erscheint "OK" auf dem Display. (Siehe lcd_OK.asm). Da ich auf ATmel umsteigen möchte, habe ich den Code von Sprut auf einen Atmega8, 8MHz "portiert".
Im Debug Mode scheint auch alles zu klappen. Im real Life aber nicht. Das Display zeigt in der oberen Reihe nur dunkle Kästchen an.
Kann sich ein "Wissender" mal den geänderten Code anschauen ??
Ich habe im Atmega Code das gleiche Timing wie im 16F84 Code verwendet, unter Berücksichtigung daß der 1684 mit 4MHz und der Atmega8 mit 8MHz läuft.
Was ist hier falsch und wie kann ich die Hardware testen ??
Thanx for any help
peterschrott
|
|
BID = 460096
Jornbyte Moderator
Beiträge: 7178
|
|
BID = 460128
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
|
BID = 460158
peterschrott Gesprächig
Beiträge: 167 Wohnort: Düsseldorf
|
Hallo zusammen
nichr daß ihr denkt ich hätte mich nicht schlau gemacht. Ich habe im Forum sowie im Netz nachgeforscht.
Bei Jornbytes Link geht es um Initialisierung im 8Bit Mode. Das hilft mir auch nicht weiter, da ich 4Bit Mode brauche. Die Busy Abfrage scheint aber interessant zu sein.
Don Comi´s link bezieht sich viel auf Init in C. Ich brauche aber Assembler.
Nochmals: Die Initialisierung mit Spruts Code auf PIC16F84 klappt, meine "Portierung" auf Atmega8 läuft nicht. Der Fehler muss irgendwo im Code liegen.
Erst mal vielen Dank für euren Input. Ich werde nochmals alles prüfen.
Viele Grüße
peterschrott
|
BID = 460166
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
So, komplett müde habe ich mal in den Assemblerkode geguckt:
ldi loops, wert
rcall wait
ist ja ok, nur wird in wait nix mit loops gemacht. Ergo wird immer die gleiche Zeit verzögert.
Und was mir auf die Schnelle noch auffällt:
du gibst zweimal den richtigen Wert am Anfang aus (0b0011xxxx), aber der dirtte, der eigentlich nochmals 0b0011xxxx sein müsste ist 0b0010xxxx (wobei xxxx ja noch die entsprechenden Steuerleitungen beinhaltet.)
Das hätte man sehen können, wenn man ins von mir hochgeladene Dok geschaut hätte
Alles weitere später, ich bin totmüde, und schreibe morgen ne Klausur..
lim (motivation -> 0)...
_________________
|
BID = 460348
Jornbyte Moderator
Beiträge: 7178
|
Ok, 4 Bit Modus
Code : |
;****Anschluss des LCD im 4-Bit Modus
;Pin Funktion LCD 16*2
;1 GND -> Masse
;2 Vcc -> +5Volt
;3 Vee -> Kontrastregler oder GND
;4 C/D -> PortC4
;5 R/W -> GND
;6 E -> PortC5
;7 D0 -> GND
;8 D1 -> GND
;9 D2 -> GND
;10 D3 -> GND
;11 D4 -> PortC0
;12 D5 -> PortC1
;13 D6 -> PortC2
;14 D7 -> PortC3
;15 Hintergrundbeleuchtung (+5V)
;16 Hintergrundbeleuchtung (GND)
.EQU BlinkOff = 0b00001100 ;LCD An und Blinken aus
.EQU LCD_Aus = 0b00001000 ;LCD Ausschalten
.EQU LCD_Pos1 = 0b10000000 ;1. Zeile 1pos
.EQU LCD_Pos2 = 0b11000000 ;2. Zeile 1pos
rcall lcd_init ;Display initialisieren
rcall lcd_clear ;Display löschen
;***** sendet ein Datenbyte an das LCD ****************
lcd_data:cli
push temp2
push temp1
push temp
mov temp2, temp1 ;"Sicherungskopie" für
;die Übertragung des 2.Nibbles
swap temp1 ;Vertauschen
andi temp1, 0b00001111 ;oberes Nibble auf Null setzen
sbr temp1, 1<<4 ;entspricht 0b00010000
out PORTB, temp1 ;ausgeben
rcall lcd_enable ;Enable-Routine aufrufen
;2. Nibble, kein swap da es schon
;an der richtigen stelle ist
andi temp2, 0b00001111 ;obere Hälfte auf Null setzen
sbr temp2, 1<<4 ;entspricht 0b00010000
out PORTB, temp2 ;ausgeben
rcall lcd_enable ;Enable-Routine aufrufen
rcall delay50us ;Delay-Routine aufrufen
pop temp
pop temp1
pop temp2
sei
ret ;zurück zum Hauptprogramm
;***** sendet einen Befehl an das LCD *****************
lcd_command:
;wie lcd_data, nur ohne RS zu setzen
cli
push temp2
push temp1
mov temp2, temp1
swap temp1
andi temp1, 0b00001111
out PORTB, temp1
rcall lcd_enable
andi temp2, 0b00001111
out PORTB, temp2
rcall lcd_enable
rcall delay50us
pop temp1
pop temp2
sei
ret
;***** erzeugt den Enable-Puls ************************
lcd_enable:
sbi PORTB, 5 ;Enable high
nop ;3 Taktzyklen warten
nop
nop
cbi PORTB, 5 ;Enable wieder low
ret ;Und wieder zurück
;***** Pause nach jeder Übertragung *******************
delay50us: ;50us Pause
push temp1
ldi temp1, 0x85 ;
delay50us_:
dec temp1
brne delay50us_
nop
pop temp1
ret ;wieder zurück
;***** Initialisierung LCD ****************************
lcd_init:
ldi temp3,50
powerupwait:
rcall delay5ms
dec temp3
brne powerupwait
ldi temp1, 0b00000011 ;muss 3mal hintereinander gesendet
out PORTB, temp1 ;werden zur Initialisierung
rcall lcd_enable ;1
rcall delay5ms
rcall lcd_enable ;2
rcall delay5ms
rcall lcd_enable ;und 3!
rcall delay5ms
ldi temp1, 0b00000010 ;4bit-Modus einstellen
out PORTB, temp1
rcall lcd_enable
rcall delay5ms
ldi temp1, 0b00101000 ;noch was einstellen...
rcall lcd_command
ldi temp1, 0b00001100 ;...nochwas...
rcall lcd_command
ldi temp1, 0b00000100 ;endlich fertig
rcall lcd_command
ret
;***** Löschen des Displays **************************
lcd_clear:
ldi temp1, 0b00000001 ;Display löschen
rcall lcd_command
rcall delay5ms
ret
|
|
_________________
mfg Jornbyte
Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.
|
BID = 460359
peterschrott Gesprächig
Beiträge: 167 Wohnort: Düsseldorf
|
Hallo Don Comi,
danke für Deine nächtliche Hilfe.
Der Tip mit dem Delay stimmte, aber der Code dür die Initialisierung müßte eigentlich ok sein.
Das LCD läuft zwar noch immer nicht, aber den größten Bock hab ich mir selbst eingebaut. Ich habe den Prototyp meines Selbstbau Extension Boards an Das Pollin Board angeschlossen. Auf dem Layout waren aber noch einige Fehler, so daß die Datenbits von Port D vertauscht waren.Ich hab einige Testprogramme geschrieben und die Hardware geändert. Die Bit Reihenfolge stimmt jetzt.
Aber nochmal zurück zum Display:
Ich hab den Code nochmals überprüft und das Timing entsprechend deinem Datenblatt geändert. Nach dem Einschalten des Boards bzw des LCD leuchtet die obere Reihe des Displays schwach auf und verblasst dann total. Das war´s.
Ich hab das LCD vorsichtshalber nochmal an mein PIC Kit angeschlossen - funktioniert.
Ich lad jetzt noch mal den geänderten Code runter. Vielleicht findet der eine oder andere doch noch den Bug.
Vielen Dank for any input
peterschrott
|
BID = 460364
Jornbyte Moderator
Beiträge: 7178
|
[ Diese Nachricht wurde geändert von: Jornbyte am 27 Sep 2007 21:17 ]
|
BID = 460372
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Moin,
erstmal vorneweg: Deine Assemblerprogramme sehen gut aus.
Was mir spontan auffällt:
Du kannst es wesentlich leichter gestalten, dass Busyflag abzutasten:
ldi tmp, 0xF ;Bit0-3 bleiben Ausgänge
out DDR, tmp
sbi PORT, E ; E-Leitung setzen -> solange E=1 stehen zu lesende Daten an
sbi PORT, RW ; Lesemodus
frage_Bf_ab:
sbis PIN, 7 ; warten, bis Bit7 (Busyflag) 1 wird
rjmp frage_Bf_ab
cbi PORT, E ; E wieder löschen
cbi PORT, RW ; Lesemodus verlassen
ldi tmp, 0xFF ; alle Bits sind 1
out DDR, tmp ; Datenrichtung wieder setzen
ret
Somit sparst du dir das Auslesen eines Bytes. Außerdem kannst du ab diesem Zeitpunkt deine ganzen Warteschleifen lassen, denn dafür fragst du ja das Busyflag ab
----
Ohne Müll, ich find da keinen Fehler. Habe aber z.Z. keinen Simulator.
Bau mal in den Teil, der nach der Initialisierung des Displays ausgeführt wird, irgendwas rein, dass dir signalisiert, dass der µC nicht irgendwo hängen bleibt, z.b. in einer Warteschleife. Wenn diese Routine erreicht wird, dann sind möglicherweise die Wartezeiten zu klein oder etwas kommt nicht richtig beim Display an. Sonst musst du wirklich alle Pins nachmessen (also nach jedem wichtigen Schritt) und schauen, ob dort das passiert, was auch passieren soll. Du glaubst nicht, was ich da schon erlebt habe hier... Der blödeste Fehler und ihn nicht gefunden
P.S. Das Programm sieht sehr sauber aus; find ich gut!
_________________
|
BID = 460388
peterschrott Gesprächig
Beiträge: 167 Wohnort: Düsseldorf
|
Hallo Don Comi, hallo Jornbyte
Ich hab die Busyabfrage entsprechend geändert, das hat aber nicht am LCD bewirkt. Die obere Reihe leuchtet schwach auf, dann erlischt das Display.
Jornbyte, der Code den du gepostet hast ist im Prinzip genau der Code mit dem ich angefangen hab zu experimentieren. Da ich keinen Erfolg hatte, habe ich das auf die fehlende Busyabfrage zurückgeführt. Hab mich aber geirrt.
Ich werde das Gefühl nicht los, daß es sich hier irgendwie um ein Hardwareproblem handelt.
Ich habe am Display die unbenutzten Bits D0-D3 nicht auf Masse gelegt.
Vielleicht müssen bei der Busyabfrage die internen Pull up´s aktiviert werden.
Ich weiss es nicht.
Wenn ihr noch ein paar Ideen habt ware ich dankbar.
viele Grüße
peterschrott
|
BID = 460390
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Miss mal die spannung mit nem Oszi parallel zu der Versorgungspannung. Die sollte stabil sein.
Weitere Möglichekteiten:
1. Pins falsch belegt; kann das Display bei Falschpolung killen.
2. Daten-/Steuerleitungen nicht richtig verleitungt (Anspielung auf Sam2s Kabel...)
3. Kontrastspannung ändert sich, Balken verschwindet langsam, da Kontrast geändert wird.
Die Leitungen zwischen Display und Kontroller sollten auch nicht zu lang sein.
Edit:
Und: wird das Programm bis zur Hauptroutine erreicht? Wenn ja, dann scheint alles in Ordnung zu sein.
Lass dort ne LED blinken oder so. Irgendwas einfaches.
_________________
[ Diese Nachricht wurde geändert von: DonComi am 27 Sep 2007 22:59 ]
|
BID = 460401
Jornbyte Moderator
Beiträge: 7178
|
Also, mein Code ist für 8 MHz, so wie deiner, ausgelegt. Prüfe mal deine Wartezeiten. Auch die Verbindungen zum LCD (messen 1:1 am Controllerpin zu LCD) prüfen. Auf kurzen prüfen (1 zu 2 / 2 zu 3...). Wenn das nix nutzt, Wartezeiten mal Faktor 100 größer wählen. Das das Display etwas tut ist ja schon mal zu erkennen. Daher ist aus meiner Sicht ein Zeitproblem vorhanden.
_________________
mfg Jornbyte
Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.
|
BID = 460575
peterschrott Gesprächig
Beiträge: 167 Wohnort: Düsseldorf
|
Hallo zusammen,
erst mal, das LCD verhält sich nach diversen Tests jetzt anders. Nach Anlegen der Betriebsspannung leuchtet die obere Reihe in sattem schwarz, will meinen alle Matrix Punkte sind an, auch Cursor.
Haltet mich bitte nicht für einen Spinner wenn ich euch schreibe, wie ich das herausgefunden habe. Ich habe ins Hauptprogramm, noch vor LCD Init eine Stop Loop gesetzt, dabei sollte Bit 0 Port D =1 sein. Mit dem Oszi habe ich festgestellt, daß dort eine Schwingung von ca. 40Khz stattfand. Egal wie ich Bit 0 gesetzt habe, es war immer eine Schwingung von 40KHz auf der Enable zu messen.Ich hab zuerst mein Extender Board abgeklemmt und auf direkt am PIN 2 gemessen - genau dasselbe.
Bei vorherigen Testprogrammen habe ich PortD bereits angesteuert. Also ein altes Programm gestartet. Klappte einwandfrei. Bit 0 ließ sich setzen und löschen, keine Schwingung von 40KHz.
Hab daraufhin den Code in mein LCD Assemblerprogramm kopiert, ging aber auch nicht. Hab dann ein neues Projekt gestartet, den Code reinkopiert und dann lief es. Also irgendetwas war wohl in dem Assembler Code nicht ok ? ! ? Hab ich bisher noch nicht erlebt. Alles sehr mysteriös.
Jetzt bin ich zumindest schon mal soweit, daß ich das Programm stückweise testen kann.
Werd mal mit dem Timing was probieren, falls alles nichts nützt werde ich das LCD direkt am Sockel des Atmega16 über kurzes Kabel befestigen.
Das Flachbandkabel vom Pollin zum Extender ist ca. 8cm lang, vom Extender zum LCD ca. 20cm.
Ich mal mal eben ein Foto.
Bis denne . . .
peterschrott
|
BID = 460590
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Diese Schwingungen sind vermutlich beim Abfragen des Busyflags entstanden. Da ließt du ja dauern ein Byte ein, auch wenn es reichen würde, E zu setzen, RW zu setzen und zu warten, bis D7 High wird.
(Oder hast du schon meinen Assemblerteil dringehabt? dann liegts woanders dran.)
_________________
|
BID = 460612
peterschrott Gesprächig
Beiträge: 167 Wohnort: Düsseldorf
|
Hallo Don Comi,
deinen Assembler Code hab ich drin, macht viel Sinn.
Ich hab verschiedene Timing Settings probiert, aber nie etwas brauchbares auf dem Display, nur schwarze Kästchen.
Ich glaube immer mehr an ein Hardware Timing Problem, wie auch schon Jornbyte meinte. Ich werde mal ein kurzes Kabel zusammenlöten.
Ich melde mich dann wieder.
Bis denne . . .
peterschrott
|
|
Zum Ersatzteileshop
Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum
Datenschutz
Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland
gerechnet auf die letzten 30 Tage haben wir 20 Beiträge im Durchschnitt pro Tag heute wurden bisher 18 Beiträge verfasst © x sparkkelsputz Besucher : 182429767 Heute : 3728 Gestern : 5094 Online : 410 30.11.2024 16:35 14 Besucher in den letzten 60 Sekunden alle 4.29 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
|
xcvb
ycvb
0.0410850048065
|