www.mikrocontroller.net

Forum: Mikrocontroller und Elektronik LCD EA DIP204-4 Initialisieren

Autor: Jochen A. (neurotoxer)
Datum: 27.09.2007 20:40
Dateianhang: LCDroutinen.rar (5,6 KB, 137 Downloads)

Guten Abend,
da ich dieses Forum häufig nutze wenn ich Fragen zur uC Programmierung
habe, dachte ich es ist an der Zeit auch mal etwas zurückzugeben...
Also stelle ich jetzt mal meine LCDroutinen vor.

Hintergrund:
Das LCD Display EA DIP204-4 hat mir leichte Kopfschmerzen bereitet.
Ich habe schon diverse andere LCDs zum laufen gebracht, aber bei diesem
hatte ich Schwierigkeiten mit der Initialisierung. Da offenbar auch
andere Nutzer dieses Forums schon Probleme mit diesem LCD hatten, poste
ich mal meine Lösung zum Init.
Das Display verwendet den Controller KS0073. Dieser ist zwar nahezu 100%
HD44780 kompatibel(laut Datenblatt), aber auch nur nahezu...
Denn die Initialisierung läuft anders ab als beim HD44780. Hierzu eine
Passage aus den Datenblatt es KS0073:
  1) Clear Display
  2) Set Functions instruction
  3) Control Display ON/OFF instruction
  4) Set Entry Mode instruction
  5) Set Extension Function instruction
  6) Enable Scroll/Shift instruction
  7) Set scroll Quantity instruction
danach muss unter umständen wieder Clear Display ausgeführt werden.

Die passenden Kommandos für eine 4x20 Zeichen initialisierung bitte dem
Dateianhang entnehmen.

mfg Neurotoxer
Autor: Marcel Niess (rufnag)
Datum: 20.11.2007 17:51

sers,
hat vielleicht die initialisierung jemand auch für assembler???
gru?
Autor: Marcel Niess (rufnag)
Datum: 20.11.2007 18:33

hab ein ea dip204-4 mit ks0073 kontroller
Hier mein code: (Leider funktioniert er nicht, alles wie im tutorial,
nur init anders:)
.include "m8def.inc"

.def temp1 = r16
.def temp2 = r17
.def temp3 = r18


           ldi temp1, LOW(RAMEND)      ; LOW-Byte der obersten
RAM-Adresse
           out SPL, temp1
           ldi temp1, HIGH(RAMEND)     ; HIGH-Byte der obersten
RAM-Adresse
           out SPH, temp1

           ldi temp1, 0xFF    ; Port D = Ausgang
           out DDRD, temp1

           rcall lcd_init     ; Display initialisieren
           rcall lcd_clear    ; Display löschen

           ldi temp1, 'T'     ; Zeichen anzeigen
           rcall lcd_data

           ldi temp1, 'e'     ; Zeichen anzeigen
           rcall lcd_data

           ldi temp1, 's'     ; Zeichen anzeigen
           rcall lcd_data

           ldi temp1, 't'     ; Zeichen anzeigen
           rcall lcd_data

loop:
           rjmp loop

;.include "lcd-routines.asm"            ; LCD-Routinen werden hier
eingefügt

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                 LCD-Routinen                ;;
;;                 ============                ;;
;;              (c)andreas-s@web.de            ;;
;;                                             ;;
;; 4bit-Interface                              ;;
;; DB4-DB7:       PD0-PD3                      ;;
;; RS:            PD4                          ;;
;; E:             PD5                          ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



 ;sendet ein Datenbyte an das LCD
lcd_data:
           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 PORTD, 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 PORTD, temp2             ; ausgeben
           rcall lcd_enable             ; Enable-Routine aufrufen
           rcall delay50us              ; Delay-Routine aufrufen
           ret                          ; zurück zum Hauptprogramm

 ; sendet einen Befehl an das LCD
lcd_command:                            ; wie lcd_data, nur RS=0
           mov temp2, temp1
           swap temp1
           andi temp1, 0b00001111
           out PORTD, temp1
           rcall lcd_enable
           andi temp2, 0b00001111
           out PORTD, temp2
           rcall lcd_enable
           rcall delay50us
           ret

 ; erzeugt den Enable-Puls
 ;
 ; Bei höherem Takt (>= 8 MHz) kann es notwendig sein,
 ; vor dem Enable High 1-2 Wartetakte (nop) einzufügen.
 ; Siehe dazu Beitrag "Bitte helft mir. Schon wieder AtMega16"
lcd_enable:
           sbi PORTD, 5                 ; Enable high
           nop                          ; 3 Taktzyklen warten
           nop
           nop
           cbi PORTD, 5                 ; Enable wieder low
           ret                          ; Und wieder zurück

 ; Pause nach jeder Übertragung
delay50us:                              ; 50us Pause
           ldi  temp1, $42
delay50us_:dec  temp1
           brne delay50us_
           ret                          ; wieder zurück

 ; Längere Pause für manche Befehle
delay5ms:                               ; 5ms Pause
           ldi  temp1, $21
WGLOOP0:   ldi  temp2, $C9
WGLOOP1:   dec  temp2
           brne WGLOOP1
           dec  temp1
           brne WGLOOP0
           ret                          ; wieder zurück

 ; Initialisierung: muss ganz am Anfang des Programms aufgerufen werden
lcd_init:
           ldi  temp3,50
powerupwait:
           rcall  delay5ms
           dec  temp3
           brne powerupwait
           ldi temp1, 0b00100100        ;
           out PORTD, temp1             ;
           rcall lcd_enable             ;
           rcall delay5ms

           ldi temp1, 0b00001001        ; 4bit-Modus einstellen
           out PORTD, temp1
           rcall lcd_enable
           rcall delay5ms
           ldi temp1, 0b00100000        ; 4Bit
           rcall lcd_command
           ldi temp1, 0b00001100        ; Display ein  Cursor aus 
kein Blinken
           rcall lcd_command
           ldi temp1, 0b00000110        ; inkrement / kein Scrollen
           rcall lcd_command
           ret

 ; Sendet den Befehl zur Löschung des Displays
lcd_clear:
           ldi temp1, 0b00000001   ; Display löschen
           rcall lcd_command
           rcall delay5ms
           ret

 ; Sendet den Befehl: Cursor Home
lcd_home:
           ldi temp1, 0b00000010   ; Cursor Home
           rcall lcd_command
           rcall delay5ms
           ret
bitte um hilfe
Autor: Jochen A. (neurotoxer)
Datum: 03.12.2007 20:17

Servus,
versuchs mal mit dieser Init-Routine:

lcd_init:
           ldi  temp3,50
powerupwait:
           rcall  delay5ms
           dec  temp3
           brne powerupwait

           rcall lcd_clear
           ldi temp1, 0b00100100
           rcall lcd_command
           ldi temp1, 0b00001100
           rcall lcd_command
           ldi temp1, 0b00100000
           rcall lcd_command
           ldi temp1, 0b00000110
           rcall lcd_command
           ldi temp1, 0b00100100
           rcall lcd_command
           ldi temp1, 0b00001001
           rcall lcd_command
           ldi temp1, 0b00100000
           rcall lcd_command
           rcall lcd_clear

           ret

Auf die Reihenfolge der Kommandos achten! Sonst streikt das Display.

mfg Neurotoxer
Autor: Marcel Niess (rufnag)
Datum: 03.12.2007 20:27

super,
danke. werde es testen und hoffentlich mal was auf meinem display sehen
Autor: Alfred Q. (higedigdag)
Datum: 21.12.2007 16:06

@Jochen

Ich habe deine Lib oben benutzt. Leider klappt es bei mir trotzdem nicht
:(
Das Display zeigt mir nur alle Felder als weiße Kästchen an.

Kann es zu Problemen führen wenn man die Leitungen zu lang hat? Hab ca.
40cm Kabel bis zum LCD.

mfg andy
Autor: µluxx .. (uluxx) Benutzerseite
Datum: 21.12.2007 16:16

Codesammlung ?
Autor: Rudolph (Gast)
Datum: 21.12.2007 16:21

Alle Felder als weisse Kästchen?
Kontrast-Spannung?
Autor: Matthias (Gast)
Datum: 21.12.2007 16:23

> Das Display zeigt mir nur alle Felder als weiße Kästchen an.

Standardfrage: Weiße Kästen kommen beim DIP-204 auch wenn die
Kontrastspannung nicht stimmt, schon mal geprüft?
Autor: Matthias (Gast)
Datum: 21.12.2007 17:48

Deine Initialisierung für 4-Bit ist nicht korrekt:
Nimm mal diese:
 display_command(0x24);
 display_command(0x09);
 display_command(0x20);
 display_command(0x0C);
 display_command(0x01);
 display_command(0x06); 

Damit läuft Dein Programm bei mir mit Anpassung auf einen 8051er und
DIP204-4.
Autor: Alfred Q. (higedigdag)
Datum: 21.12.2007 18:35

Hab meinen Fehler gefunden :)

Ich hatte den RES(reset) auf LOW gelegt.

Jetzt klappts wunderbar, auch mit der Routine von Peter Fleury.

Andy

http://i207.photobucket.com/albums/bb49/higedigdag...
Autor: Marcel Niess (rufnag)
Datum: 23.12.2007 12:39

sers,
das mit dem reset ist so ne sache, im datenblatt steht doch bei reset L.
warum muss das dann auf high liegen wenn es gehen soll??
Autor: Alfred Q. (higedigdag)
Datum: 23.12.2007 12:45

ja das versteh ich auch nicht...
aber ich glaub es ist eher so, dass es nur auf low gelegt wird wenn der
reset gemacht werden soll.
ich hab ihn jetzt einfach nicht angeschlossen(auch nicht auf high
gelegt) weil im datenblatt bei mir steht L und nicht L/H also geh ich
davon aus das man es nicht auf high legen muss...

es klappt ja jetzt super :)

mfg andy
Autor: Marcel Niess (rufnag)
Datum: 23.12.2007 12:59

kannst du mal deine routine posten, die weißen kästchen stehen bei mir
wie ne eins, langsam weiß ich nicht mehr was ich ncoh machen kann
Autor: Alfred Q. (higedigdag)
Datum: 23.12.2007 13:04

also ich habe diese genommen:

http://homepage.hispeed.ch/peterfleury/avr-softwar...

du musst in der lcd.h nur den controller umstellen auf den KS0073 und
dann deine ports und so anpassen.

dann sollte es gehen
Autor: Marcel Niess (rufnag)
Datum: 23.12.2007 14:01

endlich, vielen dank an alle, es war letztendlich auch nur der
resetanschluss, oh man, obwohl es im datenblatt so steht
jetzt kann ich endlich mal anfangen mit dem lcd zu spielen
Autor: Jochen A. (neurotoxer)
Datum: 20.03.2008 21:18
Dateianhang: EADIP204-4.pdf (24,7 KB, 61 Downloads)

Servus.
Da es eine Nachfrage wegen der Pinbelegung des Displays gab, habe ich
diese mal als pdf angehängt.
Autor: Thomas Müller (thomas1123) Benutzerseite
Datum: 03.05.2008 15:06

Ich bin irgentwie am verzweifeln

wenn ich das display mit einem pic16f690 initialisiere dann klappt alles
wunderbar aber wenn ich die gleiche routine benutze um es mit einem
16F887 zu initialisieren geht fast nix ausser das alle segmente schwarz
werden. wenn das display bei der init eingeschaltet wird.

was könnte das sein?
ich habe es schon nen halbes dutzend mal auf meinem steckbrett aufgebaut
und auch bestimmt 100 mal die belegung nachgeschaut aber es will einfach
nicht wie gesagt mit dem 16f690 kein problem.
Autor: holger (Gast)
Datum: 03.05.2008 18:34

ADCON auf digital IO umgeschaltet ?
Ansonsten kann man ohne Code und/oder Schaltung
nicht viel sagen.
Autor: Thomas Müller (thomas1123) Benutzerseite
Datum: 03.05.2008 20:45

ja ANSEL und ANSELH sind beider auf 0 gesetzt.

zur schaltung
Steckbrett mit 5V Festspannungsregler
dann das Display "normal" angeschlossen PORTC sind die 8 Datenleitungen
und auf PORTA habe ich die 3 Steuerleitungen. also nichts spektakuläres
habe sowas schon nen paar dutzend mal auf nem Steckbrett aufgebaut und
es funktionierte alles bestens sogar mit 8MHz INTOSC beim PIC16F690. Ich
habe inzwichen sogar beim 16F887 den LFINTOSC mit 32khz genommen und die
Ausgänge überprüft und ja die tun wie se sollen. bin langsam ratlos habe
mir sogar schonmal angeschaut wie das bei dme controller mit spi abläuft
und festgestellt um 1Byte daten an das ding zu senden muss man 3 byte
über den bus schieben und das bei maximal 50kHz SPI CLK
Autor: Alain Fuchs (fox82)
Datum: 05.06.2008 12:51

Was für viele selbstverständlich ist, war für mich zuerst nicht ganz
klar.
Habe alles so angeschlossen wie im dislplay.h beschrieben. Die Pins für
den 4Bit-Modus werden vom DIP204 Pin 11 bis 14 benötigt.

Durch andere Beiträge, habe ich auch gesehen, dass jemand vergessen hat
R/W (SID) auf GND zu schalten. Habe dies gemacht und es funktioniert
wunderbar!!!

Danke für das Hinaufstellen der Initialisierung.

Gruss Alain

Antwort schreiben

Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
  • Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel





Hinweis: der Originalbeitrag ist mehr als 6 Monate alt.

webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net