PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : DIP LCD (KS0073) Problem



Marten83
07.06.2005, 08:10
Hallo zusammen!

Ich hab schon hier im Forum danach gesucht und es gibt wohl öfter solche Probleme wie ich eins habe.
Folgendes: Ich habe ein 4*20 LCD in DIP Ausführung mit KS0073 (HD44780 kompatiblen) Kontroller an einen AT89S8252.
Es funktioniert soweit auch alles nur wird auf dem LCD der letzte Teil der ersten Zeile und der (eigentlich) 2. Zeile immer eine Zeile darunter angezeigt.
Beispiel (ist n Temperaturfühler):

Innen : 22.5 °C
22.5 °C
Aussen: 18.4 °C
18.4 °C

Braucht ja keiner....
Weiss jemand wie ich das in den Griff bekommen kann?

Vielen Dank

Marten83

Rudi Ratlos
07.06.2005, 11:49
Hallo,

der Fehler liegt in der falschen Initialisierung. Der Controller ist eben nur fast kompatibel mit dem HD44780.
Nach dem Umschalten in den 4 Bit-Modus muss ein bestimmtes Bit gesetzt werden (in der Command-Tabelle die Spalte links), dann - und nur dann - kann man den Controller in den 4-Zeilen-Modus umschalten.
Danach ist zu beachten, dass die Zeile 2 an der Adresse h20, Zeile 3 bei h40 und Zeile 4 bei h60 beginnen.
Den entsprechenden Code habe ich leider zur Zeit nicht präsent, er ist auch im C-Control-Basic geschrieben.
Wenn er benötigt wird, dann bitte Nachricht hinterlassen, die Antwort kann sich aber 1 Tag hinziehen.

Marten83
07.06.2005, 13:35
Danke schonmal für die Anregung.
Leider hab ich keinen Plan davon was genau ich wo ändern kann weil ich auch relativ neu auf dem Gebiet bin.
Wenn du meinst dein Code könnte mir bei der Lösung helfen, dann würde ich mich freuen diesen mal zu sehen.

ronny_s
07.06.2005, 20:33
Hatte das gleiche Problem, Du mußt bei der Initialisierung des Displays ein "Enable-Bit" setzen (siehe Datenblatt).
Ich habe mir dazu eine Libray erstellt, die ich dann in Bascom als erstes mit aufrufe.
Also so:


$regfile = "m8def.dat" 'für ATMEL ATMEGA8
$crystal = 4000000 'Quarz: 4 MHz
$baud = 19200 'Baudrate
$lib "DIP_LCD.lib" 'Libary einbinden
initlcd
...das Programm...

kein "config Lcd" oder so, da das die Libary macht.

Hier noch der Inhalt der Libary:


;----------------------------------------------------------
;Anschlussbelegung mein LCD
;----------------------------------------------------------
;DB4 = PC3 = PIN11
;DB5 = PC2 = PIN12
;DB6 = PC1 = PIN13
:DB7 = PC0 = Pin14
;E = PD6 = PIN6
;RS = PD7 = 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
; PD6 | PD7 | PC0 PC1 PC2 PC3 | PC0 PC1 PC2 PC3
; 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:
mov r1, r18 ;Registerinhalte sichern
mov r3, r21
mov r6, r22
mov r7, r23
mov r8, r24
mov r9, r28
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 DDRC, 0 ; PC3 (D3/D7) als Ausgang konfigurieren
sbi DDRC, 1 ; PC2 (D2/D6) als Ausgang konfigurieren
sbi DDRC, 2 ; PC1 (D1/D5) als Ausgang konfigurieren
sbi DDRC, 3 ; PC0 (D0/D4) als Ausgang konfigurieren
sbi DDRD, 6 ; PD4 (E) als Ausgang konfigurieren
sbi DDRD, 7 ; 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
mov r18, r1 ;alte Registerinhalte wieder zurück
mov r21, r3
mov r22, r6
mov r23, r7
mov r24, r8
mov r28, r9
[END]

;----------------------------------------------------------
[_Write_lcd]
;----------------------------------------------------------
_Write_lcd:
mov r1, r18 ;Registerinhalte sichern
mov r3, r21
mov r6, r22
mov r7, r23
mov r8, r24
mov r9, r28
sbi PortD, 7 ; RS High für Datenübertragung
rjmp _Write_lcd_Byte ; weiter zur Datenübertragung
_Lcd_control:
cbi PortD, 7 ; RS Low für Befehlsübertragung
_Write_lcd_Byte:
ldi r18, 8 ;Für Schleife 8 x
loop: mov r23, R24 ;Zu übertragendes Byte wird in R24 bereitgestellt und in R23 für Bitmanipulation
andi r28, &B00000001 ;nur LSB wird ausgewertet
ror r24 ;R24 wird nach rechts verschoben
rol r22 ;R22 wird nach links verschoben
or r22, r28 ;R22 und R28 in Register R25 vereinen
Dec r18 ;-1
Brne loop ;springe zu Schleife wenn R18 > 0
mov r24, r22 ;R22 wird in R24 bereitgestellt
swap r24 ;Nibble tauschen die Daten stehen jetzt gespiegelt an PC0 - PC3!!
mov r22, r24 ; Zu übertragendes Byte wird in R24 bereitgestellt und in R22 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 R21, PinC ; PortC in Register R21 einlesen (wegen PC7, PC6, PC5, PC4) diese sollen ; ja nicht überschrieben werden
andi R21, &B11110000 ; nur die oberen 4 Bit (PC7, PC6, PC5, PC4) berücksichtigen, untere 4 Bit ; (PC3, PC2, PC1, PC0) auf Null setzen
or R24, R21 ; PortC (PC7, PC6, PC5, PC4) mit LCD (PC3, PC2, PC1, PC0) in Register R24 ; vereinen
out PortC, R24 ; PortC aus Register R24 setzen
rcall LCD_Write_Enable ; Übertragungsaktivierung
; L o w Nibble muss noch übertragen werden
andi R22, &B00001111 ; nur die unteren 4 Bit (unteres Nibble) berücksichtigen, obere 4 Bit ; (oberes Nibble) auf Null setzen
or R22, R21 ; PortC (PC7, PC6, PC5, PC4) mit LCD (PC3, PC2, PC1, PC0) in Register R22 ; vereinen
out PortC, R22 ; PortC aus Register R22 setzen
rcall LCD_Write_Enable ; Übertragungsaktivierung
rcall LCD_Delay_50us ; 50us LCD-Verarbeitungspause einplanen
ret

LCD_Write_Enable:
sbi PortD, 6 ; E High Übertragungsaktivierung gestartet
nop ; 3 Taktzyklen warten
nop
nop
cbi PortD, 6 ; 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 R22, 165 ; R22 Register mit Delaywert vorbelegen
LCD_Delay_50us2:
dec R22 ; R22 Registerinhalt um 1 runterzählen
brne LCD_Delay_50us2 ; Springe bei ungleich zurück zu LCD_Delay_50us2
ret ; 1 Takt (Befehlszyklus)
mov r18, r1 ;alte Registerinhalte wieder zurück
mov r21, r3
mov r22, r6
mov r23, r7
mov r24, r8
mov r28, r9
[END]

;----------------------------------------------------------
[_CLS]
;----------------------------------------------------------
_Cls:
mov r1, r18 ;Registerinhalte sichern
mov r3, r21
mov r6, r22
mov r7, r23
mov r8, r24
mov r9, r2
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
mov r18, r1 ;alte Registerinhalte wieder zurück
mov r21, r3
mov r22, r6
mov r23, r7
mov r24, r8
mov r28, r9
[END]

Die Anschlußbelegung steht in der Libary mit drin.

Gruss

Ronny Schmiedel
http://www.ronny-net.de

ronny_s
07.06.2005, 20:39
SCHE...
beim posten iss der Text voll durcheinander geraten.
Die Erläuterung hinter dem ";" kann man ja löschen (auch auf der nächsten Zeile befindliche).
Auf Wunsch kann ich die libary hier auch noch mal ohne Kommentar posten.

Gruss

Ronny

Marten83
08.06.2005, 00:30
Hi ronny_s!

Vielen Dank für den Code!
Leider sehe ich so meine Probleme damit da ich einen 8051 habe und früher schon einige Befehle wie DDRD und so nicht bearbeitet werden.
Ich hab auch zu wenig Erfahrung um in Assembler etwas rumzupfuschen.
Zudem weiss ich auch gar nicht wie man eine Library erstellt (wäre mein kleinstes Problem).

Rudi Ratlos
08.06.2005, 07:54
Nachfolgend meine Initialisierung in Basic für C-Controll.
Vor dem Versuch, das ganze in BASCOM umzumodeln sollte man noch einmal testen, ob nicht in den Bibliotheken bereits die Lösungen stecken.
Ich habe gelesen, dass es bei der Initalisierung den Parameter 20 * 4a gibt, das wäre wohl schon der Ansatz, die Zeilen richtig anzusprechen.
Da ich gerade die C-Control einstampfe und mit BASCOM starte, kenne ich mich hier noch nicht aus.

' KS0073_init.bas --------------------------------


DEFINE DB0 as Port[9]
DEFINE DB1 as PORT[10]
DEFINE DB2 as PORT[11]
DEFINE DB3 as PORT[12]
DEFINE RW as PORT[13]
DEFINE RS as PORT[14]
DEFINE EN as PORT[15]

define bit_RW as bit[1] ' Zwischenspeicher für RW-Status
define bit_RS as bit[2] ' Zwischenspeicher für RS-Status
define bit_Cursor as bit[3] ' gibt an, ob Cursor sichtbar = on
define bit_Blink as bit[4] ' gibt an, ob Cursor blinken soll = on
define bit_5 as bit[5]
define bit_6 as bit[6]
define bit_7 as bit[7]

define Zeile as byte ' globale Variable, die von LCD_POS() ausgewertet wird
define Spalte as byte ' globale Variable, die von LCD_POS() ausgewertet wird
define DATA as byte
define i as byte
define j as byte

' ---------------------------------------------
FUNCTION LCD_POS(Zeile as byte, Spalte as byte)
' Positioniert den Cursor, dannach kann ins LCD geschrieben werden.
' benutzt die Globalen Variablen bit_RW und bit_RS
bit_RW = RW ' den Status der Ports sichern
bit_RS = RS

RW = off ' Auf Befehlsmodus umschalten
RS = off ' Auf Schreibmodus umschalten

' nicht plausible Zeilenangaben abfangen
' IF (Zeile = 0 or Zeile > 4) THEN Zeile = 1
' nicht plausible Spaltenangaben abfangen
' IF (Spalte < 1 or Spalte > 20) THEN Spalte = 1

' Die Position ist nach Datenblatt KS0073:
' Zeile1 = 00h, Zeile 2 = 20h, Zeile 3 = 40h, Zeile 4 = 60h
' Die Variablen Zeile und Spalte werden missbraucht
Zeile = (Zeile -1) * 32 + (Spalte - 1) ' hier steht die LCD-Position

' siehe SET DDRAM Adress im Datenblatt (Seite 36)
' Daten schreiben, zuerst upper nibble, command bit 7 setzen

Spalte = ((Zeile shr 4) or 1000b) ' Bit 4 setzen, Bit 3 - 0 sind Teil der Position
' nibble auf Ports übertragen
BITSET(Spalte)
PULSE EN ' und senden

' lower nibble
' überflüssig, wird in BITSET behandelt: Spalte = (Zeile and 15) ' 1111
BITSET(Zeile)
PULSE EN

RS = bit_RS ' zurück in den ursprünglichen Zustand
RW = bit_RW '

END FUNCTION

' ---------------------------------------------
' setzt die Ports für die LCD-Ausgabe
FUNCTION BITSET(Muster as byte)
DB0 = MUSTER and 1
DB1 = MUSTER and 2
DB2 = Muster and 4
DB3 = Muster and 8
PAUSE 1
end function

' ----------------------------------------------
' schaltet einen blinkenden Cursor ein
FUNCTION DISPLAY_CURSOR()
'
bit_RS = RS ' Status sichern
bit_RW = RW
RS = off
RW = off
BITSET(0) ' upper nibble
PULSE EN

' CMD = 1/
' Display aus = 0, ein = 1
' Cursor aus = 0, ein = 1
' Blink aus = 0, ein = 1

BITSET(ABS (bit_Cursor * 2 + bit_Blink - 12 ))
PULSE EN
RS = bit_RS ' RS restaurieren
RW = bit_RW ' RW restaurieren

end FUNCTION
' -------------------------------------------------

' ---------------------------------------------------
FUNCTION KS0073_INIT()
' Initialisierung des LCDs 4x20 mit Controller KS0073

LCD.INIT ' Standardinitialisierung
LCD.OFF ' sollte eigentlich gar nicht erforderlich sein

' RW = off ' immer off im Befehlsmodus
' RS = off ' immer off im Befehlsmodus

' 3x den 8-Bit-Modus mit Pause dazwischen aufrufen ------------------
BITSET(3) ' 0011
PULSE EN

pause 1
Pulse EN

pause 1
PULSE EN

' CMD: 4-Bit-Modus aufrufen ----------------------
BITSET(2) ' 00000010
PULSE EN

' von nun an sind upper und lower nibble getrennt zu senden
' CMD: Function Set - upper nibble
BITSET(2) ' 0010
PULSE EN

' lower nibble
' 2 Zeilen-Modus, RE-bit
BITSET(12) ' 1100
PULSE EN

' CMD: extended Function Set + RE ---------------------
' upper nibble
BITSET(0)
PULSE EN

' lower nibble
' Cmd, 5-dot-Font, normaler Cursor, 4-line-display
BITSET(9) '1001
PULSE EN

' ----------------------------------------------
' CMD: Function Set - upper nibble
BITSET(2) ' 0010
PULSE EN

' lower nibble
' 2 Zeilen-Modus, RE-bit-aus
BITSET(8) ' 1000
PULSE EN

' CMD: clear display -----------------------------------------
BITSET(0)
PULSE EN

BITSET(1) ' 0001
PULSE EN


' CMD: cursor display shift ------------------------------------------
' upper nibble
BITSET(1) ' 0001
PULSE EN

' lower nibble
' Cursor shift, R/L shift
BITSET(0)
PULSE EN

' CDM: display on/off control ------------------------------------------
' upper nibble
BITSET(0)
PULSE EN

' Cmd, Display ein, Cursor off, Blink off
BITSET(12) ' 1100
PULSE EN

END FUNCTION
' ---------------------------------------------------------------------


KS0073_init()

#start

Pause 100

LCD.INIT switchonly

for i = 1 to 4
for j = 1 to 20
'pause 1
LCD_POS(i, j)
LCD.PRINT "*"
next j
next i
LCD.CLEAR

goto start

' PS. Der Smilie, den ich im Code gesehen habe, der gehört da nicht hin - vielleicht ist er aber auch schon wieder weg - wer weiss ..


Edit: Bitte Code-Tags verwenden, dein Moddy

Marten83
08.06.2005, 11:04
Habe gerade im Internet gelesen dass man eine schon vorhandene Library für das lcd verändern kann, oder dieses bit, welches noch gesetzt werden muss seperat einfügen kann und dann einfach das ganze re-initialisiert.
Ist das richtig??

ronny_s
08.06.2005, 21:28
Das ist wohl richtig, nur die Libaries sind halt nunmal in Assembler geschrieben. Da Du Dich mit Assembler nicht so auskennst, wie willst Du dann in der Initialisierungsroutine das Extension-Bit richtig setzen.
Die Reihenfolge (siehe meine Libary) der Initialisierung muß schon stimmen.
Wünsche Dir aber trotzdem viel Erfolg und Assembler ist gar nicht so schwer, Tutorials gibt es genügend.

Gruss Ronny

Marten83
09.06.2005, 18:16
Hi Ronny!
Auch wenn ich nicht soo viel Ahnung von Assembler habe ist es doch hilfreich zu wissen wo diese Library ist weil ich mir dann erstens den Code für einen 8051 angucken kann und dann auch nicht deinen Code erst mühselig umarbeiten muss. Denn ich habe das ganze so verstanden, dass man im grunde nur ein paar wenige Zeilen schreiben muss um dieses Bit zu setzen, richtig?
Wenn mir bei der Library jemand weiterhelfen könnte wäre mir echt schon geholfen!
Vielen Dank an Alle die mir bisher geholfen haben!
Marten83

Marten83
04.08.2005, 11:28
Hallo!

Auch wenn ich so langsam anfange zu nerven...
Ich habe ja mein LCD nun mit der Library von Ronny angesteuert.
Text funktioniert auch tadellos, aber es werden keine Zahlen angezeigt.
Hier mal mein Programm:

$regfile = "m8def.dat" 'für ATMEL ATmega8
$crystal = 11059200 'Quarz: 11,0592 MHz
$lib "dip_lcd.lib"
Ddrc = &B00001111
Ddrb = &B00110000
Config Lcd = 20 * 4a
Initlcd
Cls 'Pin PB0-PB3 auf Out
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Dim W As Word , Channel As Byte
Dim Spannung As Single
Channel = 5

' "a" für spezielles Display
'Initlcd



Do
W = Getadc(5)
Spannung = W * 0.01953125
thirdline
Lcd Fusing(spannung , "##.##") ; "V"
locate 2 , 1
Lcd "Irgendein Text"
Loop
End


Das LCD sieht nun folgendermassen aus:

{V
Irgendein Text
(frei)
(frei)

Ich versteh erstens die geschwungene Klammer nicht ({) und es wird immer in der ersten Zeile anstatt der 3. angezeigt!

Ich bitte um Hilfe, bin echt verzweifelt!!!

Vielen Dank!
Marten83

michaelb
04.08.2005, 13:09
Hallo,
warum benutzt ihr nicht die Standart LCD Befehle von Bascom? Damit kann man doch soo einfach ein 4*20 Display ansteuern!!
Gruß Michi

Marten83
04.08.2005, 13:55
Ähm... wenn das auch richtig gehen würde wäre das ja kein Problem.
Tut es aber nicht!
Steht hier aber auch alles, oder?

Frank
04.08.2005, 14:07
Hier wurde auch schon eine Lösung gepostet:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=10766

Marten83
06.08.2005, 12:43
HI!
Ich hab das mal ausprobiert wie das in dem Link beschrieben wurde.
Leider will mein Bascom nicht so wie dort (invalid datatype [0]).
Steht für die Zeile: If Zeichen......
Kompilieren geht also nicht!
Weiss jemand woran das liegt?

Marten83

Dani-Bruchflieger
06.08.2005, 13:49
Hi,
bei mir läuft das so hier ohne Probleme:


$regfile = "m8def.dat" 'Mega8
$crystal = 8000000
Declare Sub Lcdinit
Declare Sub Lcdwrite(byval Zeichen As Byte)
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.2 , Rs = Portd.3
Config Lcd = 20 * 4a
Waitms 100 'damit das LCD etwas Zeit bekommt um nach dem Einschalten empfangsbereit zu sein...
Call Lcdinit
Cls

do
.....
loop

Sub Lcdinit
Call Lcdwrite(&B00101100)
Call Lcdwrite(&B00001001)
Call Lcdwrite(&B00101000)
Call Lcdwrite(&B00000110)
Call Lcdwrite(&B00001100)
End Sub


Sub Lcdwrite(byval Zeichen As Byte)
' Höherwertiges Nibble setzen
If Zeichen.4 = 1 Then Portd.4 = 1 Else Portd.4 = 0
If Zeichen.5 = 1 Then Portd.5 = 1 Else Portd.5 = 0
If Zeichen.6 = 1 Then Portd.6 = 1 Else Portd.6 = 0
If Zeichen.7 = 1 Then Portd.7 = 1 Else Portd.7 = 0
' Höherwertiges Nibble übertragen
Portd.2 = 1
Waitms 1
Portd.2 = 0
Waitms 1
' Niederwertiges Nibble setzen
If Zeichen.0 = 1 Then Portd.4 = 1 Else Portd.4 = 0
If Zeichen.1 = 1 Then Portd.5 = 1 Else Portd.5 = 0
If Zeichen.2 = 1 Then Portd.6 = 1 Else Portd.6 = 0
If Zeichen.3 = 1 Then Portd.7 = 1 Else Portd.7 = 0
' Niederwertiges Nibble übertragen
Portd.2 = 1
Waitms 1
Portd.2 = 0
Waitms 1
End Sub

Marten83
07.08.2005, 00:22
Hi!
Ich könnte mir selbst in den A.... treten!!
Hab den Fehler gefunden.
Die Definitionen sollte man schon mit in das ganze Geschehen einbeziehen...!!!
Vielen Dank an Alle die mir geholfen haben!

Marten83

Kaiser-F
14.02.2006, 14:16
Hallo Mitnander!

Ich würde an dieser Stelle mal eben eine Frage in den Raum werfen.

Und zwar tüftle ich auch gerade an einem 4x20 Zeichen DIP LCD mit KS0073 Controller.

Da hätte ich zwei Grundlegende Fragen die mir den Einstieg Sehr erleichtern würden:

1. Verständnisfrage (Newbiefrage)
Im Datenblatt wird neben RS, RW, E und D0...D7 noch ein "Bit" nenn ich es mal genannt. Nämlich RE. Würde mich mal ganz stark interessiren was das zu bedeuten hat.


2. Beim Initialisieren.
nach dem FunctionSet heißt es ja "wait for more than 39µs",
Genügt es da auch zu warten, bis das Busyflag wieder 0 ist, oder funktioniert das hier nochnicht? Kann mir gut vorstellen dass es nicht funktioniert, da ja hier erst mal die Schnittstelle aktiviert wird. Und wenn nein, ab wann Funktioniert das mit dem BUSYBIT....


Bei mir hackts nämlich noch ganz stark... weiß nicht ob er meine Befehle gefressen hat oder nicht.

Kaiser-F
14.02.2006, 16:04
Mit diesem Programm Lese ich aus dem LCD.

Das Display gibt immer nur 0xFF aus.... ist es evtl Defekt?

Ich hab zum Testen mal LED an D0----7 angeschlossen, über 1KOhms...

Auch bei RESET ändert sich nichts an der Anzeige... ich glaub ich habs gegrillt???


void LCD_INPUT(void){
//LCD_DATA als INPUT und Pullup aus
LCD_DATA_DDR = 0x00;
LCD_DATA_PORT = 0x00;
//LCD_CTRL als Output und Pullup aus
LCD_CTRL_DDR &=~ (1<<LCD_RS)|(1<<LCD_RW)|(1<<LCD_E);
LCD_CTRL_PORT &=~ (1<<LCD_RS)|(1<<LCD_RW)|(1<<LCD_E);
}


void LCD_OUTPUT(void){
//LCD_DATA als OUTPUT und Pullup aus
LCD_DATA_DDR = 0xFF;
LCD_DATA_PORT = 0x00;
//LCD_CTRL als Output und Pullup aus
LCD_CTRL_DDR &=~ (1<<LCD_RS)|(1<<LCD_RW)|(1<<LCD_E);
LCD_CTRL_PORT &=~ (1<<LCD_RS)|(1<<LCD_RW)|(1<<LCD_E);
}


uint8_t LCD_READ( uint8_t RS ){

//Datenrichtungseinstellung für READ
LCD_INPUT();

//Registerwahl
if( RS ) { LCD_CTRL_PORT |= (1<<LCD_RS); } //RS = 0 Steuerregister
else { LCD_CTRL_PORT &= ~(1<<LCD_RS); } //RS = 1 Datenregister

//RW HIGH setzen
LCD_CTRL_PORT |= (1<<LCD_RW);

//Enable HIGH setzen
LCD_CTRL_PORT |= (1<<LCD_E);

//Bisschen Warten bis Daten anliegen
uint8_t t = 0; while( t < 200 ){ t++; }

//DATEN LESEN
uint8_t data = LCD_DATA_PIN;

//Enable LOW setzen
LCD_CTRL_PORT &=~ (1<<LCD_E);

//RW LOW setzen
LCD_CTRL_PORT &=~ (1<<LCD_RW);

return data;
}

Kaiser-F
14.02.2006, 16:09
Ach ich Hirsch!

RS, RW, E waren EINGÄNGE.....

IN DEN AR*CH BEISS...

Wie Peinlich, aber meine Fragen stehen noch offen...

EDIT: Jetzt funktioniert es!