Testprogramm 2 - Verwendung eines Interrupts bei Slave 1
|
#include <avr/io.h>
#include <avr/interrupt.h> //Library für Interrupts
volatile uint8_t akku;
volatile uint8_t zahl=1;
SIGNAL(SIG_SPI) //Empfang über SPI vollständig, sollte auf Flag SPIF in SPSR reagieren!
{
akku = SPCR; //Durch Auslesen der Register SPCR und SPDR Interrupt wieder freigeben
akku = SPDR;
PORTC = akku; //Empfangenes Byte dezimal anzeigen. In diesem Fall die 15
zahl++; //Zu sendende Zahl um 1 erhöhen
SPDR = zahl; //Zusendende Zahl in das SPI-Datenregister legen.
}
int main(void)
{
//MOSI / PB5 als Input
DDRB &= 0b11011111;
//MISO / PB6 als Output (genau umgekerht wie beim Master)
DDRB |= 0b01000000;
//SCK / PB7 als Input (für den Synchronisationstakt)
DDRB &= 0b01111111;
DDRC = 0b11111111; //PORTC als Ausgang
PORTC = 0; //PORTC mit Null vorinitialisieren
//SPI-Datenregister mit der zu sendenden Zahl füllen:
SPDR = zahl;
//SPI-Schnittstelle als Slave und mit Interrupt aktivieren:
SPCR = (1<<SPIE) | (1<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);
//Interrupts allgemein aktivieren:
sei();
while(1) //Im Hauptprogramm nichts tun
{
}
return 0;
}
Code 0-5: Quellcode für Slave 1 in Testprogramm 2 (Quellcode für Master wie bei Testprogramm 1)
spi4_mitInterrupt_slave1.zip - Projekt zu Testprogramm 2