PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LCD von Reichelt EA DIPS082



HeinerDE
25.11.2004, 20:37
Hallo zusammen,
mal wieder ein Problem mit einem LCD, hängt Euch bestimmt schon zum Hals raus das Thema aber.....wat mut, dat mut
Es handelt sich um ein 2-zeiliges, 8-stelliges Display mit KS0073/HD44780 kompatiblem Chip, das bei mir kein Zeichen zur Anzeige bringt. Das einzige was immer permanent angezeigt wird ist der schwarze Balken in der ersten Zeile, sonst regt sich nichts. Ich hab schon alles mögliche versucht...Verdrahtung 100-fach kontrolliert (ja, Kontrast funktioniert, Standard-Pinbelegung für 4-Bit-Modus: DB4=Portb.4, DB5=Portb.5, DB6=Portb.6, DB7=Portb.7, E=Portb.2, RS=Portb.0)
Ich hab sogar schon manuell eine Initialisierungssequenz für den 4-Bit-Modus nach Datenblatt KS0073 geschrieben und verschiedene Libs getestet, alles ohne Erfolg. Keine Sorge, das Display hab ich auch schon getauscht, die Spannungsversorgung ist o.k. der Debugger vom AVR-Studio zeigt die richtigen Signale auf den Ports.... ich weiß nicht mehr weiter, hat jemand eine grundlegende Idee? Ach ja, ich verwende einen Tiny26, falls das interessiert...
Gruß
Heiner

x-ryder
25.11.2004, 21:19
poste mal bitte deinen bascom-code!

HeinerDE
25.11.2004, 23:41
na gut, vielleicht kann man das folgende als Diskussionsgrundlage gebrauchen:



'#############################################
'# Compiler Anweisungen
'#############################################

$crystal = 2000000 '2 MHz,
$regfile = "At26def.dat" 'Tiny26
'$sim
'$lib "lcd4busy.lib" 'testweise
$lib "lcd4.lbx"

'#############################################
'# Hardware initialisieren
'#############################################

Ddra = &B10011011 'DDRA 7,4,3,1,0 Ausgang / 6,5,2 Eingang
Porta = &B01000000 'Pullup an 6
Ddrb = &B11111111 'DDRB alle Ausgang
'Portb = &B00000000 'testweise

'EA DIPS082, Reichelt 2*8 Zeichen
'bereits in Options/Compiler/LCD eingestellt:
'Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , Rs = Portb.0 , E = Portb.2
'Config Lcd = 16 * 2 '16*2 als Grundlage
'Config Lcdbus = 4 '4-Bit Bus
'Config Lcdmode = Port 'Data mode: PIN

'#############################################
'# Konstanten, Variablen
'#############################################

'Const _lcdport = Portb 'zum Test mit "lcd4busy.lib"
'Const _lcdddr = Ddrb
'Const _lcdin = Pinb
'Const _lcd_rs = 0
'Const _lcd_e = 2
'Const _lcd_rw = 6

Dim X As Byte

'#############################################
'# Hauptprogramm
'#############################################

Do

Cls
Locate 1 , 1
Waitms 10
Lcd "hello world" 'Schnickschnack, Haupsache es läuft etwas
Waitms 10

For X = 1 To 5
Shiftlcd Right
Waitms 50
Next X

For X = 1 To 5
Shiftlcd Left
Waitms 50
Next X

Wait 1
Toggle Porta.7 'Zur optischen Kontrolle mit einer LED
Loop


Der Simulator läuft übrigens prima. Könnte es vielleicht sein, daß eine Anpassung der Lib für das Modul notwendig ist? Leider kann ich mit der Demo-Version anscheinend keine Änderungen vornehmen.
Bin gespannt...
Heiner

andysafe
26.11.2004, 09:45
irgendwie fehlt da die Initialisierung für das Display
"INITLCD"

Und die Config LCD Anweisungen, drin stehen lassen, nicht auskommentieren.

MfG Andreas

HeinerDE
26.11.2004, 13:41
Hi Andreas,
wenn Du mal im Handbuch nachliest, heißt es da unter initlcd: "The LCD display is initialized automatic at start up when LCD statements are used by your code. If fore some reason you would like to initialize it again you can use the INITLCD statement" ...wird also automatisch durchgeführt, hab ich aber trotzdem schon getestet....
An der Auskommentierung kannst Du sehen, daß ich "Config LCD" auch schon versucht habe.....
kennt vielleicht jemand ein grundlegendes Problem mit diesem Display?
Gruß
Heiner

Michael
27.11.2004, 23:07
Hallo HeinerDE,
In deinem Code hast du das "End" vergessen.
Wie hast du RW beschaltet?
Gruß, Michael

HeinerDE
29.11.2004, 00:06
Hi Michael,
!!! Do ... Loop !!!
RW hab ich in verschiedenen Varianten getestet. einmal natürlich auf Masse gelegt, zum anderen und im Zusammenhang mit der lcd4busy.lib auf Portb.6 wie Du im Quelltext sehen kannst.
Hat denn niemand so ein Display getestet?
Gruß
Heiner

Michael
29.11.2004, 00:55
Hallo HeinerDE,


!!! Do ... Loop !!!

ja, klar. Sollte man meinen. Leider klappt das nicht immer. Gerne werden noch Reste eines alten Programmes ausgeführt.
Aber darauf kommst du sicher auch noch.

Gruß, Michael

Edit:

im Zusammenhang mit der lcd4busy.lib auf Portb.6 wie Du im Quelltext sehen kannst
meinem Verständnis nach kannst du für RW nur Ports zwischen 0 und 3 wählen.

Marco78
28.03.2005, 12:47
meinem Verständnis nach kannst du für RW nur Ports zwischen 0 und 3 wählen.
Nur für RW oder gilt das für E und RS auch?

28.03.2005, 13:48
Hallo Heiner

hier ein einfaches LCD Programm das funktioniert
Du brauchst nur deinen Prozessor und die LCD Verdrahtung anpassen, dann sollte es gehen. (hatte ich schonmal gepostet)






'Fehlersuche LCD

'LCD mit HD44780 kompatiblem Controller
'Anschluß
'LCD Pin 1 = 0Volt (GND)
'LCD Pin 2 = +5 Volt (VDD)
'LCD Pin 3 = 0-5 Volt Kontrast (V0): Poti 10k zwischen 0V und 5V Schleifer an LCD3
'LCD Pin 4 = RS an PortA.2
'LCD Pin 5 = R/W an GND
'LCD Pin 6 = E an Porta.3
'LCD Pin 7 = DB0 'frei
'LCD Pin 8 = DB1 'frei
'LCD Pin 9 = DB2 'frei
'LCD Pin 10 = DB3 'frei
'LCD Pin 11 = DB4 an Porta.4
'LCD Pin 12 = DB5 an Porta.5
'LCD Pin 13 = DB6 an Porta.6
'LCD Pin 14 = DB7 an Porta.7

'_________________________________________________ ____________

$crystal = 16000000
'$regfile = "m8515.dat" 'auskommentiert, denn ich verwende ATMega16
$regfile = "m16def.dat"

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Porta.3 , Rs = Porta.2

Initlcd 'initialisiert das LCD

'--------------------------------------------------------------

Do 'Begin Hauptschleife
Cls 'löscht LCD
Upperline 'setzt Cursor in die obere Zeile
Lcd "Erster Test" ' schreibt ins LCD
Lowerline 'setzt Cursor in die untere Zeile
Lcd "Hallo Welt!!!" 'schreibt ins LCD

Wait 1 'wartet 1 sekunde
Cls 'löscht LCD
Wait 1 'wartet 1s und schreibt erneut

Loop 'erneut aufrufen
End


siehe auch https://www.roboternetz.de/phpBB2/viewtopic.php?t=7994

Gruß Bernd (Gandalf)

Das zentrale Problem wird leicht übersehn ! Dietrich Drahtlos.

Michael
28.03.2005, 15:05
Hallo Marco78,


Nur für RW oder gilt das für E und RS auch?

schau dir halt selbst die lcd4busy.lib an.
Ich stimme aber mit Bernd (Gandalf) überein, sein Programm und Pinbelegung funktioniert.
Gruß, Michael

Marco78
28.03.2005, 15:35
Hallo Marco78,


Nur für RW oder gilt das für E und RS auch?

schau dir halt selbst die lcd4busy.lib an.
Ich stimme aber mit Bernd (Gandalf) überein, sein Programm und Pinbelegung funktioniert.
Gruß, Michael
Habe ich schon! Aber wenn ich Assembler zu 100% verstehen und schreiben könnte, bräuchte ich ja kein BASCOM sondern würde AVR-Studio oder so nehmen ;)

Mein Problem ist auch nicht die Ansteuerung eines LCDs, das klappte schon mehrfach. Aber das auslesen, bzw reagieren, auf das Busyflag vermisse ich.

Ich weiss auch, das Mark bei der Programmierung immer genug Zeiten mit eingeplant hat und diese auf die Taktfrequenz des AVR angepasst werden, die es eigentlich nicht notwendig machen das Busyflag mit auszulesen.
Aber ich möchte es trotzdem machen, was er selbst in einer Mailinglist auch empfohlen hat. (Um Code zu sparen und die Geschwindigkeit zu steigern. Das waren seine Worte.)

Mein Problem ist aber, das ich eigentlich keine Pins unter 4 mehr frei habe. Sondern nur noch welche, die mit 4 oder mehr enden.

Michael
28.03.2005, 15:51
Hallo Marco78,


Aber wenn ich Assembler zu 100% verstehen und schreiben könnte, bräuchte ich ja kein BASCOM sondern würde AVR-Studio oder so nehmen

Ja, aus diesem Grunde nehme ich auch eine Hochsprache!
Da gibt es zig fertige Routinen. Daß dadurch das Programm größer/langsamer wird, nehme ich halt in Kauf.
Das ist der Preis der Vereinfachung.
Gruß, Michael

Marco78
28.03.2005, 16:30
Aber warum empfiehlst du mir dann, die .lib anzuschauen?
Es hört sich so an als ob du Assembler auch nicht 100%ig verstehst. (Schreiben mal außen vor).

Größere und langsamere Programme nehme ichjaauch in Kauf. Aber 1. gibt es die möglichkeit die Porgramme kleiner und schneller zu machen. Siehe MCSBytes.LBX. Und grade das kleiner kann bei nur 2kb Flash schon einiges bewirken.
Es geht mir in diesem Fall aber um die Zeit, die gewartet wird, bis der nächste Befehl ausgeführt wird, nachdem das LCD beschrieben wurde. Dadurch geht mir jede Minute die Anzeige einer Sekunde verloren.
Auch im 8bit-Modus.
Und das reagieren auf busy, würde evtl den nächsten Befehl schneller ausführen.

Michael
28.03.2005, 16:39
Hallo Marco78,


Aber warum empfiehlst du mir dann, die .lib anzuschauen?

Lies halt meinen Post vom 29.11.04 01:55 und den davor!


Es hört sich so an als ob du Assembler auch nicht 100%ig verstehst.

Wozu auch? Mein Display funktioniert.
Gruß, Michael

Marco78
28.03.2005, 16:53
Den Post habe ich gelesen, den habe ich ja zitiert! Und alle Posts davor habe ich auch gelesen.
Was hat dir das Verständnis vermittelt?
Und ich habe ja nicht nach RW, sondern nach "und E und RS" gefragt.
Und in der LIB ist das nicht weiter kommentiert.

Das freut mich, das dein LCD geht.
Aber ein:
DO
LCD "Hallo Welt"
LOOP
war mir auf die Dauer zu langweilig.
Und Sinn eines Forums sollte es ja sein, anderen zu helfen, oder nicht?

29.03.2005, 18:20
Hatte mit dem Controller KS0073 auch so meine Probleme. Ursache hier ist, daß bei der Initialisierung erst noch ein "Extension bit" gesetzt werden muß

hier meine angepasste LCD.lib:


;----------------------------------------------------------
;Anschlussbelegung mein LCD
;----------------------------------------------------------
;DB4 = PB3 = PIN11
;DB5 = PB2 = PIN12
;DB6 = PB1 = PIN13
:DB7 = PB0 = Pin14
;E = PD4 = PIN6
;RS = PD5 = PIN4
;R/W = GND = Pin5
;----------------------------------------------------------
[_Init_LCD]
;----------------------------------------------------------
;
; RW liegt auf GND da nur geschrieben wird
; D3, D2, D1, D0 liegen auf GND da nur 4 Bit-Datenlänge
; RS Low für Befehlsübertragung, High für Datenübertragung
; E Low-High-Low für Übertragungsaktivierung
;
;Anschlussbelegung LCD
; PD4 | PD5 | PB0 PB1 PB2 PB3 | PB0 PB1 PB2 PB3
; E | RS | D7 D6 D5 D4 | D3 D2 D1 D0
; | 0 | 0 0 1 0 | 0 1 0 0 | 4 Bit-Datenlänge, extension Bit RE=1
; | 0 | 0 0 0 0 | 1 0 0 1 | 4 Zeilen Modus
; | 0 | 0 0 1 0 | 0 0 0 0 | 4 Bit-Datenlänge, extension Bit RE=0
; | 0 | 0 0 0 0 | 0 1 1 0 | Entry Mode Set Cursor Auto-Increment
; | 0 | 0 0 0 0 | 0 0 0 1 | LCD Inhalt löschen und Cursor auf Home
; | 0 | 0 0 0 0 | 1 1 0 0 | Display ein, Cursor aus, Blinken aus

_Init_LCD:
rcall LCD_Delay_5ms ; 5ms LCD-Verarbeitungspause einplanen
rcall LCD_Delay_5ms ; 5ms LCD-Verarbeitungspause einplanen
rcall LCD_Delay_5ms ; 5ms LCD-Verarbeitungspause einplanen
rcall LCD_Delay_5ms ; 5ms LCD-Verarbeitungspause einplanen
sbi DDRB, 0 ; PB3 (D3/D7) als Ausgang konfigurieren
sbi DDRB, 1 ; PB2 (D2/D6) als Ausgang konfigurieren
sbi DDRB, 2 ; PB1 (D1/D5) als Ausgang konfigurieren
sbi DDRB, 3 ; PB0 (D0/D4) als Ausgang konfigurieren
sbi DDRD, 4 ; PD4 (E) als Ausgang konfigurieren
sbi DDRD, 5 ; PD5 (RS) als Ausgang konfigurieren
ldi r24, &B00100100 ; 4 Bit-Datenlänge, extension Bit
rcall _Lcd_control
ldi r24, &B00001001 ; 4 Zeilen Modus
rcall _Lcd_control
ldi r24, &B00100000 ; 4 Bit-Datenlänge, extension Bit RE=0
rcall _Lcd_control
ldi r24, &B00000110 ; Entry Mode Set Cursor Auto-Increment
rcall _Lcd_control
ldi r24, &B00001100 ; Display ein, Cursor aus, Blinken aus
rcall _Lcd_control
[END]

;----------------------------------------------------------
[_Write_lcd]
;----------------------------------------------------------
_Write_lcd:
sbi PortD, 5 ; RS High für Datenübertragung
rjmp _Write_lcd_Byte ; weiter zur Datenübertragung
_Lcd_control:
cbi PortD, 5 ; RS Low für Befehlsübertragung
_Write_lcd_Byte:
ldi r17, 8 ;Für Schleife 8 x
loop: mov r26, R24 ;Zu übertragendes Byte wird in R24 bereitgestellt und in R26
;für Bitmanipulation
andi r26, &B00000001 ;nur LSB wird ausgewertet
ror r24 ;R24 wird nach rechts verschoben
rol r25 ;R25 wird nach links verschoben
or r25, r26 ;R25 und R26 in Register R25 vereinen
Dec r17 ;-1
Brne loop ;springe zu Schleife wenn R16 > 0
mov r24, r25 ;R25 wird in R24 bereitgestellt
swap r24 ;Nibble tauschen die Daten stehen jetzt gespiegelt an PB0 - PB3!!
mov r25, r24 ; Zu übertragendes Byte wird in R24 bereitgestellt und in R25
;für die Übertragung des 2. Nibble gesichert
; H i g h Nibble muss zuerst übertragen werden
swap R24 ; Nibble tauschen
andi R24, &B00001111 ; nur die unteren 4 Bit (unteres Nibble) berücksichtigen, obere 4 Bit
;(oberes Nibble) auf Null setzen
in R23, PinB ; PortB in Register R23 einlesen (wegen PC7, PC6, PC5, PC4) diese sollen ja
;nicht überschrieben werden
andi R23, &B11110000 ; nur die oberen 4 Bit (PC7, PC6, PC5, PC4) berücksichtigen, untere 4 Bit
;(PC3, PC2, PC1, PC0) auf Null setzen
or R24, R23 ; PortB (PC7, PC6, PC5, PC4) mit LCD (PC3, PC2, PC1, PC0) in Register R24
;vereinen
out PortB, R24 ; PortB aus Register R24 setzen
rcall LCD_Write_Enable ; Übertragungsaktivierung
; L o w Nibble muss noch übertragen werden
andi R25, &B00001111 ; nur die unteren 4 Bit (unteres Nibble) berücksichtigen, obere 4 Bit
;(oberes Nibble) auf Null setzen
or R25, R23 ; PortB (PC7, PC6, PC5, PC4) mit LCD
;(PC3, PC2, PC1, PC0) in Register R25
;vereinen
out PortB, R25 ; PortB aus Register R25 setzen
rcall LCD_Write_Enable ; Übertragungsaktivierung
rcall LCD_Delay_50us ; 50us LCD-Verarbeitungspause einplanen
ret

LCD_Write_Enable:
sbi PortD, 4 ; E High Übertragungsaktivierung gestartet
nop ; 3 Taktzyklen warten
nop
nop
cbi PortD, 4 ; E Low Übertragungsaktivierung beendet
ret ; Funktionsende

LCD_Delay_5ms:
ldi R24, 255 ; R24 Register mit Delaywert 100 * 50us vorbelegen
LCD_Delay_5ms2:
rcall LCD_Delay_50us ; 50us Pause
dec R24 ; R24 Registerinhalt um 1 runterzählen
brne LCD_Delay_5ms2 ; Springe bei ungleich zurück zu LCD_Delay_5ms2
ret ; Funktionsende

LCD_Delay_50us:
ldi R25, 165 ; R25 Register mit Delaywert vorbelegen
LCD_Delay_50us2:
dec R25 ; R25 Registerinhalt um 1 runterzählen
brne LCD_Delay_50us2 ; Springe bei ungleich zurück zu LCD_Delay_50us2
ret ; 1 Takt (Befehlszyklus) bei 3,6864Mhz dauert ca. 271ns
; 50us / 271ns * 3 Takte in der Schleife = 61,5
[END]

;----------------------------------------------------------
[_CLS]
;----------------------------------------------------------
_Cls:
ldi R24, &B00000001 ; LCD Inhalt löschen und Cursor auf Home
rcall _Lcd_control ; Befehl an LCD senden
rcall LCD_Delay_5ms ; 5ms LCD-Verarbeitungspause einplanen
ret
[END]


Das ganze sieht dann als Beispiel so aus:


$regfile = "2313def.dat" 'für ATMEL AT90S2313
$crystal = 4000000 'Quarz: 4 MHz
$lib "LCD.lib"
Ddrd = &B0110000 'Pin PD5 und PD4 auf Out
Ddrb = &B00001111 'Pin PB0-PB3 auf Out
Config Lcdpin = Pin , Db4 = Portb.3 , Db5 = Portb.2 , Db6 = Portb.1 , Db7 = Portb.0 , E = Portd.4 , Rs = Portd.5
Config Lcd = 20 * 4a ' "a" für spezielles Display
Initlcd 'Initlcd
Cls
Locate 1 , 1
Lcd "erste Zeile"
Locate 2 , 1
Lcd "zweite Zeile"
End


Ich hoffe, damit geholfen zu haben...
Gruß Ronny
www.ronny-net.de

09.04.2005, 21:22
8x2 displays kann man doch garnicht auswählen in bascom :-k
vielleicht gehts deshalb nicht