Wieder Mal LCD Init

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 27 11 2024  15:38:25      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte

Gehe zu Seite ( 1 | 2 Nächste Seite )      


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

 

  

https://forum.electronicwerkstatt.d.....26684

_________________
mfg Jornbyte

Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.

BID = 460128

DonComi

Inventar



Beiträge: 8605
Wohnort: Amerika

Überprüfe deinen Quellkode mal anhand des von mir vor einiger Zeit hochgeladenen Dokumentes, das man sicherlich auch mit der Suchfunktion hätte finden können:

https://forum.electronicwerkstatt.d.....54187

_________________

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


      Nächste Seite
Gehe zu Seite ( 1 | 2 Nächste Seite )
Zurück zur Seite 1 im Unterforum          Vorheriges Thema Nächstes Thema 


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 1 Beiträge verfasst
© x sparkkelsputz        Besucher : 182412911   Heute : 4894    Gestern : 7797    Online : 408        27.11.2024    15:38
4 Besucher in den letzten 60 Sekunden        alle 15.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0478699207306