;*******************************************************************************
;*
;*      Titel:  SPI Master (Polling) (C4_SPI_master_polling.asm)
;*      Datum:  02/10/09        Version:        0.1
;*      Autor:  WEIGU
;*
;*      Informationen zur Beschaltung:
;*
;*      Prozessor: ATmega32                     Quarzfrequenz: 16MHz
;*      Eingaenge: PB6 (MISO), 8 Schalter gegen Masse an PORTA
;*      Ausgaenge: PB4(/SS), PB5(MOSI), PB7(SCK), 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)

;-------------------------------------------------------------------------------
;       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 Master initialisieren
        ;SPI-Ausgaenge initialisieren (PB6 (MOSI) automatisch Eingang)
        sbi     DDRB,4          ;PB4 Ausgang (/SS) muss beim Master Mode vor dem
                                ;Einschalten der Schnittstelle geschehen!
        sbi     DDRB,5          ;PB5 Ausgang (MOSI)
        sbi     DDRB,7          ;PB7 Ausgang (SCK)
        ;SPI einschalten, Master mit SCK = Systemtakt/128, MSB first, SPI Mode 1
        ldi     Tmp1,0x57       ;SPCR = 0b01010111
        out     SPCR,Tmp1       ;B7 SPIE=0 kein Interrupt
                                ;B6 SPE=1 SPI einschalten
                                ;B5 DORD=0 MSB zuerst
                                ;B4 MSTR=1 Master
                                ;B32 CPOL=0 CPHA=1 SPI Modus 1
                                ;B10 SPR1=1 SPR0=1 Systemtakt/128 (125kHz)
        ;Slave aktivieren
        cbi     PORTB,4         ;Slave aktivieren

;-------------------------------------------------------------------------------
;       Hauptprogramm
;-------------------------------------------------------------------------------
MAIN:   in      Tmp1,PINA       ;Schalter einlesen und ueber SPI uebertragen
        out     SPDR,Tmp1       ;Starte die Uebertragung
W_SPIF: sbis    SPSR,SPIF       ;Warte bis Uebertragung fertig
        rjmp    W_SPIF
        in      Tmp1,SPDR       ;Empfange Byte vom Slave
        out     PORTC,Tmp1      ;und Ausgabe an LEDs
        rjmp    MAIN            ;Endlosschleife

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
.EXIT                           ;Ende des Quelltextes
