Guten tag alle miteinander
Und zwar habe ich das oben beschriebene LCD Display welches aber nix
anzeigt ausser
In der ersten Zeile schwarze kästchen.. angeschlossen habe ich dieses
wie folgt
Portd 0-3 an Db 4-7 portd 4 an Rs portd 5 an E
Das Programm ist das selbe wie im Assembler Beispiel und ich benutze den
Internen 4 MHz
Funktioniert dieses Display überhaupt im 4bit Modus
Mfg Bqube
So ich hab nun das Program auf 8Bit umgestellt .... wurde auch im AVR
Simulator von oshonsoft ohne Probleme ausgegeben ... aber könnt ihr da
bitte mal drüber schauen ob das so auch auf der Hardware laufen würde ?
danke schonmal
Mfg Bqube
1
.include "m8def.inc"
2
3
;PORTB5 = E
4
;PORTB4 = RS
5
;PORTB3 = RW
6
;PORTD 0-7 Datenleitungen
7
8
9
10
11
ldi R16, LOW(RAMEND) ; LOW-Byte der obersten RAM-Adresse
12
out SPL, R16
13
ldi R16, HIGH(RAMEND) ; HIGH-Byte der obersten RAM-Adresse
14
out SPH, R16
15
16
ldi R21, 0xFF ; Port D = Ausgang
17
out DDRD, R21
18
19
ldi R21, 0xFF ; Port B = Ausgang
20
out DDRB, R21
21
22
23
rcall lcd_init ; Display initialisieren
24
rcall LCDCLS ; Display löschen
25
26
ldi R20, 'T' ; Zeichen anzeigen
27
rcall LCDDATA
28
29
30
ldi R20, 'e' ; Zeichen anzeigen
31
rcall LCDDATA
32
33
ldi R20, 's' ; Zeichen anzeigen
34
rcall LCDDATA
35
36
ldi R20, 't' ; Zeichen anzeigen
37
rcall LCDDATA
38
39
loop:
40
rjmp loop
41
42
43
44
45
lcd_init: ;8Bit MODUS
46
rcall WARTENG
47
LDI R20,0b00110000
48
OUT PORTD,R20
49
rcall LCDOP
50
rcall WARTENK
51
rcall LCDOP
52
rcall WARTENK
53
rcall LCDOP
54
rcall WARTENK
55
rcall LCDOP
56
rcall WARTENK
57
LDI R20,0b00111000 ;2 ZEILEN
58
OUT PORTD,R20
59
rcall LCDOP
60
rcall WARTENK
61
LDI R20,0b00001000 ;LCD AUS
62
OUT PORTD,R20
63
rcall LCDOP
64
rcall WARTENK
65
LDI R20,0b00000001 ;LCD LÖSCHEN
66
OUT PORTD,R20
67
rcall LCDOP
68
rcall WARTENK
69
LDI R20,0b00000110 ;Kursor nach rechts wandernd, kein Display shift
Den 8-Bit Modus benutze ich nicht, weil der mir zu viele Portpins
wegfuttert. Aber bei deinem 4-bit Programm ist vermutlich der Fehler,
das du den ganzen Port beschreibst und damit auch die Kontrollleitungen
unabsichtlich verwurschtelst:
Pierre Gnauck schrieb:> ldi temp1, 0b00000011 ; muss 3mal hintereinander gesendet> out PORTD, temp1 ; werden zur Initialisierung
Warum eigentlich das Rad immer neu erfinden? Da gibt es tonnenweise
Beispiele - selbst in Assembler. Ich würde dir auch empfehlen, Portpins
und Ports in Definitionen zu packen, damit du die Routinen auch mal in
einer anderen Hardware Konfiguration benutzen kannst. z.B.:
1
.equLCD_RS_PORTPORTD
2
.equLCD_RS_PIN4
3
;unddannkannstduschreiben
4
sbiLCD_RS_PORT,LCD_RS_PIN;RSPinhigh
Gehe also schrittweise vor: Fang an mit einer Routine, die ein Nibble
(Halbbyte) aufs LCD schreibt. Brauchst du zur Initialisierung eh. Mach
eine Routine die unter Benutzung der ersten ein Kommando Byte schreibt.
Mach eine Routine, die ein Datenbyte schreibt, usw.
Danke für die hilfe ich überarbeite dann mal meinen 4bit code....
Warum ich das Rad neu erfinde einfach nur damit ich genau versteh wie
alles funtioniert das init , die daten auf das Display zu bekommen...
ich will nicht nur kopieren und einfügen sonder verstehn.. :)
Mfg Bqube
So da bin ich wieder also im 8Bit modus hat alles funktioniert aber mit
dem 4bit Modus komm ich nicht zu recht .....
Ich schicke drei mal diesen wert 0000-0011
dann schicke ich für den 4Bit Modus 0000-0011
So ab jetzt müsste ich alles im 4Bit modus senden seh ich das richtig so
???
Also muss ich wenn ich z.b 2 Zeilen 5*8 Punkte einstellen will also
0010-1000 Muss ich das Obere Nibble zu erst senden .... da ich vom PORTD
die Ports 3 2 1 0 verwende müsste ich meinen 8Bit wert vertauschen mit
swap
dann wird doch aus 0010-1000 = 1000-0010 und dann schicke ich
die ersten 4Bit 1000 und dann die letzten 0010 oder seh ich das falsch
??
Mfg Bqube
Ja, erst wird das obere Nibble auf die 4 Datenleitungen gelegt (aber
ohne die anderen Portpins zu ändern!), E auf high und wieder auf low,
dann das untere Nibble ( und wieder E high->low). Während der ganzen
Operation müssen RS und RW low sein und da auch bleiben, da es Kommandos
sind.
Zum Daten schreiben dann wie oben, aber mit RS high.
Das sieht nicht nur nicht schön aus, sondern sogar so, das ich keine
Lust habe, mich da durchzuwühlen.
Pierre Gnauck schrieb:> rcall pause20> LDI r17,0b00000011> out Portd,r17> rcall adress_routine> rcall pause5> rcall adress_routine> rcall pause5> rcall adress_routine> rcall pause5
Klar ist aber schon mal, das du nach dem ersten Setzen lange warten
musst, min. 4,1 mS . Lies mal bitte das Datenblatt des KS0066 oder
HD44780. Bild 24 im Original Hitachi Datenblatt. Und bitte, lies auch
mal, wie es die andeen machen. Ausserdem zermanschst du immer noch die
obere Hälfte von PortD mit deinen outs.
Gut werd ich mir mal anschauen ich hab auch schon gedacht es könnte am
timing liegen aber in den anderen Beiträgen liest man immer nur von er
muss minimal so und so lang warten dann kann es doch nicht schlimm sein
wenn der LCD uc was länger wartet oder etwa doch ?..
Mfg Bqube
Denke dran, der Simulator läuft im Moment mit 4MHz. Wenn dein realer
Mega auch auf 4MHz gefused ist, kein Problem, bei 8 MHz sind alle
Warteschleifen natürlich nur halb so lang. Übrigens ist nur der
originale HD44780 so eine richtige Schnarchnase, die neueren Klone, wie
z.B. der KS0066 sind da schon schneller.
Hier als kleines Präsent noch eine sehr universelle Warteroutine, im
Orignal von Steve Wozniak aus dem Apple II ROM. Ein kleines Meisterwerk
und ermöglicht einen weiten Bereich von Delays:
Also müssen meine Wartezeiten bei den neueren nich al zu lang sein wie
bei dem HD44780 .... mein Problem war das ich zwischen den Nibble eine
pause von 5ms drinn hatte
adress_4bit_routine:
swap r17
out portd,r17
rcall adress_routine
rcall pause5 <------------- Die hier
swap r17
out portd,r17
rcall adress_routine
rcall pause5
ret
und aus diesem grun hat das ganze nich funtioniert weil der HD44780 nach
dem ersten Nibble zu lange warten musste ... deswegen hat er diesen nich
angenommen .....
Ich schreib grad an einer routine die mit hilfe von sbi und cbi die
Port's setz und löscht so das ich die anderen 4Bit von dem Port nicht
mit belege.
Mfg Bqube