Initialisierung HD44780 in Basic

Gast #4635525
Lesenswert?
• ▲
▼
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!
#4635872
Lesenswert?
• ▲
▼
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
(Firma: Vescomp) #4635904
Lesenswert?
• ▲
▼
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.
#4638140
Lesenswert?
• ▲
▼
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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren