Forum: Mikrocontroller und Digitale Elektronik Initialisierung HD44780 in Basic


von Lötknecht (Gast)


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!

: Verschoben durch User
von Michael U. (amiga)


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

von Marc V. (Firma: Vescomp) (logarithmus)


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.

: Bearbeitet durch User
von Holger K. (pin0815)


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!

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
Noch kein Account? Hier anmelden.