;------------------------------------------------------------------------- ; SPI- Entwicklung ;------------------------------------------------------------------------- ; Funktion : ATMega8 ist SPI-Master; wählt durch SoftwareSlaveSelect (PORT c1 oder C2) einen der ; ATTinys (PIN B0) als Slave aus, dieser antwortet über Port B1 (PIN C3); dadurch kontrollierte ; Datenübertragung per SPI ; Schaltung : SPI: MOSI, MISO, SCK ATMega8 zu ATTinys lt. Datenblatt ; ATMega8 - ATTiny2313 ; C1 - B0 ; C2 - B0 ; C3 - B1 ; C0: PIN für Taster ; C4: PORT für LED ;------------------------------------------------------------------------- ; Prozessor : ATmega8 ; Takt : 3686400 Hz ; Sprache : Assembler (GNU) ; Datum : 13.5.2012 ; Version : 1.0 ; Autor : U.S. ;------------------------------------------------------------------------- ; ; Registerfestlegungen: R16 temporär ; R0 Zeiger auf Slaverückmeldepegel (high oder low) ; nur notwendig, weil wg. Interrupt der Slave einmal schneller sein könnte .include "avr.h" begin: rjmp main ; 1 POWER ON RESET reti ; 2 Int0-Interrupt reti ; 3 Int1-Interrupt reti ; 4 TC2 Compare Match reti ; 5 TC2 Overflow reti ; 6 TC1 Capture reti ; 7 TC1 Compare Match A reti ; 8 TC1 Compare Match B reti ; 9 TC1 Overflow reti ;10 TC0 Overflow reti ;11 SPI, STC Serial Transfer Complete reti ;12 UART Rx Complete reti ;13 UART Data Register Empty reti ;14 UART Tx Complete reti ;15 ADC Conversion Complete reti ;16 EEPROM Ready reti ;17 Analog Comparator reti ;18 TWI (I²C) Serial Interface reti ;19 Store Program Memory Ready ;------------------------------------------------------------------------ ; Initialisierungen ;------------------------------------------------------------------------ main: ;--- Stack Initialisierung --- ldi r16,hi8(RAMEND) out SPH,r16 ldi r16,lo8(RAMEND) out SPL,r16 ; Ports initialisieren sbi DDRC,1 ; PORTC1 als Ausgang sbi PORTC,1 ; Pegel high sbi DDRC,2 ; PORTC2 als Ausgang sbi PORTC,2 ; Pegel high cbi DDRC,3 ; PORTC3 als Eingang sbi PORTC,3 ; mit Pullup cbi DDRC,0 ; PORTC0 als Eingang nur f. Programmierung sbi PORTC,0 ; mit Pullup sbi DDRC,4 ; PORTC4 als Ausgang für LED nur f. Programmierung cbi PORTC,4 ; LED aus sbi DDRC,5 ; PORTC5 als Ausgang für LED nur f. Programmierung cbi PORTC,5 ; LED aus rcall SPI_init ;SPI initialisieren ; Pause 500 ms ; warten bis die Initialisierung der Slaves sicher beendet ist ;------------------------------------------------------------------------ ; Hauptprogramm-Schleife ;------------------------------------------------------------------------ mainloop: wdr in r16,PINC ; start durch Taster sbrc r16,0 ; Taster betätigt? rjmp mainloop ; nein sbi PORTC,4 ; Kontrolle LED rcall Slav1start ldi r17,0b10010110 ; Zufallswert rcall ByteSend ;weitere Bytes übertragen ;der Slave signalisiert die Bereitschaft jeweils durch Pegeländerung an Port C3 ; unmittelbar vor Übertragung des letzten Byte Slaveselect auf high (nach Übertragung lässt ATTiny das SPI ruhen) rcall SlaveStop sbi PORTC,5 ; Kontrolle LED rjmp mainloop ; Sprung zum Beginn der Hauptprogrammschleife ;------------------------------------------------------------------------ ;einen der Slaves starten Slav1start: cbi PORTC,1 ; Slaveselect durch PORTC1 auf low rjmp fertigL Slav2start: cbi PORTC,2 ; Slaveselect durch PORTC2 auf low ;------------------------------------------------------------------------ fertigL: in r16,PINC ; Antwort v. ATTiny durch low-Signal auf PIN C3 sbrc r16,3 ; ATTiny fertig? rjmp fertigL ; nein clr R0 ret ;------------------------------------------------------------------------ fertigH: in r16,PINC ; Antwort v. ATTiny durch high-Signal auf PIN C3 sbrs r16,3 ; ATTiny fertig? rjmp fertigH ; nein inc R0 ret ;------------------------------------------------------------------------ ;beide Slaves stoppen SlaveStop: sbi PORTC,1 sbi PORTC,2 ret ;------------------------------------------------------------------------ ; ein Byte übertragen, die Daten werden in R17 übergeben ByteSend: out SPDR,r17 ; SPI Datenregister füllen und damit Übertragung starten komplett: sbis SPSR,SPIF ; Übertragung vollständig? rjmp komplett ; nein - warten ret ;------------------------------------------------------------------------ ; SPI-Initialisierung als Master SPI_init: sbi DDRB,2 ; SS als Ausgang - wird nicht benutzt sbi DDRB,3 ; MOSI als Ausgang cbi DDRB,4 ; MISO als Eingang sbi DDRB,5 ; SCK als Ausgang ldi r16,0b01010001 ; enable SPI, Master, fosc/16 out SPCR,r16 ret