;*******************************************************************************
;*
;*      Titel:  SPI Slave (Interrupt) (C4_SPI_slave_interrupt.asm)
;*      Datum:  02/10/09        Version:        0.1
;*      Autor:  WEIGU
;*
;*      Informationen zur Beschaltung:
;*
;*      Prozessor: ATmega32                     Quarzfrequenz: 16MHz
;*      Eingaenge: 8 Schalter gegen Masse an PORTA
;*      Ausgaenge: PB6 (MISO), 8 LEDs an PORTC
;*
;*      Informationen zur Funktionsweise:
;*      2 ATMega32 sind ueber SPI verbunden. Die Positionen von 8 Schalter des
;*      Mastermega sind an den 8 LEDs des Slavemega sichtbar. Umgekehrt sind
;*      die Positionen der 8 Schalter des Slavemega an den 8 LEDs des Mastermega
;*      sichtbar.
;*
;*******************************************************************************

;-------------------------------------------------------------------------------
;       Einbinden der controllerspezifischen Definitionsdatei
;-------------------------------------------------------------------------------
.NOLIST                         ;List-Output ausschalten
.INCLUDE "m32def.inc"           ;AVR-Definitionsdatei einbinden
.LIST                           ;List-Output wieder einschalten

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;       Programmspeicher (FLASH)     Programmstart nach RESET ab Adr. 0x0000
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
.CSEG                           ;was ab hier folgt kommt in den FLASH-Speicher
.ORG    0x0000                  ;Programm beginnt an der FLASH-Adresse 0x0000
RESET1: rjmp    INIT            ;springe nach INIT (ueberspringe ISR Vektoren)

;-------------------------------------------------------------------------------
;       Sprungadressen fuer die Interrupts organisieren (ISR VECTORS)
;-------------------------------------------------------------------------------
        ;Vektortabelle (im Flash-Speicher)
.ORG   SPIaddr                 ;interner Vektor fuer SPI (alt.: .ORG 0x0018)
       rjmp    ISRSPI          ;Springe zur ISR von SPI Transfer Ready

;-------------------------------------------------------------------------------
;       Initialisierungen und eigene Definitionen
;-------------------------------------------------------------------------------
.ORG    INT_VECTORS_SIZE        ;Platz fuer ISR Vektoren lassen
INIT:
.DEF    Tmp1 = r16              ;Register 16 dient als erster Zwischenspeicher
.DEF    Tmp2 = r17              ;Register 17 dient als zweiter Zwischenspeicher
.DEF    WL = r24                ;Register 24 und 25 dienen als universelles
.DEF    WH = r25                ;Doppelregister W

        ;Stapel initialisieren (fuer Unterprogramme bzw. Interrupts)
        ldi     Tmp1,HIGH(RAMEND)       ;RAMEND (SRAM) ist in der Definitions-
        out     SPH,Tmp1                ;datei festgelegt
        ldi     Tmp1,LOW(RAMEND)
        out     SPL,Tmp1

        ;Schalter und LEDs initialisieren
        clr     Tmp1            ;8 Schalter an PORTA
        out     DDRA,Tmp1
        ser     Tmp1            
        out     PORTA,Tmp1      ;Pull-Ups
        out     DDRC,Tmp1       ;8 LEDs an PORTC
        
        ;SPI Slave initialisieren
        ;SPI-Ausgang initialisieren
        ;(PB4(/SS), PB5(MOSI) und PB7(SCK) automatisch Eingang)
        sbi     DDRB,6          ;PB6 Ausgang (MISO)
        ;SPI einschalten, Slave mit SCK = Systemtakt/128, MSB first, SPI Mode 1
        ldi     r16,0xC7        ;SPCR = 0b11000111
        out     SPCR,r16        ;B7 SPIE=0 kein Interrupt
                                ;B6 SPE=1 SPI einschalten
                                ;B5 DORD=0 MSB zuerst
                                ;B4 MSTR=0 Slave
                                ;B32 CPOL=0 CPHA=1 SPI Modus 1
                                ;B10 SPR1=0 SPR0=1 Systemtakt/128 (125kHz)
        
;-------------------------------------------------------------------------------
;       Hauptprogramm
;-------------------------------------------------------------------------------
MAIN:   sei                     ;Interrupts Global erlauben
END:    rjmp    END             ;Endlosschleife

;-------------------------------------------------------------------------------
;       Unterprogramme und Interrupt-Behandlungsroutinen
;-------------------------------------------------------------------------------
;Interruptroutine zum Senden und Empfangen über den SPI Bus
ISRSPI: in      r16,PINA        ;Schalter einlesen und
        out     SPDR,r16        ;ueber SPI uebertragen
        in      r16,SPDR        ;Empfangene Daten auf LEDs ausgeben
        out     PORTC,r16
        reti                    ;Rücksprung ins Hauptprogramm

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
.EXIT                           ;Ende des Quelltextes
