Proszę pomóżcie.
Master zapala lampkę i wysyła polecenie do slava by też zapalił lampkę, potem czeka parę sekund i gasi ją i wysyła do slava wiadomość by on też swoją gasił.
To chciałem zrobić ale efekt jest taki, że lampka po stronie slava mruga jak chce. Czasami posłucha mastera a czasami nie: (nie wiem gdzie jest błąd w kodzie, proszę rzućcie okiem:
master:
slave:
Master zapala lampkę i wysyła polecenie do slava by też zapalił lampkę, potem czeka parę sekund i gasi ją i wysyła do slava wiadomość by on też swoją gasił.
To chciałem zrobić ale efekt jest taki, że lampka po stronie slava mruga jak chce. Czasami posłucha mastera a czasami nie: (nie wiem gdzie jest błąd w kodzie, proszę rzućcie okiem:
master:
void SPI_master_init()
{
PORTB|=_BV(PB2);//wlaczenie lini ss na stan wysoki
DDRB|=(_BV(PB2) | _BV(PB3) | _BV(PB5)); //Piny SS, MOSI, SCK jako wyjście
SPCR=_BV(SPE) | _BV(MSTR); //Tryb master, CLK/4
SPSR;
SPDR; //Skasuj flagę SPIF
}
uint8_t SPI_send_byte(uint8_t byte)
{
SPDR=byte;
while(!(SPSR & _BV(SPIF)));
}
int main()
{
_delay_ms(100);
uint8_t i;
SPI_master_init();
while(1)
{
DDRB|=_BV(DDB7);
PORTB&=~(_BV(PB2));//stan niski na lini ss slava
i=(uint8_t)1;
SPI_send_byte(i);
PORTB|=_BV(PB2);//stan wysoki na lini ss slava
PORTB|=_BV(PORTB7);
_delay_ms(1000);
PORTB&=~(_BV(PB2));//stan niski na lini ss slava
i=(uint8_t)0;
SPI_send_byte(i);
PORTB|=_BV(PB2);//stan wysoki na lini ss slava
PORTB&=~_BV(PORTB7);
_delay_ms(1000);
}
} slave:
ISR(SPI_STC_vect)
{
const uint8_t s=(uint8_t)1;
const uint8_t n=(uint8_t)0;
if(SPDR==s)
{
PORTB|=_BV(PORTB0);
}
else if(SPDR==n)
{
PORTB&=~_BV(PORTB0);
}
}
void SPI_slave_init()
{
DDRB|=_BV(PB6); //Pin MISO jako wyjście
SPCR=_BV(SPE) | _BV(SPIE); //Tryb master, CLK/4, przerwania
SPSR;
SPDR; //Skasuj flagę SPIF
}
int main()
{
DDRB|=_BV(DDB0);
SPI_slave_init();
sei();
while(1);
}