Forum: Mikrocontroller und Digitale Elektronik EA-DIP204-6 mit KS0073 per SPI in ASM ansteuern!


von Helmut (Gast)


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
;----------------------------------------------------------------------- 
-

von Helmut (Gast)


Lesenswert?

Also es hat also keiner von euch eine Ahnung worin mein Fehler besteht 
oder?

von Matthias (Gast)


Angehängte Dateien:

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.

von Helmut (Gast)


Lesenswert?

Danke für den Code, ich werde ihn mir mal zu gemüte führen und hoffe ich 
werde schlau draus.

von Matthias (Gast)


Lesenswert?

Mir fällt gerade noch was ein. Wie hast Du den RESET-Pin beschaltet? Der 
muss auf H liegen.

von Helmut (Gast)


Lesenswert?

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