/************************************************************** Es soll alle halbe Sekunde im Wechsel 0 bzw. 1 gesendet werden. Am korrespondierenden Slave soll zur Indikation jeweils die LEDs an bzw. aus gehen Verdrahtung: MISO(Master) --> MISO(Slave) MOSI(Master) --> MOSI(Slave) SCK(Master) --> SCK(Slave) PB0(Master) --> SS(Slave) **************************************************************/ #include #include #include #include "lcd_driver.c" unsigned char status = 0; volatile unsigned char count; void timer1 (void); void master_init (void); void master_transmit (unsigned char data); SIGNAL (SIG_SPI) { return; } SIGNAL (SIG_OVERFLOW1) { //Senderoutine if (count == 1) { master_transmit ('1'); count--; return; } if (count == 0) { master_transmit ('0'); count++; } } void timer1 (void) { TIMSK |= _BV(TOIE1); //Timer Overflow Interrupt enable TCNT1 = 0; //Rücksetzen des Timers TCCR1B = _BV(CS10) | _BV(CS11); //8MHz/65536/64 = 1,91Hz --> 0,5s } void master_init (void) { DDRB = _BV(PB0) | _BV(PB3) | _BV(PB5); // setze SCK,MOSI,PB0 (SS) als Ausgang DDRB &= ~_BV(PB4); // setze MISO als Eingang PORTB = _BV(PB5) | _BV(PB0); // SCK und PB0 high (ist mit SS am Slave verbunden) SPCR = _BV(SPE) | _BV(MSTR) | _BV(SPR0); //Aktivierung des SPI, Master, Taktrate fck/16 status = SPSR; //Status löschen } void master_transmit (unsigned char data) { PORTB &= ~_BV(PB0); //SS am Slave Low --> Beginn der Übertragung SPDR = data; //Schreiben der Daten while (!(SPSR & (1< Ende der Übertragung } int main (void) { DDRD = 0xFF; master_init (); timer1 (); sei (); for (;;); return 0; }