;------------------------------------------------------------------------- ; SPI- Entwicklung ;------------------------------------------------------------------------- ; Funktion : ATMega8 ist SPI-Master; wählt durch SoftwareSlaveSelect (PIN B0) einen der ; ATTinys als Slave aus, dieser antwortet über Port B1; dadurch kontrollierte ; Datenübertragung per SPI ; Schaltung : SPI: MOSI, MISO, SCK ATMega8 zu ATTinys lt. Datenblatt ; ATMega8 - ATTiny2313 ; C1 - B0 ; C2 - B0 ; C3 - B1 ; ATtiny2313 auf Steckboard verbunden mit ATMega8 auf MYAVR-Board ; verbunden über SPI, ATMega als Master, ATTiny als Slave ; zur Anzeige steuern die MCUs jeweils LEDs, ATmega mit Taster und LED ; ATtiny mit LED an D1 ; Verbindung Steckboard - MYAVR-Board: +,-,MOSI, MISO, SCK, Software-SS, Bereit, LED (2313 Pins 20,10,17,18,19,12,13,3) ;------------------------------------------------------------------------- ; Prozessor : ATtiny2313 ; Takt : 1.000.000 Hz ; Sprache : Assembler (GNU) ; Datum : 20.5.2012 ; Version : 1.0 ; Autor : U.S. ;------------------------------------------------------------------------- ; ; Registerfestlegungen: R16 temporär ; R17 Zwischenspeicher für empfangene Daten ; .include "avr.h" ;------------------------------------------------------------------------------ begin: rjmp main ; RESET External Reset, Power-on Reset and Watchdog Reset reti ; INT0 External Interrupt Request 0 reti ; INT1 External Interrupt Request 1 reti ; TIMER1 CAPT Timer/Counter1 Capture Event reti ; TIMER1 COMPA Timer/Counter1 Compare Match A reti ; TIMER1 OVF Timer/Counter1 Overflow reti ; TIMER0 OVF Timer/Counter0 Overflow reti ; USART, RX USART, Rx Complete reti ; USART, UDRE USART Data Register Empty reti ; USART, TX USART, Tx Complete reti ; ANA COMP Analog Comparator reti ; PCINT reti ; TIMER1 COMPB reti ; TIMER0 COMPA reti ; TIMER0 COMPB reti ; USI START USI Start Condition reti ; USI OVERFLOW USI Overflow reti ; EEPROM Ready reti ; WDT OVERFLOW Watchdog Timer Overflow ;------------------------------------------------------------------------------ main: ldi r16,lo8(RAMEND) out SPL,r16 ; Set Stack Pointer to top of RAM cbi DDRB,0 ; B0 als Eingang für Slaveselect cbi DDRB,1 ; B1 als Eingang temporär cbi DDRB,5 ; B5 als Eingang für MOSI sbi DDRB,6 ; B6 als Ausgang für MISO cbi DDRB,7 ; B7 als Eingang für UCSK sbi DDRD,1 ; D1 als Ausgang für LED cbi PORTD,1 ; LED aus mainloop: ;wdr in r16,PINB ; warten bis Slaveselect sbrc r16,0 ; low-Pegel an SS startet den Ablauf rjmp mainloop rcall SPI_init ; MCU als SPI-Slave initialisieren cbi PORTB,1 ; Pegeländerung an B1 zeigt dem Master die Bereitschaft an sbi DDRB,1 ; B1 als Ausgang für die Dauer der Datenübertragung Empfang: rcall SPI_Empfang ; Daten empfangen ldi r16,0b10010110 ; Testdaten - nur zur Programmentwicklung cp r16,r17 ; Test: Daten korrekt übertragen -> LED an brne mainloop rcall LEDan rcall SPI_aus ; Übertragungsende SPI inaktiv rjmp mainloop LEDan: sbi PORTD,1 ; nur zur Programmentwicklung ret ;------------------------------------------------------------------------ ; SPI-Initialisierung als Slave SPI_init: cbi DDRB,5 ; B5 als Eingang für MOSI sbi DDRB,6 ; B6 als Ausgang für MISO cbi DDRB,7 ; B7 als Eingang für UCSK ldi r16,0b00011000 ; (1<