Ich habe einen Code für den PIC24 in ASM geschrieben um ein HD44780
kompatibles LCD im 4 bit Modus anzusteuern. Ich habe erst einen Code für
den PIC24FV32KA302 geschrieben, da dieser mit 5V läuft.
Dann habe ich mich entschieden, dem LCD eine negative Kontrastspannung
zu geben und es mit 3.3V zu betreiben. Ich habe dazu die Warteschleifen
geändert, da der Oszillator auf dem LCD mit 3.3V langsamer läuft.
In diesem Post will ich meinen Code kurz erklären und danach auf dem
Betreib des LCDs mit 3.3V eingehen.
1.
Zum Code. Ich habe eine eigene ASM Datei für die LCD Routinen erstellt,
diese wird in die main kopiert oder mit .include "HD44780_3.3V.s" bzw.
.include "HD44780_5V.s" eingebunden.
Am Anfang wird mit einem .equ. die CPU Frequenz definiert. Aus dieser
berechnet der linker dann die Werte für die delay-Schleifen. Theoretisch
sollte das bis 140MHz funktionieren. Danach wird für jedes der Daten-
und Steuerbits der Pin definier. Zum Beispiel so:
1 | .equ F_CPU, 32000000
|
2 |
|
3 | .equ LCD_D7_LAT, LATB
|
4 | .equ LCD_D7_BIT, 7
|
5 | .equ LCD_D6_LAT, LATB
|
6 | .equ LCD_D6_BIT, 6
|
7 | .equ LCD_D5_LAT, LATB
|
8 | .equ LCD_D5_BIT, 5
|
9 | .equ LCD_D4_LAT, LATB
|
10 | .equ LCD_D4_BIT, 4
|
11 | .equ LCD_En_LAT, LATB
|
12 | .equ LCD_En_BIT, 3
|
13 | .equ LCD_RS_LAT, LATB
|
14 | .equ LCD_RS_BIT, 2
|
Dann wir die Init aufgerufen. Man muss die Pins nicht vorher als Ausgang
definieren. Das wird in der Init automatisch gemacht.
Danach können die Funktionen LCD_Cmd, LCD_Char und LCD_Str mit call
aufgerufen werden:
-LCD_Cmd sendet den Inhalt des Arbeitsregister W0 als Befehl (RS=0) ans
LCD
-LCD_Char sendet den Inhalt des Arbeitsregister W0 als Daten (RS=1) ans
LCD
-LCD_Str sendet eine String ans LCD. Die Staradresse der String muss im
Arbeitsregister W0 stehen. Die String muss nullterminiert sein.
Im Anhang: Ein kleiner Code der zeigt wie man eine String mit dem
PIC24F16KA102 in der zweiten Zeile des LCDs ausgibt und die LCD-Routinen
mit Delay für 3.3V und 5V
2.
Zum Betreib der HD44780 LCDs mit 3.3V gibt es hier etwas zu lesen:
http://www.sprut.de/electronic/lcd/#strom
Ich kenne zwei relativ einfache Schaltungen um die negative
Kontrastspannung zu erzeugen:
Die Erste ist, wie auf der oben verlinkten Seite beschrieben, ein
Ladungspumpen IC wie z.B. der ILC7660.
Die zweite Möglichkeit ist eine diskret aufgebaute Ladungspumpe, die
ihren Takt von einem PWM Pin des µC bekommt (Schaltung im Anhang). Die
Ausgansspannung dieser Ladungspumpe wir über die Frequenz gesteuert. Ich
habe die Schaltung mit dem eingetragenen Werten so mit einem
PIC18LF25k22 getestet. Die nötige Frequenz wurde im Simulator
experimentell bestimmt, man könnte sie sicher auch berechnen. Die zweite
Lösung hat dem Vorteil, dass sie kleiner ist und man kann, wenn man
einen Temperatursensor an dem PIC hängt die Kontrastspannung für die
momentane Temperatur anpassen.