Hallo Leute!
Wieder mal ein KS0073er Problem. Ich habe mir obiges Display gekauft und
per 4bit Bus betrieben, habe die Brücke umgelötet und versucht es via
SPI zu betreiben, komme aber nicht dahinter was ich falsch mache bzw. wo
der Fehler liegt.
Hardware anschlusse:
Atmega8 --> LCD
Masse --> Pin 5 CS
PB3 --> Pin 6 SID
PB5 --> Pin 7 CLK
Das ganze in Assembler geschrieben:
;-----------------------------------------------------------------------
---
; Prozessor : ATmega8
; Takt : 3,6864 MHz
; Sprache : Assembler
;-----------------------------------------------------------------------
---
.include "m8def.inc"
;-----------------------------------------------------------------------
-
; Reset and Interrupt vector Beschreibung
begin: rjmp main ;POWER ON RESET
reti ;Int0-Interrupt
reti ;Int1-Interrupt
reti ;TC2 Compare Match
reti ;TC2 Overflow
reti ;TC1 Capture
reti ;TC1 Compare Match A
reti ;TC1 Compare Match B
reti ;TC1 Overflow
reti ;TC0 Overflow
reti ;SPI, STC Serial Transfer C.
reti ;UART Rx Complete
reti ;UART Data Register Empty
reti ;UART Tx complete
reti ;ADC Conversion Complete
reti ;EEPROM Ready
reti ;Analog Comparator
reti ;TWI (I²C) Serial Interface
reti ;Store Program Memory Redy
;-----------------------------------------------------------------------
-
; Start, Power ON, Reset
main: ldi r16, low(RAMEND)
out SPL, r16
ldi r16, high(RAMEND)
out SPH, r16
; Hier Init-Code eintragen.
ldi r16,0b00111111 ;port b ausgang
out DDRB,r16
ldi r16,0b01111110 ;SPI: 0=Interrupt, 1=SPI ein,
1=LSB,1=Master, 1=Idle high, 1=fallend flanke, 10=f/64
out SPCR,r16
ldi r16,0x00
out SPSR,r16
rcall LCD_init
rcall output
;-----------------------------------------------------------------------
--
mainloop: wdr
; Hier den Quellcode eintragen.
rjmp mainloop
;-----------------------------------------------------------------------
--
output: rcall LCD_data
ldi r16,'H'
rcall LCD_send
ldi r16,'a'
rcall LCD_send
ldi r16,'l'
rcall LCD_send
ldi r16,'l'
rcall LCD_send
ldi r16,'o'
rcall LCD_send
ret
;-----------------------------------------------------------------------
--
LCD_init: ;waten auf Powerup 50ms
ldi r16,10
Powerup: rcall wait5ms
dec r16
brne Powerup
;...
rcall LCD_cmd
ldi r16,0b00100100 ;re=1
rcall LCD_send
ldi r16,0b00001001 ;0=5dot,0=normal Cursor,1=4 Zeilen display
rcall LCD_send
ldi r16,0b00100000 ; re=0
rcall LCD_send
ldi r16,0b00001111 ;1=Display on, 1=cursor on, 1=blink on
rcall LCD_send
ldi r16,0b00000001 ; lcd clear
rcall LCD_send
ldi r16,0b00000010 ; Cursor Home
rcall LCD_send
ret
;-----------------------------------------------------------------------
-
LCD_data: ldi r16,0x5F ;(01011111)lsb 1111 1=start, 0=schreiben,
1=daten ,0=abschluss init
out SPDR,r16
wdata: sbis SPSR,7 ;warten bis Übertragung vollständig
rjmp wdata
ret
;-----------------------------------------------------------------------
-
LCD_cmd: ldi r16,0x1F ;(00011111)lsb 1111 1=start, 0=schreiben,
0=Befehl ,0=abschluss init
out SPDR,r16
wcmd: sbis SPSR,7 ;warten bis Übertragung vollständig
rjmp wcmd
ret
;-----------------------------------------------------------------------
-
LCD_send: push r17
rcall wait5ms
mov r17,r16 ;z.B.: r16 = msb 11010101 lsb (zu sendende daten)
swap r17 ;r17 = 01011101 lsb
andi r16,0x0F ;r16 = 00000101 lsb
andi r17,0x0F ;r17 = 00001101 lsb
; sende 1.teil und warten bis gesendet ist
out SPDR,r16 ;1.teil senden
teil1: sbis SPSR,7
rjmp teil1
; sende 2.teil und warte bis gesendet ist
out SPDR,r17 ;2.teil senden
teil2: sbis SPSR,7
rjmp teil2
pop r17
ret
;-----------------------------------------------------------------------
-
wait5ms: push r16
push r17
ldi r17,50
loop1: ldi r16,123
loop2: dec r16
brne loop2
dec r17
brne loop1
pop r17
pop r16
ret
;-----------------------------------------------------------------------
-
Also es hat also keiner von euch eine Ahnung worin mein Fehler besteht oder?
Ich betreibe hier DIP204-4 im SPI-Mode. Hatte am Anfang auch Probleme damit. Man muss es so initialisieren, wie im 8-Bit Parallelmode. Es hängt ein C-Programm an, welches bei mir läuft. Vielleicht kannst Du was draus entnehmen, meist ist die Initialisierung das Problem.
Danke für den Code, ich werde ihn mir mal zu gemüte führen und hoffe ich werde schlau draus.
Mir fällt gerade noch was ein. Wie hast Du den RESET-Pin beschaltet? Der muss auf H liegen.
Sorry hab ich vergessen, aber ja hängt auf H, bin leider noch nicht dazu gekommen deinen Code näher anzusehen bzw. zu probieren, werde das aber auf alle fälle noch dieses WE machen.
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.