Forum: Mikrocontroller und Digitale Elektronik PIC16F887 - LCD Toshiba 20x4 Zeichen - Assembler


von Pascal K. (zerb)


Angehängte Dateien:

Lesenswert?

Hallo liebe Forumgemeinde ich habe folgendes Problem.

Ich möchte mein LCD anhand einer einfachen LCD Initialisierung testen, 
nur leider reagiert dieses nicht und da für mich der Bereich LCD Neuland 
ist wäre ich für etwas Hilfe sehr dankbar!


Zur Hardware:
Es handelt sich um ein Großdisplay von Toshiba mit dem KS0066U 
Controller und wird mit negativer Kontrastspannung über eine 
Ladungspumpe gespeist. Somit wird mir die 1. und 3. Zeile mit Kästchen 
angezeigt und die Kontrasteinstellung funktioniert.

Die Datenpins sind an PORTB des PICs angeschlossen, PORTE dient als 
Anschluss für E, R/W und RS.
Als Taktquelle verwende ich einen externen 16MHz Quarz.

Programmiert wird dies alles über die ICSP Schnittstelle, MPLAB und dem 
PICKit 2.


Zur Software:
Ich selbst sehe leider keinen Fehler oder wo sich der PIC verrennen 
könnte. Evtl. seht ihr ja mehr da ich solangsam nichtmehr weiter weiß.

Im Anhang ist mein Code als .asm Datei.

Schonmal vielen Dank an euch!

Gruss Pascal

von stephan_ (Gast)


Lesenswert?

Es fehlt z.B. die Definition von Port B und Port E als Output (wird mit 
dem TRISB- und TRISE-Register gemacht):
1
    CRLF TRISB
2
    CRLS TRISE

Der R/W-Pin muss für Control-Bytes auch noch gesetzt werden:
1
    bcf controlport, lcd_rs     ; Steuerbyte: RS = 0
2
    bcf  controlport, lcd_rw     ; schreiben:  RW = 0

noch etwas: manche Displays brauchen eine längere Zeit zur 
Initialisierung, stelle mal den delay in CONTROL8BIT auf 50ms (ich habe 
so ein Display, das braucht tatsächlich >44 ms)

Meine Initialisierung für den 16F886 sieht so aus (die Subs heissen 
etwas anders, der Name sagt aber wohl alles):
1
  movlw  b'00110000'      ; 8-bit-interface
2
  call  out8_control
3
4
  movlw  b'00110000'      ; 8-bit-interface
5
  call  out8_control
6
7
  movlw  b'00110000'      ; 8-bit-interface
8
  call   out8_control
9
10
  movlw  b'00100000'      ; 4-bit-interface
11
  call   out8_control
12
13
  movlw  b'00101000'      ; 4-bit / 2-zeilig / 5x8
14
  call  out4_control
15
16
  movlw  b'00000110'      ; cursor increase, display shifted
17
  call  out4_control
18
19
  movlw  b'00001100'      ; display on
20
  call  out4_control
21
22
;  movlw  b'00001000'      ; display off
23
;  call  out4_control
24
25
  movlw  b'00000001'      ; löschen, cursor home 
26
  call  out4_control

Da ist die Reihenfolge anders!!!

Gruss S.

von Pascal K. (zerb)


Angehängte Dateien:

Lesenswert?

Hallo,

CRLF TRISB
CRLS TRISE

die beiden Befehle kenne ich überhaupt nicht! Ich kenne sie nur in 
dieser Ausführung:

clrf TRISB
clrf TRISE

Habe nun mal einiges aus dem Code rausgeschmissen um es erstmal so zu 
probieren, siehe Anhang

Danke, Gruss Pascal

von stephan_ (Gast)


Lesenswert?

Du hast recht -> Tippfehler :(

entweder:

    clrf TRISB

oder

    movlw b'00000000'
    movwf TRISB

Gruss S.

von Pascal K. (zerb)


Angehängte Dateien:

Lesenswert?

So, habe nun mal den Gedanken mit dem LCD verworfen und dafür kommen nun 
ganz simple LEDs zum Einsatz. Muss mich damit mal mehr auseinandersetzen 
wenn ich auch mehr Zeit habe, habe aber nun folgendes Problem:

Habe mir nun auf die schnelle eine LED Platine gebastelt. Also 8 LEDs 
belegen nun den PORTD, mit einer einfachen Ausgabe konnte ich diese auch 
ansprechen und dies funktionierte auch! ;)

Nun möchte ich eben diese Anzeige dafür nutzen das mir der Schaltabstand 
eines analogen Sensors der über einen MAX11600 (A/D-Wandler) an der I2C 
Schnittstelle hängt angezeigt wird.

LED1=1cm
LED2=2cm usw.

Habe die Kennlinie vom Sensor aufgenommen um somit die 
Ausgangsspannungen für die verschiedenen Schaltabstände zu erreichen.

Nun aber meine Frage:
Ich habe ja eine Speicherzelle als RDATA festgelegt, wie kann ich nun 
diesen digitalen Wert, den ich ja nicht kenne anhand meiner Spannungen 
(Sensor) abfragen lassen ? Ich hatte da mal etwas wegen einem DDW 
(Digitals Daten Wort) gehört ?

Der Code steht soweit bis eben auf diese Abfrageschleife. Wäre für Hilfe 
wie immer dankbar und das jemand sich mal den Code anschauen könnte :)

Gruss Pascal

von Pascal K. (zerb)


Lesenswert?

Habe nun folgendes zwecks Spannung in DDW (8bit):

8-Bit Wandlung = 256
U Fullscale = 100 % Messspannung = 8cm = 4,5/5V
U Ausgangsspannung = Ausgangsspannung Sensor = 1-8cm = 0-5V

dann könnte ich doch dies so berechnen:

1).
U LSB = U Fullscale / 256 = 19,53 mV

2). Bsp. für 1cm = 455 mV
DDW = U Ausgangsspannung / U LSB = 23,29 => 23 => 17hex

Jetzt berechne ich eben all diese 8 Werte und füge die in eine 
Abfrageschleife ein ?

Danke Gruß Pascal

von Pascal K. (zerb)


Angehängte Dateien:

Lesenswert?

So habe jetzt mal etwas herumgebastelt und möchte wissen ob die 
Abfrageschleife so funktioniert wie ich es mir vorgestellt habe und ob 
die Kommunikation zwischen I2C -> MAX -> PIC -> LEDs so geht ?

Zu der Abfrage
Also je höher die Spannung=Abstand desto mehr (+1 weitere LED) leuchtet 
dazu auf.

Im Anhang der Code, für jeden Tipp & Hilfe bin ich sehr dankbar!

von Pascal K. (zerb)


Lesenswert?

Kann mir den niemand weiterhelfen ? :(

Gruß Pascal

von Pascal K. (zerb)


Angehängte Dateien:

Lesenswert?

Ich bin am verzweifeln!

Ich weiß nicht was ich falsch mache! Selbst jetzt bekomme ich sogar den 
Fehler das er "Init" nicht erkennt und meint es sei "illegal"...

Wäre so dankbar wenn mir jemand mit dem Code helfen könnte!

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.