Uwaga, do lekcji nr.15 w książce "Mikrokontrolery AVR język C Podstawy programowania" wkradł się drobny ale czasem dający o sobie znać błąd. Polega on na tym, że w kodzie zabrakło podciągania wejścia MISO do VCC. Procesor wprawdzie sam sobie ustawia tę linię jako wejście podczas inicjalizacji sprzętowego modułu SPI, ale nie załącza podciągania licząc na to, że zrobił to projektant sprzętowo, dodając na linii MISO rezystor do VCC. Możemy jednak spokojnie włączyć to podciąganie programowo, co zwalnia nas z dodawania rezystora na zewnątrz. W kodzie źródłowym w pliku main.c i dalej w funkcji main() mamy inicjalizację pinów i modułu SPI, jednak bez podciągania MISO do VCC, jak niżej:
#define SCK PB7
#define MOSI PB5
#define CS PB4
DDRB |= (1<<CS)|(1<<MOSI)|(1<<SCK);
PORTB |= (1<<CS);
SPCR |= (1<<SPE)|(1<<MSTR);
|
Problem polega na tym, że brak tego podciągania powoduje, że czasem kod z przykładu działa a czasem niestety nie. Można go rozwiązać na dwa sposoby.
#define SCK PB7
#define MISO PB6 // definiujemy dodatkowy pin MISO
#define MOSI PB5
#define CS PB4
DDRB |= (1<<CS)|(1<<MOSI)|(1<<SCK);
PORTB |= (1<<CS);
PORTB |= (1<<MISO); // podciągamy wejcie MISO do VCC
SPCR |= (1<<SPE)|(1<<MSTR);
|