Gast
#837255
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
;-----------------------------------------------------------------------
-