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