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