Hallo zusammen,
ich versuche nun schon seit Stunden das HD44780 mittels Basic (Picaxe)
zu initialisieren. Dazu gehört dieser Code:
' LCD HD44780
' 01. Juli 2016
#picaxe 20x2
' output B.0 Display D0
' output B.1 Display D1
' output B.2 Display D2
' output B.3 Display D3
' output B.4 Display D4
' output B.5 Display D5
' output B.6 Display D6
' output B.7 Display D7
' output C.0 Display Enable
' output C.7 Display RS
' WS liegt hardwaremaessig auf LOW
symbol E = C.0
symbol RS = C.7
symbol D0 = B.0
symbol D1 = B.1
symbol D2 = B.2
symbol D3 = B.3
symbol D4 = B.4
symbol D5 = B.5
symbol D6 = B.6
symbol D7 = B.7
let dirsB = %00111111 ' Port B als output
let dirsC = %10000001 ' Port B C.7 und C.0 als output
main:
pause 25 ' 0,025 sec warten
let pinsB = %00011000 ' Init Display
let pinsC = %00000001 ' RS=0, E=0
'Befehl 3x uebernehmen
for b0 = 1 to 3 ' 3x wiederholen
pause 20 ' 20 ms warten
low E ' Enable auf L
pause 20 ' 20 ms warten
high E ' Enable auf H
next b0
let pinsB = %00111000 ' Display 2-zeilig, 5x8-Matrix
prog:
' Befehl uebernehmen
pause 20 ' 20 ms warten
low E ' Enable auf L
pause 20 ' 20 ms warten
high E ' Enable auf H
return
let pinsB = %00001000 ' Display aus
gosub prog ' UP Daten- und Befehlsuebergabe
let pinsB = %00000001 ' Display loeschen
gosub prog ' UP Daten- und Befehlsuebergabe
let pinsB = %00000110 ' Cursor nach rechts wandernd,
' kein Display-Shift
gosub prog ' UP Daten- und Befehlsuebergabe
let pinsB = %00001100 ' Display ein
gosub prog ' UP Daten- und Befehlsuebergabe
wait 60
stop
Das Display bleibt dabei: erste Zeile 16 Rechtecke 5x9, zweite Zeile
nichts.
Was, zum Teufel mache ich falsch!?
Danke für eure Hilfe!
Hallo, warum setzt Du hier nur 6 Bit als Ausgang?
1 | let dirsB = %00111111 ' Port B als output |
Das timing der Reset-Routine ist auch etwas anders...
1 | 'Befehl 3x uebernehmen |
2 | for b0 = 1 to 3 ' 3x wiederholen |
3 | pause 20 ' 20 ms warten |
4 | low E ' Enable auf L |
5 | pause 20 ' 20 ms warten |
6 | high E ' Enable auf H |
7 | next b0 |
Außerdem ist Enable H-aktiv, der Ruhezustand ist also Low und der Puls also L -> H-> L. 20ms warten stören hier zwar nicht direkt, aber soll das Display sich langweilen? Schon ein Init dürfte so Sekunden dauern, wielange willst Du bei Ausgaben dann warten? ;-) Gruß aus Berlin Michael
Lötknecht schrieb: > Was, zum Teufel mache ich falsch!? Vieles.
1 | let dirsB = %00111111 ' Port B.0-B5 als output |
2 | Sollte sein: |
3 | let dirsB = %11111111 ' Port B.0-B7 als output |
4 | |
5 | let pinsB = %00011000 ' Init Display (Wert falsch) |
6 | let pinsC = %00000001 ' RS=0, E=1 |
7 | Sollte sein: |
8 | let pinsB = %00110000 ' Init Display (mit 0x30) !!! |
9 | let pinsC = %00000000 ' RS=0, E=0 |
10 | |
11 | prog: |
12 | ' Befehl uebernehmen |
13 | ...
|
14 | Sollte sein: |
15 | data: |
16 | ' DATA uebernehmen |
17 | let pinsC = %10000000 ' RS=1, E=0 |
18 | goto SetEN |
19 | prog: |
20 | ' Befehl uebernehmen |
21 | let pinsC = %00000000 ' RS=0, E=0 |
22 | SetEN: |
23 | pause 1 ' 1 ms warten (zur Sicherheit) |
24 | high E ' Enable auf H |
25 | pause 1 ' 1 ms warten |
26 | low E ' Enable auf L |
27 | return
|
Probiere das erstmal.
Moin,
ich habe das mal nachvollzogen. Der Code sieht so aus:
' LCD HD44780
#picaxe 20x2
' output B.0 Display D0
' output B.1 Display D1
' output B.2 Display D2
' output B.3 Display D3
' output B.4 Display D4
' output B.5 Display D5
' output B.6 Display D6
' output B.7 Display D7
' output C.0 Display Enable
' output C.7 Display RS
' WS liegt hardwaremaessig auf LOW
symbol E = C.0
symbol RS = C.7
symbol D0 = B.0
symbol D1 = B.1
symbol D2 = B.2
symbol D3 = B.3
symbol D4 = B.4
symbol D5 = B.5
symbol D6 = B.6
symbol D7 = B.7
let dirsB = $FF ' Port B als output
let dirsC = $81 ' Port B C.7 und C.0 als output
main:
pause 1 ' 0,025 sec warten
let pinsB = $30 ' Init Display
let pinsC = $00 ' RS=0, E=0
'Befehl 3x uebernehmen
for b0 = 1 to 3 ' 3x wiederholen
pause 1 ' 1 ms warten
high E ' Enable auf H
pause 1 ' 1 ms warten
low E ' Enable auf L
next b0
let pinsB = %00111000 ' Display 2-zeilig, 5x8-Matrix
gosub prog
let pinsB = %00001000 ' Display aus
gosub prog ' UP Daten- und Befehlsuebergabe
let pinsB = %00000001 ' Display loeschen
gosub prog ' UP Daten- und Befehlsuebergabe
let pinsB = %00000110 ' Cursor nach rechts wandernd, kein
' Display-Shift
gosub prog ' UP Daten- und Befehlsuebergabe
let pinsB = %00001100 ' Display ein
gosub prog ' UP Daten- und Befehlsuebergabe
prog: ' Befehl uebernehmen
pause 1 ' 1 ms warten
high E ' Enable auf H
pause 1 ' 1 ms warten
low E ' Enable auf L
return
wait 60
stop
Geht nicht!
Ich kenne das aus C++ (INI) anders:
1. 8 bit-Interface (D1=1)
2. 2-zeiliges Display (D3==1)
3. 5x8 (D2=0)
4. Displayshift aus (D0=0)
5 Kursor nach jedem Zeichen nach rechts (D1=1)
Und am Anfang:
1. Auf das interne RESET mind. 15ms warten
2. Auf 8 bit setzen mind. 4.1ms warten
3. Auf 8 bit setzen mind. 100us warten
VG!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.