Hallo an alle,
Ich will zu Testzwecken einen ganz einfachen 2 Zeilen LCD Display
benutzen. Ich weiß dass das Thema hier schon durch und durchgekaut
worden ist, jedoch habe ich eine Frage für die ich noch mir keine gute
Erklärung gefunden habe.
Seite 16
Und zwar orientiere ich mich an folgende Anleitung:
http://www.stefan-buchgeher.info/elektronik/lcd/lcd_doku.pdf
Es wird kein Interface(I2C, SPI, Uart..) benutzt. Das Display kommt mit
seinen 4 Datenleitungen und die restlichen Pins (RS, Write etc) an den
Mikrocontroller.
Wie funktioniert die Übertragung, ohne solche Peripherie? Seite 16 unten
wird der ganze Bus irgendwie an den Port B gebunden, soganz verstehe ich
das aber nicht. WIE könnte man die Datenleitungen für den PIC noch
definieren? (ohne den ganzen Port dafür zu benutzen)
Da die LCD's alle gleich sind bzw mit dem HD44780 ausgestattet sind,
habe ich an folgendes gedacht:
https://www.amazon.de/AZDelivery-HD44780-Display-Schnittstelle-Anzeigen/dp/B01N3B8JMN
Das I2C Interface ist in meinem Fall ja Optional.
Danke im Vorraus,
Gruß!
Seier M. schrieb:> Wie funktioniert die Übertragung, ohne solche Peripherie?
Wenn du keine HW hast, die dir diese Arbeit abnimmt, musst du diese
Funktionalität halt selbst programmieren.
Seier M. schrieb:> WIE könnte man die Datenleitungen für den PIC noch> definieren? (ohne den ganzen Port dafür zu benutzen)
Du hast doch die volle Kontrolle über jeden einzelnen IO-Pin!
Entweder du machst es dir einfach und legst Daten und Steuerleitungen
auf einen Port. Um die ungenutzten Pins für andre Aufgaben frei zu
halten, werden diese ausmaskiert, so das diese nach nem beschreiben
des Port unverändert bleiben.
https://www.mikrocontroller.net/articles/Bitmanipulation
So ist es auch möglich, mit etwas mehr Aufwand, jeden beliebigen Pin auf
unterschiedlichen Ports zu verwenden.
Seier M. schrieb:> Seite 16 Und zwar orientiere ich mich an folgende Anleitung:...
Du verwendest auch den gleichen Compiler?
Welchen PIC hast du?
Seier M. schrieb:> Wie funktioniert die Übertragung, ohne solche Peripherie?
Was meinst du hier mit Peripherie? Ganz allgemein brauchst du nur die
entsprechende Anzahl von Pins zum Ansteuern des LCD. Die können alle am
selben Port sein, müssen aber nicht...
Hallo,
Wenn ich das richtig verstehe:
In der Anleitung wurde folgendes gemacht:
1
#pragma char LCD_DATA @PORTB
Da wurde also der gesamte PORTB dem LCD_DATA zugewiesen. Das sieht für
mich aus als wäre es das selbe wie bei einem #define.. Dass hier überall
wo Daten in LCD_DATA geschrieben werden, das gleiche ist wie wenn da
PORTB stehen würde?
Obwohl das #define ja nur etwas ersetzen geht, das #pragma hat da ja
schon ne wichtigere Rolle.
Verwende den XC16 Compiler mit einem PIC24.
Damit meinte ich dass ich kein I2C, SPI oder sontiges mehr zur Verfügung
habe.:/
lG
Seier M. schrieb:> Wie funktioniert die Übertragung, ohne solche Peripherie?
Direkt mit Bit setzen/löschen. Damit spart man den Umweg über einen
extra IC.
Oftmals kann man aber nicht alle Pins auf den selben Port legen, dann
kann man es so lösen:
https://www.avrfreaks.net/forum/tutc-lcd-tutorial-1001
Die Syntax für Bitdefinitionen kann beim PIC-Compiler abweichen.
Seier M. schrieb:> Damit meinte ich dass ich kein I2C, SPI oder sontiges mehr zur Verfügung> habe.:/
I2C, SPI lassen sich ebenfalls mit beliebigen IO-Pins durch Bit
setzen/löschen implementieren.
Seier M. schrieb:> In der Anleitung wurde folgendes gemacht: #pragma char LCD_DATA @PORTB
Das scheint mir etwas eher Compiler spezifisches zu sein.
Ich kenne das eher so (etwas speziell, weil auch für Daten beliebige
Pins möglich)
Seier M. schrieb:> Und zwar orientiere ich mich an folgende Anleitung:> http://www.stefan-buchgeher.info/elektronik/lcd/lcd_doku.pdf>> Es wird kein Interface(I2C, SPI, Uart..) benutzt. Das Display kommt mit> seinen 4 Datenleitungen und die restlichen Pins (RS, Write etc) an den> Mikrocontroller.>> Wie funktioniert die Übertragung, ohne solche Peripherie?
Ja an was für eine Peripherie hast du denn so gedacht? Für sowas gibt es
keine! Guck dir das Diagramm auf Seite 7 an, da findest du alles, was du
an Informationen brauchst.
Also setze RS high oder low, je nachdem ob du Displaydaten oder
Steuerkommandos schreiben willst, dann:
Setze R/W auf low zum Schreiben, dann:
Setze deine 4 Datenbit so, wie du sie haben willst, dann:
Mache nen High-Impuls an E(nable), dann:
bei 4 Bit Betrieb nochmal das Ganze mit den anderen 4 Bit, dann:
Warte bei manchen Steuerkommandos ne Weile, weil deren Verarbeitung im
Display halt dauert.
Das war's eigentlich. Ich geb dir mal ein Beispiel (Auszug, zum
Angucken. Nicht zum gedankenlosen copy&paste):
1
INCLUDEP16F716.PIC
2
3
;Hardware:
4
;Pollin-LCD2x8ZeichenAlpha,4Datenbit
5
;derPICläuftmit18.432MHz
6
7
8
;Portbelegung
9
;PortB
10
CE_LCD:BITPortB,0;out
11
RefCt:BITPortB,1;in
12
RW_LCD:BITPortB,2;out
13
RS_LCD:BITPortB,3;out
14
D4:BITPortB,4
15
D5:BITPortB,5
16
D6:BITPortB,6
17
D7:BITPortB,7
18
19
20
21
;PortDaufInputstellenOHNEWanzurühren
22
Dir_IN:BSFRP0
23
BSFTrisB,4
24
BSFTrisB,5
25
BSFTrisB,6
26
BSFTrisB,7
27
BCFRP0
28
RETURN
29
30
;PortDaufOutputstellenOHNEWanzurühren
31
Dir_OUT:BSFRP0
32
BCFTrisB,4
33
BCFTrisB,5
34
BCFTrisB,6
35
BCFTrisB,7
36
BCFRP0
37
RETURN
38
39
;Ausgabepufferlöschen
40
ClearString:
41
MOVLW16
42
MOVWFHudl
43
MOVLWRString+1
44
MOVWFFSR
45
MOVLW' '
46
_clz:MOVWFIndirect
47
INCFFSR,F
48
DECFSZHudl,F
49
GOTO_clz
50
CLRFRString
51
RETURN
52
53
54
55
;AusgabeaufLCDmitWartenaufReadyvomLCD
56
SayIt:BSFtoRS_LCD
57
SKIPtoString
58
GOTOOutLCD
59
MOVWFRChar
60
MOVFRString,W
61
ANDLW15
62
ADDLWRString+1
63
MOVWFFSR
64
MOVFRChar,W
65
MOVWFIndirect
66
INCFRString,F
67
RETURN
68
69
70
;toRS-LCDmußfürZeichenausgabegesetztsein
71
OutLCD:MOVWFRChar
72
INCFLxPos,F
73
CALLDir_IN
74
_ow:BSFRW_LCD
75
BCFRS_LCD
76
BSFCE_LCD
77
NOP
78
NOP
79
MOVFPortB,W
80
BCFCE_LCD
81
ANDLW10000000b
82
SKIPZ
83
GOTO_ow
84
CALLDir_OUT
85
GOTO_out
86
87
;direkteAusgabeaufLCDohneWarten.
88
Out_imm:MOVWFRChar
89
90
_out:CALLDir_OUT
91
;RSeinstellen
92
SKIPtoRS_LCD
93
BCFRS_LCD
94
SKIPNOTtoRS_LCD
95
BSFRS_LCD
96
MOVFPortB,W
97
ANDLWB'00001111'
98
MOVWFRPort
99
100
;zuersthi
101
MOVFRChar,W
102
ANDLWB'11110000'
103
IORWFRPort,W
104
MOVWFPortB
105
BCFRW_LCD
106
BSFCE_LCD
107
NOP
108
NOP
109
BCFCE_LCD
110
111
;dannlo
112
SWAPFRChar,W
113
ANDLWB'11110000'
114
IORWFRPort,W
115
MOVWFPortB
116
BCFRW_LCD
117
BSFCE_LCD
118
NOP
119
NOP
120
BCFCE_LCD
121
SKIPtoRS_LCD
122
RETURN
123
MOVLW5
124
CALLWait
125
RETURN
126
127
;SchreibpositionimLCDsetzen.
128
129
GoLast:MOVLW71
130
GOTOSetPosi
131
132
GoZeile2:
133
MOVLW64
134
GOTOSetPosi
135
GoZeile1:
136
CLRW
137
138
SetPosi:MOVWFLxPos
139
IORLWB'10000000'
140
BCFtoRS_LCD
141
CALLOutLCD
142
BSFtoRS_LCD
143
MOVLW15
144
ANDWFLxPos,F
145
RETURN
146
147
148
ClrEol:MOVFLxPos,W
149
ANDLW16
150
SKIPZ
151
RETURN
152
MOVLW' '
153
CALLSayIt
154
GOTOClrEol
155
156
157
;LCDinitialisieren
158
InitLCD:
159
BCFCE_LCD;CElo
160
BCFRS_LCD;RSlo
161
BCFRW_LCD;R/Waufwrite
162
BCFtoRS_LCD;auchindenFlags
163
MOVLW30;30ms
164
CALLWait
165
BCFtoRS_LCD
166
MOVLWB'00101000';4BitModus
167
CALLOut_imm
168
MOVLW10;10ms
169
CALLWait
170
MOVLW00010100b;CursorMove+rechts
171
CALLOut_imm
172
CALLWait_1
173
MOVLW00001100b;On+noCursor+noBlink
174
CALLOut_imm
175
CALLWait_1
176
MOVLW00000110b;Increment+noShift
177
CALLOut_imm
178
CALLWait_1
179
MOVLW00000001b;Clear
180
CALLOut_imm
181
CALLWait_1
182
MOVLW00000011b;Clear
183
CALLOut_imm
184
CALLWait_1
185
BSFtoRS_LCD;1=Zeichenausgabe
186
MOVLW30;30ms
187
CALLWait
188
CALLLadeLcdCharset
189
RETURN
So, das war's, ist ja auch recht länglich geworden (ausnahmsweise...)
Die restlichen Daten und Unterprogramme (Wait und so) kannst du dir ja
denken.
W.S.
W.S. schrieb:> Mache nen High-Impuls an E(nable), dann:
Hi,
ein High/Low-Übergang kommt natürlich noch danach. (Impulsdauer meistens
1000 ns.)
LCD Enable triggert auf die fallende Flanke.
Seier M. schrieb:> Wie funktioniert die Übertragung, ohne solche Peripherie?Beitrag "Re: RE Bit Display EA DIP204-4 (KS0073)"
so sieht das Display die Signale.
Im Zeitlupentempo. Und der MC-Port wird entsprechend programmiert.
(OK. Da sind noch Fehler im Video. 0x0C z.B. Aber sollte nur das Prinzip
veranschaulichen.)
ciao
gustav
P.S.:
Die Portbitzuordnung kann auch anders gewählt werden.
(Software-Anpassung)
Hier:
LSB-MSB
RS-R/W-Enable-n.c. D4-D5-D6-D7
W.S. schrieb:> So, das war's, ist ja auch recht länglich geworden
Wer sich heutzutage sich noch mit Assembler abquält, der wird eben mit
langem und unportablen Code bestraft.
Hallo,
habe noch eine fertige LCD44780 Routine, geschrieben für einen
DSPIC30F4012,kann auch für PIC24 direkt eingesetzt werden(gleiche
Architektur).
Gruss PICFAN
Hallo,
Vielen vielen Dank an alle! Ich merke, das Thema ist immer noch sehr
aktuell!
Dann ist die Ansteuerung ja doch nicht schwierig. Mich hatte eben wie
gesagt nur die eine Compiler spezifische Anlegung des Buses gewundert.
Hier ist auch noch eine gute Code Sammlung aus diesem Forum:
Beitrag "[ASM & C] HD44780 an PIC24 (3.3V oder 5V)"
Somit ist dieses Thema abgeschlossen, hier wird der eine oder andere
wohl auf gute Sammlungen zurückgreifen können!
Nochmals Liebend Dank!
-Seier M.