Initialisierung LCD-display 4-bittig?

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: 25 11 2024  16:49:20      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 | 3 Nächste Seite )      


Autor
Initialisierung LCD-display 4-bittig?

    







BID = 41844

QuirinO

Schreibmaschine



Beiträge: 2205
Wohnort: Behringersdorf
Zur Homepage von QuirinO ICQ Status  
 

  


Hi...
hab mir vor kurzem ein 1-Zeiliges LCD-modul
mit dem wohl recht bekannten display Controller
HD44780 zugelegt.

Ich bringe ihn aber nicht dazu Das auszugeben was ich will.

Hab für den PIC16F628 ein kleines initialisierungsprogramm geschrieben in Assembler.
Ich bin mir aber nicht ganz im klaren wie genau so eine
initialisierung aussehen muss.
Aus dem Datenblatt werd ich nicht schlau...
ich denke ich hab die initialiseirungssequenz bis zu dem Punkt hin verstanden in dem der 4-bit mode aktiviert wird, dann stehen immer 2 4-bit sequenzen untereinander, wobei eine immer nur aus 0000 besteht...
muss ich dann zuerst 0000 senden und dann das steuerbit oder wie...
hat jemand damit schon erfahrung?
kann mir jemand ein kleines beispiel erklären wie so eine Initialisierung im 4-bit mode funktioniert?
hab schon das ganze internet abgegrast, werd aber aus dem meisten nicht schlau...
bin kurz davor das ding in die tonne zu kicken , bitte helft mir... danke.

BID = 41861

alpha-ranger

Schreibmaschine



Beiträge: 1517
Wohnort: Harz / Heide

 

  

Hallo, bevor die Tonne gefüllt wird, einfach her damit. !
Der Baustein darauf erwartet alle Daten als 8 bit Wort.
Im 4-Bit Betrieb werden nur die Datenleitungen D4 bis D7 benutzt.
Ist der Controller erst mal im 4 Bit betrieb, mußt Du alle 8bit Datenwörter in zwei 4 Bit Wörter ( nibbles ) zerlegen, und übertragen. Da viele Steuerbefehle mit 0000 anfangen, ist das erste nibble auch 0000. Dann mußt Du dem Controller mitteilen ,das das Display eingeschaltet ist, ob der Cursor sichtbar und nicht blinkt usw.usw.
Das ist die Konfigurations-Sequenz.
Und dann fleißig die Nummern der Buchstaben ( ASCII`s )
senden.Hier ein altes Beispiel, leider für Atmel, aber Assembler-programmierer verstehen das auch ohne weitere Erklärung.>> bitmas ist eine Maske 00001111 <<<.

;********ASCII-Output*********
ASCII: ;Formt ein Byte(temp1) in zwei nibble´s
mov temp2,temp1 ;und gibt sie aus.
swap temp2
and temp2,bitmas ;set h-nibble low
sbr temp2,0b00100000 ;set RS high
rcall output
mov temp2,temp1
and temp2,bitmas
sbr temp2,0b00100000 ;set RS high
rcall output
ret
;****** output timing is all !***********
Output:
out portb,temp2
de: dec delay1 ;set up time
brne de ;minimal 0,15 ms
sbi portb,4 ;ENABLE=On
del: dec delay1 ;enable pulse width
brne del ;minimal 0,5 ms
cbi portb,4 ;ENABLE=Off jetzt datenübernahme
del1:
dec delay1 ;Data set up time
brne del1 ;minimal 0,2 ms
clr temp2
out portb,temp2
ret

Dies kleine Unterprogramm ist absichtlich zweigeteilt, denn zur Ausgabe von Steuerbefehlen, benötigt man nur "Output".
Die meisten µProz sind zu schnell für diese Displays, deshalb immer schön Zeitschleifen einbauen.
Das habe ich mal vor 7 Jahren geschrieben, ist aber anscheinend immer noch aktuell.
mfG.


_________________
Wie der alte Meister schon wußte: Der Fehler liegt meist zwischen Plus und Minus. :-)
Und wenn ich mir nicht mehr helfen kann, schließ ich Plus an Minus an.

BID = 41879

QuirinO

Schreibmaschine



Beiträge: 2205
Wohnort: Behringersdorf
Zur Homepage von QuirinO ICQ Status  

ok danke für die ausführliche antwort......
hab aber wahrscheinlich wiedermal meine frage ungenau gestellt?

SO weit bin ich auch schon gekommen... aber das display zeigt nur schrott an...


sollte ich display shift ein- oder ausschalten?
sollte ich adress pointer inkrementieren oder dekrementieren
einstellen?

wie genau kann ich abfragen ob der lcd-controller intern fertiggearbeitet hat?




BID = 41903

alpha-ranger

Schreibmaschine



Beiträge: 1517
Wohnort: Harz / Heide

Hallo,
die Abfrage des status kann man sich bei hinreichend langsamen timing schenken.
Der Cursor incrementiert von selbst zur nächsten Stelle.

Besonderheit sind Displays mit mehr als acht Zeichen pro Zeile und nur EINEM Controller Chip hinten drauf.z.bsp. 1X16 ! Da ist es notwendig, den Cursor mitten in der Zeile auf 40h zu setzen.

Mit der Aussage " schrott" kann ich auch leider nix anfangen. Sind nur wilde Zeichen zu sehen ? Sieht man, wenn man im einzelschrittbetrieb das display ansteuert, eine Änderung ? Meist liegt es am timing. Gerade beim initialisieren braucht man seeeehr vieeel Zeit.

Um das Display betriebsbereit zu machen, muß die Ini-sequenz nur folgende worte senden:
00000010> 4bit-modus
00000010> function-set
00001100
00000000> disp.-on, usw.
00001110

Pin 5 vom Disp. kann dauerhaft auf minus geschaltet werden.
Die Funktionen brauchst erst mal nicht.
mfG.

BID = 41975

Verion

Gelegenheitsposter



Beiträge: 90

http://www.sprut.de/electronic/lcd/index.htm

sehr gute seite über LCDs..
ansonsten mal alle Kabel, etc testen nach wackelkontakten und ähnlichem..

BID = 42000

Jornbyte

Moderator



Beiträge: 7178

Bei fast allen LCD-Displays ist eine Warteschleife nach der Datenübergabe erforderlich und liegt im 5mS Bereich. Ist die Zeit zu klein, wird meist "Schrott" angezeigt, wie bei dir. Hast du ein Delay eingebaut?

_________________
mfg Jornbyte

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

BID = 42035

QuirinO

Schreibmaschine



Beiträge: 2205
Wohnort: Behringersdorf
Zur Homepage von QuirinO ICQ Status  

Ja, delay iss drin hab irgendwie den Verdacht dass es an dem liegt, WAS ich dem display sende... ansonsten danke erstma...

BID = 42680

tixiv

Schreibmaschine



Beiträge: 1492
Wohnort: Gelsenkirchen

was Du beim 4 bit modus beachten musst, ist dass Du beim initialisieren zuerst das display 3* nacheinander in den
8 bit modus schicken musst, also jedesmal mit einem Takt danach, und danach erst in den 4 bit Modus mit einem Takt.
Danach dann jeweils erst den high nibble, und dann den low nibble. Als erstes mußt Du dann nochmal den config befehl
schicken, und die bits im low nibble korrekt setzen.

Die ganze sequenz hat den Sinn, daß das Display aus jedem
Zustand heraus fuktioniert. Es kann beim einschalten entweder im 4bit oder im 8bit modus sein. Wenns im 4bit modus is, kanns sein daß es gerade das low nibble erwartet.
Das erste nibble was gesendet wird, wird dann ignoriert,
das zweite setzt dann den 8bit modus, und das dritte ist
weider egal, wird aber gebraucht um den Befehl zu bestätigen. Nun ist das Display aber definiert im 8 bit modus. wenns vorher schon drinn war, dann is das ja egal,
das man ihms noch n paar mal befiehlt. Ab hier kann man dann definiert das Teil in den 4bit modus schicken (dafür werden ja nur die oberen 4bit gebraucht beim 8bit befehl), und danach kann man dann seine eigentliche config einstellen.

mfg
Peter

BID = 42691

QuirinO

Schreibmaschine



Beiträge: 2205
Wohnort: Behringersdorf
Zur Homepage von QuirinO ICQ Status  

DAnn iss das also eigentlich käse was isn dem datenblatt (von Conrad) drinsteht, oder?

Ich dachte immer das merkt sich nicht in welchem modus das gearbeitet hat wenn die Stromzufuhr abgebrochen wurde...
naja... werds ma so checken... danke

BID = 43694

Midnight

Stammposter



Beiträge: 256

Hi, schau mal unter:

http://home.t-online.de/home/holger.....d.htm

Holger hat auch mit nem 628 ein 4-bit LCD aufgebaut, das von RS232 auf Display übersetzt. Ist sehr gut dokumentiert mit Quellcode und Beschaltung des LCD. Vielleicht kannst Du ja so Deine Probleme im Vergleich lokalisieren.

BID = 47285

QuirinO

Schreibmaschine



Beiträge: 2205
Wohnort: Behringersdorf
Zur Homepage von QuirinO ICQ Status  

Hallo bin wieder da... und ich glaub ich bin irgendwie nicht fähig die
INITIALISIERUNGSSEQUENZ durchzuführen...

ich hab jetzt schon im 4.Anlauf das Programm neu geschrieben, etwaige Hardwarefehler sind auch ausgeschlossen, hab das ganze mit der schaltung die im buch
"Radioshack-Basic Electronics" verglichen, stimmt überein...
ich geb euch jetzt ma eienen auszug aus dem offiziellen Datenblatt zur 4- bit initialisierung nacher noch mein tolles Programm,(ist mien allererstes assemblerprojekt)
BITTE helft mir, die Verzweiflungsrate iss doch schon recht hoch und die seite von dem, der das Display angesteuert hat über rs232 nhat mir eigentlich auch keine neuen Erkenntnisse gebracht... ich glaub ich bin hald doch nur n NOOB

Passt das Prog so?
Was muss ich dann in meiner Initialisierungsroutine hischreiben dass dat ding ma was anzeigt!!
und kann mir bitte jemand die einzelnen Schritte der Initialisierung erklären... ich will das das geht, das iss echt zum

Danke nochma für eure grosse mühe... wenn ich euch langsam auf den Geist geh, dann sagts mir bitte
vielen vielen dank schonma im Voraus...
Quirin

Hier noch der auszug aus dem Datenblatt:

Hochgeladenes Bild : Anleitung.gif

BID = 47286

QuirinO

Schreibmaschine



Beiträge: 2205
Wohnort: Behringersdorf
Zur Homepage von QuirinO ICQ Status  

Und hier noch mein Programm...
PS... ich hoffe man kann das Datenblatt lesen...

Hochgeladene Datei : qlcd.txt

BID = 47455

QuirinO

Schreibmaschine



Beiträge: 2205
Wohnort: Behringersdorf
Zur Homepage von QuirinO ICQ Status  

Ok 1 tag später keine antwort, aber mehr erkenntnisse...


vergesst das programm ich hab wiedermal ein neues geschrieben

diesmal funzt es soweit, dass mir das display wirklich buchstaben anzeigt... nur leider nicht die die es soll...

das display zeigt nur buchstaben an bei denen das UNTERE nibble "HHHH" also 1111 ist... und es sieht für mich so aus als würde es die buchstaben an der falschen stelle im display anzeigen... kann mir das vielleicht nu jemand erklären? ein kleiner teilerfolg iss ja zu vermerken !

EDIT: noch ne neue erkenntniss: wenn ich die am LCD freigebliebenen pins mit Pulldowns nach masse lege, dann zeigt es buchstaben mit "LLL" im unteren nibble an

->daraus folgt: fehler bei der Initialisierung... und genau da liegt der hund begraben.... aslo bitte ich nochmal um ne genaue beschreibung des 4 bit initvorganges (betonung liegt auf genau)

hier mal das Programm: wo liegt der Fehler... Danke

list p=16f628
include "p16f628.inc"



loops equ 0x20 ; Wartezeit für WAIT in Millisekunden
loops2 equ 0x21 ; interner timer für wait
sendbuff equ 0x22 ; sendepuffer

#define LcdE PORTB,7 ; enable Lcd
#define LcdRw PORTB,6 ; read Lcd
#define LcdRs PORTB,5 ; Daten Lcd (nicht control)
#define LcdPort PORTB ; Datenbus des LCD (obere 4 Bit)


org 0x00
;initialisierung und aktrivierung

init1
bsf STATUS, RP0 ; auf Bank 1 umschalten
movlw B'00000000' ; PortB alle output
movwf TRISB ;setzen
bcf STATUS, RP0 ; auf Bank 0 zurückschalten
movlw B'00000000' ; PortB löschen
movwf LcdPort
init2

movlw B'00000011' ;initschritt1
call send8bit ;senden an port B

movlw D'255' ;255 ms warten
movwf loops
call wait

movlw B'00000011' ;initschritt2
call send8bit ;senden an port B

movlw D'255' ;255 ms warten
movwf loops
call wait

movlw B'00000011' ;initschritt3
call send8bit ;senden an port B

movlw D'255' ;255 ms warten
movwf loops
call wait

movlw B'00000010' ;initschritt4 Function set 4-bit (das erste mal)
call send8bit ;senden an port B

movlw D'255' ;255 ms warten
movwf loops
call wait



;ab hier im 4 bit modus

movlw B'00100010' ;initschritt7 zeilen, zeichensatz einstellen
call send4bit ;senden an port B

movlw D'255' ;255 ms warten
movwf loops
call wait

movlw B'00001100' ;initschritt8 Display ON
call send4bit ;senden an port B

movlw D'255' ;255 ms warten
movwf loops
call wait

movlw B'00000001' ;initschritt9 Display LÖSCHEN
call send4bit ;senden an port B

movlw D'255' ;255 ms warten
movwf loops
call wait

movlw B'00000111' ;initschritt10 Display ENTRY mode
call send4bit ;senden an port B

movlw D'255' ;255 ms warten
movwf loops
call wait

;OK ausgeben
movlw 'O'
call sendchar

movlw D'255' ;255 ms warten
movwf loops
call wait

movlw B'01001111'
call sendchar

movlw B'01001011' ;255 ms warten
movwf loops
call wait

goto haupt
;____________________________________________________________________________
;hauptschleife

haupt
nop
goto haupt

;______________________________________________________________________________
;sendebefehle
;8-Bittig

send8bit
movwf sendbuff ;wert im arbeitsregister auf sendepuffer zwischenspeichern

andlw b'00001111' ;nur den datenteil des ports beibehalten

movwf PORTB ;genau diesen teil auf port B schreiben

bsf LcdE ;register im LCD zum lesen freigeben
nop ;kurz warten

movlw D'255' ;255 ms warten
movwf loops
call wait

bcf LcdE ;hi->lo flanke erzeugen

movlw B'00000000' ; PortB löschen
movwf LcdPort

movlw D'25' ;25 ms warten
movwf loops
call wait

return ;rücksprung zum aufruf

;___________________________________________________________________________________________
;4-bittig

;Contorl:

send4bit
movwf sendbuff ;wert im arbeitsregister auf sendepuffer zwischenspeichern

;high nibble senden

swapf sendbuff,w ;zuerst das high nibble holen
andlw b'00001111' ;nur den datenteil des ports beibehalten

movwf PORTB ;genau diesen teil auf port B schreiben

bsf LcdE ;register im LCD zum lesen freigeben

movlw D'255' ;255 ms warten
movwf loops
call wait

nop ;kurz warten
bcf LcdE ;hi->lo flanke erzeugen


movlw B'00000000' ; PortB löschen
movwf LcdPort

;low nibble senden

movlw D'25' ;25 ms warten
movwf loops
call wait

movf sendbuff,w ;jetzt das low nibble holen
andlw b'00001111' ;nur den datenteil des ports beibehalten

movwf PORTB ;genau diesen teil auf port B schreiben

bsf LcdE ;register im LCD zum lesen freigeben

movlw D'255' ;255 ms warten
movwf loops
call wait

nop ;kurz warten
bcf LcdE ;hi->lo flanke erzeugen

movlw B'00000000' ; PortB löschen
movwf LcdPort


return ;rücksprung zum aufruf

;___________________________________________________________________________________________
;BUCHSTABEN SENDEN

sendchar
movwf sendbuff ;wert im arbeitsregister auf sendepuffer zwischenspeichern

;high nibble senden

swapf sendbuff,w ;zuerst das high nibble holen
andlw b'00001111' ;nur den datenteil des ports beibehalten

movwf PORTB ;genau diesen teil auf port B schreiben


bsf LcdRs ;für das display als buchstabe markieren
bsf LcdE ;register im LCD zum lesen freigeben

movlw D'255' ;255 ms warten
movwf loops
call wait

nop ;kurz warten
bcf LcdE ;hi->lo flanke erzeugen
bcf LcdRs ;für das display als buchstabe markieren abschalten


movlw B'00000000' ; PortB löschen
movwf LcdPort

;low nibble senden

movlw D'25' ;25 ms warten
movwf loops
call wait

movf sendbuff,w ;jetzt das low nibble holen
andlw b'00001111' ;nur den datenteil des ports beibehalten

movwf PORTB ;genau diesen teil auf port B schreiben

bsf LcdRs ;für das display als buchstabe markieren
bsf LcdE ;register im LCD zum lesen freigeben

movlw D'255' ;255 ms warten
movwf loops
call wait

nop ;kurz warten
bcf LcdE ;hi->lo flanke erzeugen
bcf LcdRs ;für das display als buchstabe löschen

movlw B'00000000' ; PortB löschen
movwf LcdPort


return ;rücksprung zum aufruf



;Warten______________________________________________________________________________________
wait
top movlw .254 ; timing adjustment variable (1ms)
movwf loops2
top2 nop ; warten und nichts tun
nop
nop
nop
nop
nop
nop
nop
nop
decfsz loops2, F ; innere Schleife fertig?
goto top2 ; nein, noch mal rum
;
decfsz loops, F ; äußere Schleife fertig?
goto top ; nein, noch mal rum
return ; FERTIG und return

END


Ich entschuldige mich für die nerverei, aber wenigstens jornbyte oder alpha ranger könnten da doch durchsteigen oder?

mfg QuirinO


[ Diese Nachricht wurde geändert von: QuirinO am  9 Jan 2004 13:47 ]

BID = 47537

QuirinO

Schreibmaschine



Beiträge: 2205
Wohnort: Behringersdorf
Zur Homepage von QuirinO ICQ Status  

Vergesst alles!!!


Falls es jemanden interessiert:
ES GEHT!!!!!!

Kaum 11 anstrengende Stunden später gehts nu...
alle fehler einzeln eliminiert... hat richtig spass gemacht...

Jetzt muss ich nurnoch rausfinden wie ich den Zeiger
mitten in der Zeile auf 40h setze... aber das schaff ich auch noch... Vielen dank für die unterstützung

mfg Quirin

BID = 47607

alpha-ranger

Schreibmaschine



Beiträge: 1517
Wohnort: Harz / Heide

Hallo,
den Cursor auf 40h setzen:
00001100
00000000 ;setzt Addr. auf 40h

der Display-controller sieht dabei nur die oberen nibbles.

mfg.


      Nächste Seite
Gehe zu Seite ( 1 | 2 | 3 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 10 Beiträge verfasst
© x sparkkelsputz        Besucher : 182397700   Heute : 4896    Gestern : 7548    Online : 649        25.11.2024    16:49
4 Besucher in den letzten 60 Sekunden        alle 15.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0390090942383