фото симуляции
светодиоды в симуляции типа индикаторы.
прошивка мастера
Спойлер
Код: Выделить всё
;шаблон для атмега8
;
;настройка SPI , МК настроим в режим Master
;
;
;однократная передача байта по SPI от нашего МК(Master) к ведомому МК(Slave). оба атмега8
;режим работы SPI 0
;скорость работы fclk/128
;
;пин РВ2(SS) нашего МК подключен к транзистору, а транзистор подключен к пину РВ2(SS) инверсно. (смысл решения таков,если наш пин РВ2 выставить в 1, то пин РВ2 ведомого МК сбросится в 0)
;
;
;
;
;
;
;
;;****************************************************************************************
.cseg
.include "m8Adef.inc"
;
;;***********************************************************************
.org $000 rjmp RESET ;Reset Handler
;.org $001 reti ;rjmp EXT_INT0 ; IRQ0 Handler
;.org $002 reti ;rjmp EXT_INT1 ; IRQ1 Handler
;.org $003 reti ;rjmp TIM2_COMP ; Timer2 Compare Handler
;.org $004 reti ;rjmp TIM2_OVF ; Timer2 Overflow Handler
;.org $005 reti ;rjmp TIM1_CAPT ; Timer1 Capture Handler
;.org $006 reti ;rjmp TIM1_COMPA ; Timer1 CompareA Handler
;.org $007 reti ;rjmp TIM1_COMPB ; Timer1 CompareB Handler
;.org $008 reti ;rjmp TIM1_OVF ; Timer1 Overflow Handler
;.org $009 reti ;rjmp TIM0_OVF ; Timer0 Overflow Handler
.org $00a rjmp SPI_STC ; SPI Transfer Complete Handler
;.org $00b reti ;rjmp USART_RXC ; USART RX Complete Handler
;.org $00c reti ;rjmp USART_UDRE ; UDR Empty Handler
;.org $00d reti ;rjmp USART_TXC ; USART TX Complete Handler
;.org $00e reti ;rjmp ADC ; ADC Conversion Complete Handler
;.org $00f reti ;rjmp EE_RDY ; EEPROM Ready Handler
;.org $010 reti ;rjmp ANA_COMP ; Analog Comparator Handler
;.org $011 reti ;rjmp TWSI ; Two-wire Serial Interface Handler
;.org $012 reti ;rjmp SPM_RDY ; Store Program Memory Ready Handler
;***********************************************************************
RESET:
cli ;запретить все прерывания
ldi r16, low(RAMEND) ;загрузка указателя стека
out SPL, r16
ldi r16, high(RAMEND) ;загрузка указателя стека
out SPH, r16
ldi r16, 0b11111111 ; порт D на выход
out DDRD, r16
sbi PortB,2 ; устоновим в 1 бит РВ2(SS) заблокируем передачу данных ведомого МК высоким уровнем сигнала
nop
nop
nop
nop
nop
nop
nop
nop
nop
ldi r17, (1<<PB3)|(1<<PB5)|(1<<PB2)
out DDRB, r17 ; биты РВ3(MOSI), РВ5(SCK), РВ2(SS) настроим на выход (Для ведущего настроить MOSI, SCK, SS на выход, MISO на вход)
ldi r16, (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0)|(1<<SPIE) ; выставим бит номер 6(SPE) в 1, включим модуль SPI, выставим бит номер 4(MSTR) в 1 настроим наш МК в режим Master. бит SPIE разрешает прерывание по SPI
out SPCR, r16 ; биты номер 3(CPOL) и 2(СPHA) сброшены в 0, настроен режим работы 0 по умолчанию
; бит номер 5(DORD) сброшен в 0 по умолчанию, поэтому первым в передаче данных передается 7-ой старший бит
; бит (SPI2X) регистра SPSR по умолчанию сброшен в 0, биты 1(SPR1) , 0(SPR0) регистра SPCR выставим в 1 и работает режим скорости fclk/128
cbi PortB,2 ; сбросим в 0 бит РВ2(SS) активизируем ведомый МК низким уровнем сигнала на передачу данных
; .
ldi r16, 0b10000111 ; запишем число в регистр данных SPDR и передача байта по SPI автоматически началась
out SPDR, r16
sei ;разрешаем прерывания
;***********************************************************************************************
MAIN:
rjmp MAIN
;***********************************************************************************************
SPI_STC:
sbi PortB,2 ; устоновим в 1 бит РВ2(SS) заблокируем передачу данных ведомого МК высоким уровнем сигнала
nop
nop
nop
nop
nop
in r16, SPDR ; читаем регистр данных SPDR
out PORTD, r16 ; пишем число из регистра SPDR в PORTD
nop
nop
nop
reti
Код: Выделить всё
;шаблон для атмега8
;
;настройка SPI , МК настроим в режим Slave
;
;
;однократный прием байта по SPI от МК(Master) к нашему МК(Slave). оба атмега8
;режим работы SPI 0
;скорость работы fclk/128
;
;пин РВ2(SS) нашего МК подключен к транзистору, а транзистор подключен к пину РВ2(SS) инверсно. (смысл решения таков,если наш пин РВ2 выставить в 1, то пин РВ2 ведомого МК сбросится в 0)
;
;
;
;
;
;
;
;;****************************************************************************************
.cseg
.include "m8Adef.inc"
;
;;***********************************************************************
.org $000 rjmp RESET ;Reset Handler
;.org $001 reti ;rjmp EXT_INT0 ; IRQ0 Handler
;.org $002 reti ;rjmp EXT_INT1 ; IRQ1 Handler
;.org $003 reti ;rjmp TIM2_COMP ; Timer2 Compare Handler
;.org $004 reti ;rjmp TIM2_OVF ; Timer2 Overflow Handler
;.org $005 reti ;rjmp TIM1_CAPT ; Timer1 Capture Handler
;.org $006 reti ;rjmp TIM1_COMPA ; Timer1 CompareA Handler
;.org $007 reti ;rjmp TIM1_COMPB ; Timer1 CompareB Handler
;.org $008 reti ;rjmp TIM1_OVF ; Timer1 Overflow Handler
;.org $009 reti ;rjmp TIM0_OVF ; Timer0 Overflow Handler
.org $00a rjmp SPI_STC ; SPI Transfer Complete Handler
;.org $00b reti ;rjmp USART_RXC ; USART RX Complete Handler
;.org $00c reti ;rjmp USART_UDRE ; UDR Empty Handler
;.org $00d reti ;rjmp USART_TXC ; USART TX Complete Handler
;.org $00e reti ;rjmp ADC ; ADC Conversion Complete Handler
;.org $00f reti ;rjmp EE_RDY ; EEPROM Ready Handler
;.org $010 reti ;rjmp ANA_COMP ; Analog Comparator Handler
;.org $011 reti ;rjmp TWSI ; Two-wire Serial Interface Handler
;.org $012 reti ;rjmp SPM_RDY ; Store Program Memory Ready Handler
;***********************************************************************
RESET:
cli ;запретить все прерывания
ldi r16, low(RAMEND) ;загрузка указателя стека
out SPL, r16
ldi r16, high(RAMEND) ;загрузка указателя стека
out SPH, r16
ldi r16, 0b11111111 ;порт D на выход целиком
out DDRD, r16
ldi r17, (1<<PB4) ;
out DDRB, r17 ; бит PB4(MISO) устанавливаем в 1, у ведомого МК (MISO) ставится на выход а (MOSI), (SS), (SCK) на вход
ldi r16, (1<<SPE)|(1<<SPR1)|(1<<SPR0)|(1<<SPIE) ; выставим бит номер 6(SPE) в 1, включим модуль SPI, бит номер 4(MSTR) сброшен в 0, наш МК в режим (Slave). разрешим прерывание битом (SPIE)
out SPCR, r16 ; биты номер 3(CPOL) и 2(СPHA) сброшены в 0, настроен режим работы 0 по умолчанию
; бит номер 5(DORD) сброшен в 0 по умолчанию, поэтому первым в передаче данных передается 7-ой старший бит
; бит (SPI2X) регистра SPSR по умолчанию сброшен в 0, биты (SPR1) , (SPR0) регистра SPCR выставим в 1 и работает режим скорости fclk/128
ldi r16, 0b10000111 ; запишем число в регистр данных SPDR для отправки мастеру, чтоб видеть что передача произошла
out SPDR, r16
sei ;разрешаем прерывания
;***********************************************************************************************
MAIN:
rjmp MAIN
;**********************************************************************************************
SPI_STC:
ldi r16, SPDR ;читаем регистр данных SPDR модуля SPI
out PORTD, r16 ;пересылаем эти данные в порт D
reti


