Содержание кода программы первого МК (Master):
Код: Выделить всё
.include "8515def.inc"
rjmp RESET ; Переход к метке Reset
rjmp SPI_STC ; Переход к метке SPI_STC
reset:
ldi r16,(1<<PB4)+(1<<PB5)+(1<<PB7)
out ddrb,r16 ;mosi, SS и sck входы
ldi r16,255
out portd,r16 ;Подключаем выводы порта D к шине +5В через подтягивающие резисторы
out ddrc,r16 ;Порт С на вывод
ldi r16,(1<<spie)+(1<<spe)+(1<<mstr)
out spcr,r16 ;spi включен, spi прерывания, режим master
in r16,pind ;копируем данные
out spdr,r16 ;в регистр spdr SPI
ldi r16,high(RAMEND)
out SPH,r16 ; инициализация указателя стека в конце ОЗУ
ldi r16,low(RAMEND)
out SPL,r16
sei ;Разрешение прерываний
ldi r16,(1<<PB4); ss->1
out portb,r16
ldi r16,(1<<spie)+(1<<spe)+(1<<mstr)
out spcr,r16 ; режим master
main: ;Главная программа
inc r17
cpi r17,255
breq spi_transmit
rjmp main
SPI_STC:
in r16,spdr ; Копирование и вывод принятых данных
out portc,r16
reti
spi_transmit:
ldi r17,0
in r16,pind ;Копируем в регистр spdr состояние выводов порта D
out spdr,r16
ldi r16,(0<<PB4)
out portb,r16 ;ss pin->0
rjmp main
Код: Выделить всё
.include "8515def.inc"
rjmp RESET ; Переход к метке Reset
rjmp SPI_STC ; Переход к метке SPI_STC
reset:
ldi r16,(1<<pb6)
out ddrb,r16 ;miso выход
ldi r16,(1<<pb6)
out portb,r16 ;ss подключаем к шине +5 В
ldi r16,255
out portd,r16 ;порт D подключаем к шине +5 В
ldi r16,255
out ddrc,r16 ;Порт С на вывод
ldi r16,(1<<spie)+(1<<spe)
out spcr,r16 ;spi включен и прерывание spi
ldi r16,high(RAMEND)
out SPH,r16 ; Инициализация указателя стека в конце ОЗУ
ldi r16,low(RAMEND)
out SPL,r16
sei ; Разрешены прерывания
main:
rjmp main ; Главная программа
SPI_STC:
in r16,spdr ;читаем содержание регистра spdr
out portc,r16 ;и выводим его на индикацию
in R16,PIND ;читаем значение порта D
out spdr,r16 ;и копируем их в регистр spdr
ldi r16,(1<<spie)+(1<<spe)
out spcr,r16 ;spi включен и прерывание spi
reti

