Im AVR Studio muss natürlich ATmega168 eingestellt werden. Im GCC sind
die entsprechenden Register so zu benennen wie sie im iomx8.h stehen.
Der GCC sorgt dann selbst für die richtige Abarbeitung.
Anders in Maschinensprache, hier muss genau gearbeitet werden wie es die
Maschine verlangt.
; Hier ein Beispiel für Übergabe in das SPI Daten Register in
Maschinensprache aus der GLCD V01 für das S65 mit LS020.
; Die Routine braucht dann schon knapp doppelt so lange für die Ausgabe!
;*** ATmega168
SPI_SEND: ; #Clocks
push r31 ; 2
in r31, LCD_SPCR ; 1
sbr r31, SPE ; 1
out LCD_SPCR, r31 ; 1
out LCD_SPDR, T1 ; 1 load byte in SPI data register
SPI_SEND_0:
in r31, LCD_SPSR ; 1
sbrs r31, SPIF ; 1/2/3
rjmp SPI_SEND_0 ; 2 transmitt byte to LCD
; in r24,LCD_SPDR ; short time workaround to be fixed
sbi LCD_PORT, LCD_CS ; 2 deselect Display
pop r31 ; 2
ret ;(2)
; 14 Clocks
;*** ATmega8(L)
SPI_SEND: ; #Clocks
sbi LCD_SPCR,SPE ; 2 enable SPI
out LCD_SPDR,T1 ; 1 load byte in SPI data register
SPI_SEND_0:
sbis LCD_SPSR,SPIF ; 1/2/3
rjmp SPI_SEND_0 ; 2 transmitt byte to LCD
; push r0 ; short time workaround to be fixed
; in r0,LCD_SPDR ;
; pop r0 ;
sbi LCD_PORT,LCD_CS ; 2 deselect Display
ret ;(2)
; 8 Clocks
; Hier ein Beispiel für Übergabe in das SPI Setup register in
Maschinensprache.
; es müssen für ATmega168 alle acht Bits gestzt werden.
; setup serial data interface
; select clock phase positive going in middle of data
; master mode
; enable SPI
; speed is CPUclock/2
;*** ATmega168
ldi r24,(0 << SPIE) | (1 << SPE) | (0 << DORD) | (1 << MSTR) | (0 <<
CPOL) | (0 << CPHA) | (0 << SPR1) | (0 << SPR0);
out LCD_SPCR,r24
ldi r24,(1<<SPI2X) ; double speed bit
out LCD_SPSR,r24
;*** ATmega8(L) Hier werden nur die Bits gesetzt die gebraucht werden.
ldi r24,(1<<MSTR) | (1<<SPE); | (1<<SPR0); ; Master Mode, Enable
SPI, fCPU/16 clock
out LCD_SPCR,r24
ldi r24,(1<<SPI2X) ; double speed bit
out LCD_SPSR,r24