Forum: Mikrocontroller und Digitale Elektronik Test für 4*20 LCD Display via SPI


von Thomas H. (Gast)


Lesenswert?

Hallo,

ich habe einen ATmega162 und ein 4*20 LCD Display mit KS0073
Controller. Der Anschluss erfolgt via SPI inkl. CS\. Ich versuche nun
seit Tagen das Display zum Laufen zu bekommen, jedoch ohne Erfolg.

Da ich keinen Code fuer eine reine SPI-Ansteuerung gefunden habe (nur
mit Wandler uC->SPI->Conv.->4pol-parallel->LCD), habe ich andere Codes
in C und ASM modifiziert. Leider funktioniert nichts. Ich bekomme
keinerlei Reaktion vom Display. Durch Status-LEDs weiss ich aber, dass
Daten via SPI gesendet werden.

Jetzt möchte ich gerne überprüfen, ob die Hardware überhaupt o. k. ist.
Dazu wäre ein Codebeispiel, das mit der direkten SPI-Ansteuerung
funktioniert, toll. Dann wüßte ich, dass die Software o. k. ist und
könnte nachsehen, ob vielleicht an der Hardware etwas defekt ist.

Hat also jemand eine funktionierende Routine in C oder ASM zur
Ansteuerung direkt via SPI?

Danke und tschau,

Thomas

von Thomas H. (Gast)


Lesenswert?

Hallo,

ich habe jetzt den nachfolgenden Testcode geschrieben. Durch
Statusled's sehe ich, dass Daten gesendet werden. Jedoch bleibt das
Display ohne Reaktion.

Anschlussbelegung wie folgt:

uC => LCD
---------

MISO -> SOD
SCK -> SCK
MOSI -> SID
/CS3 (P3) -> CS
/RES -> /RES
zzgl. Versorgungsanschlüsse

Den Kontrast habe ich so eingestellt, dass auf jeden Fall eine Änderung
sichtbar sein muss.

Anm.: der Code ist nicht sehr schoen, da nur für Testzwecke.

Vielleicht hat jemand eine Idee, warum...

Thomas

.include "m162def.inc"

.equ LCD_PORT = PORTA    ; CS-Pin
.equ LCD_DIR  = DDRA
.equ Strobe = 3

.def temp1     = r16
.def temp2     = r17
.def temp3     = r18
.def data_4094 = r19
.def cnt       = r20
.def temp      = r21

ldi temp1, 0xFF      ; CS-Pins als Out
out DDRA, temp1

ldi temp1, Low(RAMEND)    ; Stack
out SPL, temp1
ldi temp1, High(RAMEND)
out SPH, temp1

ldi temp1, 0x70      ; PotB als Out/In SPI config.
out PORTB, temp1
ldi temp1, 0xb0
out DDRB, temp1

ldi temp1, 0b01011110    ; SPI config.
out SPCR, temp1


testz:

rcall delay5ms

cbi  LCD_PORT,Strobe        ; FUNKTION SET
ldi    data_4094, 0b11111000
rcall   sendspi
ldi   data_4094, 0b11110000
rcall   sendspi
ldi   data_4094, 0b01000000
rcall   sendspi
sbi  LCD_PORT,Strobe
rcall  delay5ms


cbi  LCD_PORT,Strobe        ; DISPLAY ON/OFF
ldi    data_4094, 0b11111000
rcall   sendspi
ldi   data_4094, 0b01110000
rcall   sendspi
ldi   data_4094, 0b00000000
rcall   sendspi
sbi  LCD_PORT,Strobe
rcall  delay5ms

cbi  LCD_PORT,Strobe        ;CLEAR DISPLAY
ldi    data_4094, 0b11111000
rcall   sendspi
ldi   data_4094, 0b10000000
rcall   sendspi
ldi   data_4094, 0b00000000
rcall   sendspi
sbi  LCD_PORT,Strobe
rcall  delay5ms

cbi  LCD_PORT,Strobe        ; ENTRY MODE SET
ldi    data_4094, 0b11111000
rcall   sendspi
ldi   data_4094, 0b01100000
rcall   sendspi
ldi   data_4094, 0b00000000
rcall   sendspi
sbi  LCD_PORT,Strobe
rcall  delay5ms

cbi  LCD_PORT,Strobe        ; WRITE DATA DRAM
ldi    data_4094, 0b11111010
rcall   sendspi
ldi   data_4094, 0b11000000
rcall   sendspi
ldi   data_4094, 0b10100000
rcall   sendspi
sbi  LCD_PORT,Strobe
rcall  delay5ms

ende:
rjmp testz

von Thomas H. (Gast)


Lesenswert?

Habe die SUB's vergessen:

Der Sprung am Ende (rjmp testz) heisst "rjmp ende"!!


delay5ms:                  ; 5ms Pause
  ldi  R22, $21
WGLOOP0_t:
  ldi  R23, $C9
WGLOOP1_t:
  dec  R23
        brne WGLOOP1_t
        dec  R22
        brne WGLOOP0_t
  ret



sendspi:
     out   SPDR, data_4094
spil:
     sbis  SPSR, SPIF
     rjmp  spil          ; jump wenn nicht fertig
     nop
     ret

von Thomas H. (Gast)


Lesenswert?

Hallo,

mit ein paar Korrekturen bekomme ich jetzt ein vollständig invertiertes
Display, jedoch voll schwarz, ohne Anzeige.

Ich verstehe das schon richtig, dass nach dem Startbyte die Daten in
zwei Bytes mit je vier Datenbits und vier Null-Bits ausgeteilt wird,
wobei mit D0 bis D7 gelaufen wird?

D. h.

Startbyte: 1 1 1 1 1 Stat1 Stat2 0
Datenbyte1: D0 D1 D2 D3 0 0 0 0
Datenbyte2: D4 D5 D6 D7 0 0 0 0

wobei der Spi-Modus so ist, dass mit dem MSB begonnen wird!???

Ich denke das Startbyte wird richtig interpretiert, denn wenn ich auf
"read" schalte, dann sendet das Display tatsächlich Daten und bei
"write" nicht.

Aber die Datenbits funktionieren wohl nicht so, wie sie sollen...

Hat jemand eine Idee?

Thomas H.

.include "m162def.inc"

.equ LCD_PORT = PORTA    ; CS-Pin
.equ LCD_DIR  = DDRA
.equ Strobe = 3

.def temp1     = r16
.def temp2     = r17
.def temp3     = r18
.def data_4094 = r19
.def cnt       = r20
.def temp      = r21

ldi temp1, Low(RAMEND)    ; Stack
out SPL, temp1
ldi temp1, High(RAMEND)
out SPH, temp1

ldi temp1, 0xFF      ; CS-Pins als Out
out DDRA, temp1

ldi temp1, 0b01110000    ; Ruhezustand
out PORTB, temp1

ldi temp1, 0b10100000    ; PortB als Out/In SPI config.
out DDRB, temp1

ldi temp1, 0b01011110    ; SPI config.
out SPCR, temp1


testz:

rcall delay5ms

cbi  LCD_PORT,Strobe        ; FUNKTION SET
ldi    data_4094, 0b11111000
rcall   sendspi
ldi   data_4094, 0b00110000
;ldi   data_4094, 0b00000000
rcall   sendspi
ldi   data_4094, 0b11000000
;ldi   data_4094, 0b00000000
rcall   sendspi
sbi  LCD_PORT,Strobe
rcall  delay5ms

cbi  LCD_PORT,Strobe        ; EXT. FUNKTION SET
ldi    data_4094, 0b11111000
rcall   sendspi
ldi   data_4094, 0b10010000
;ldi   data_4094, 0b00000000
rcall   sendspi
ldi   data_4094, 0b00000000
;ldi   data_4094, 0b00000000
rcall   sendspi
sbi  LCD_PORT,Strobe
rcall  delay5ms

cbi  LCD_PORT,Strobe        ; FUNKTION SET
ldi    data_4094, 0b11111000
rcall   sendspi
ldi   data_4094, 0b00010000
;ldi   data_4094, 0b00000000
rcall   sendspi
ldi   data_4094, 0b11000000
;ldi   data_4094, 0b00000000
rcall   sendspi
sbi  LCD_PORT,Strobe
rcall  delay5ms

cbi  LCD_PORT,Strobe        ; DISPLAY ON/OFF
ldi    data_4094, 0b11111000
rcall   sendspi
ldi   data_4094, 0b11100000
;ldi   data_4094, 0b00000000
rcall   sendspi
ldi   data_4094, 0b00000000
;ldi   data_4094, 0b00000000
rcall   sendspi
sbi  LCD_PORT,Strobe
rcall  delay5ms

cbi  LCD_PORT,Strobe        ; CLEAR DISPLAY
ldi    data_4094, 0b11111000
rcall   sendspi
ldi   data_4094, 0b01100000
;ldi   data_4094, 0b00000000
rcall   sendspi
;ldi   data_4094, 0b00000000
ldi   data_4094, 0b00000000
rcall   sendspi
sbi  LCD_PORT,Strobe
rcall  delay5ms

cbi  LCD_PORT,Strobe        ; ENTRY MODE
ldi    data_4094, 0b11111000
rcall   sendspi
ldi   data_4094, 0b11110000
;ldi   data_4094, 0b00000000
rcall   sendspi
ldi   data_4094, 0b00000000
;ldi   data_4094, 0b00000000
rcall   sendspi
sbi  LCD_PORT,Strobe
rcall  delay5ms

cbi  LCD_PORT,Strobe        ; WRITE DATA DRAM
ldi    data_4094, 0b11111010
rcall   sendspi
ldi   data_4094, 0b11000000
;ldi   data_4094, 0b00000000
rcall   sendspi
ldi   data_4094, 0b10100000
;ldi   data_4094, 0b00000000
rcall   sendspi
sbi  LCD_PORT,Strobe
rcall  delay5ms

ende:
rjmp ende


delay5ms:                  ; 5ms Pause
  ldi  R22, $21
WGLOOP0_t:
  ldi  R23, $C9
WGLOOP1_t:
  dec  R23
        brne WGLOOP1_t
        dec  R22
        brne WGLOOP0_t
  ret

von crazy horse (Gast)


Lesenswert?

ohne mir das jetzt alles durchzulesen: hast du die SPI-Parameter
beachtet(MSB/LSB first, CPOL, CPHA) bzw. kennst du diese vom Display
überhaupt? Taktfrequenz zu hoch? Evtl. Wartezeiten erforderlich?
Normalerweise ist SPI problemlos.

von Thomas H. (Gast)


Lesenswert?

Hallo,

lt. Zeitdiagramm Datenblatt KS0073 wird MSB zuerst gesendet (Startbits
5 mal High, ...). Zu CPOL, CPHA habe ich keine Angaben gefunden, aber
das Display erkennt mit der jetzigen Konfiguration ja auch, dass es
Daten senden soll. Taktfrequenz ist niedrig genug. Wartezeiten sollten
auch ausreichend sein.

Somit weiss ich nicht mehr so recht weiter...

Thomas H.

von Thomas H. (Gast)


Lesenswert?

Hallo,

also: Das Programm ist soweit fehlerfrei.

Ich habe jetzt jedoch entdeckt, dass es wohl ein Konflikt zwischen ISP
und dem SPI des uC oder LCD's gibt. Ich habe an den SPI-Port zum einen
das LCD-Display angeschlossen, als auch die ISP-Schnittstelle meines
STK500.

Wenn ich den uC neu programmiere (funktioniert immer tadellos),
funktioniert das LCD oder es zeigt nichts gutes an oder eine
Kombination zwischen Chaos und Soll-Ausgabe. Manchmal passiert es,
dass, wenn ich die Schaltung vom STK500 losloese, dass alls wie
gewuenscht funktioniert und manchmal eben nicht. Ab und zu kann ich
dann auf den AVR beim Programmieren nicht mehr zugreifen und muss erst
wieder ein paar Fuses aendern, bis es wieder klappt.

Hat jemand eine Vorstellung, ob und wie so ein SPI-ISP Konflikt
entstehen kann und warum? Eine Systematik habe ich leider noch nicht
entdeckt.

Danke und ciao,

Thomas H.

von Thomas H. (Gast)


Lesenswert?

Hallo,

damit alle was davon haben: Man muss, entgegen den Angaben im
KS0073-Datenblatt, CPHA und CPOL auf 0 setzen. Funktioniert tadellos.

Thomas H.

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.