EA-DIP204-6 mit KS0073 per SPI in ASM ansteuern!

Gast #837255
Lesenswert?

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
;----------------------------------------------------------------------- 
-
Gast #840237
Lesenswert?

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.
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren