Пн мар 18, 2019 09:41:42
Пн мар 18, 2019 10:35:33
Пн мар 18, 2019 21:56:51
;проект 1
;
;настройка SPI , МК настроим в режим Slave
;
;
;многократный прием байта по SPI от МК(Master) к нашему МК(Slave). оба атмега8
;режим работы SPI 0
;скорость работы fclk/128
;
;
;
;два мк атмега8 соединены шинами для SPI обмена. (MOSI к MOSI, MISO к MISO, SS к SS, SCK к SCK)
;на порты D обоих посажены светодиоды через резисторы, что бы потом видеть, что байты передались
;вначале программы передаем с обоих мк одно и тоже число друг другу 0b00000001 и смотрим в протеусе горят нужные светодиоды
;на портах D обоих мк.
;в прерывании SPI после того как считаем полученое число из регистра данных SPDR (переданное от другого МК)и запишем его в порт D мы организовываем логический сдвиг
;нашей 1 влево и записываем его обратно на передачу в регистра данных SPDR
;
;по факту при запуске программы 1 раз загорается 0 пин регистра Д и дальше при обмене по SPI по очереди огонек бежит от пина 1 по пин 7 , нулевой пин больше не загорается
;
;;****************************************************************************************
.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, 0b00000001 ; запишем число в регистр данных SPDR для отправки мастеру, чтоб видеть что передача произошла
out SPDR, r16
sei ;разрешаем прерывания
;***********************************************************************************************
MAIN:
rjmp MAIN
;**********************************************************************************************
SPI_STC:
in r16, SPDR ; читаем регистр данных SPDR и пишем прочтеное в r16
out PORTD, r16 ; пишем число из регистра r16 в свой в PORTD
in r17, pinD ; читаем pinD и пишем прочтеное в r17 ( число полученое от ведомого МК)
sbrc r17, 7 ; если этот бит очищен, пропускает следующую команду ( проверяем не дошла ли еденица до 7 пина нашего бегущего огонька)
ldi r17, 0b00000001 ; раз в 7 пине регистра r17 стоит единица, то пора регистр выставить в первоначальную позицию записав в него 0b00000001
lsl r17 ; сдвиг влево ( смещаем нашу еденицу на 1 бит влево ( например было 0b00000001 стало 0b00000010 )
out SPDR, r17 ; запишем число в регистр данных SPDR и передача байта по SPI автоматически началась
reti
;проект 1
;
;
;настройка SPI , МК настроим в режим Master
;
;
;многократный прием байта по SPI от МК(Master) к нашему МК(Slave). оба атмега8
;режим работы SPI 0
;скорость работы fclk/128
;
;
;
;два мк атмега8 соединены шинами для SPI обмена. (MOSI к MOSI, MISO к MISO, SS к SS, SCK к SCK)
;на порты D обоих посажены светодиоды через резисторы, что бы потом видеть, что байты передались
;вначале программы передаем с обоих мк одно и тоже число друг другу 0b00000001 и смотрим в протеусе горят нужные светодиоды
;на портах D обоих мк.
;в прерывании SPI после того как считаем полученое число из регистра данных SPDR (переданное от другого МК)и запишем его в порт D мы организовываем логический сдвиг
;нашей 1 влево и записываем его обратно на передачу в регистра данных SPDR
;
;по факту при запуске программы 1 раз загорается 0 пин регистра Д и дальше при обмене по SPI по очереди огонек бежит от пина 1 по пин 7 , нулевой пин больше не загорается
;
;
;****************************************************************************************
.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<<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, 0b00000001
out SPDR, r16 ; запишем число в регистр данных SPDR и передача байта по SPI автоматически началась
sei ;разрешаем прерывания
;***********************************************************************************************
MAIN:
rjmp MAIN
;***********************************************************************************************
SPI_STC:
in r16, SPDR ; читаем регистр данных SPDR и пишем прочтеное в r16
out PORTD, r16 ; пишем число из регистра r16 в свой в PORTD
in r17, pinD ; читаем pinD и пишем прочтеное в r17 ( число полученое от ведомого МК)
sbrc r17, 7 ; если этот бит очищен, пропускает следующую команду ( проверяем не дошла ли еденица до 7 пина нашего бегущего огонька)
ldi r17, 0b00000001 ; раз в 7 пине регистра r17 стоит единица, то пора регистр выставить в первоначальную позицию записав в него 0b00000001
lsl r17 ; сдвиг влево ( смещаем нашу еденицу на 1 бит влево ( например было 0b00000001 стало 0b00000010 )
out SPDR, r17 ; запишем число в регистр данных SPDR и передача байта по SPI автоматически началась
reti
Вт мар 19, 2019 04:57:08
Вт мар 19, 2019 05:36:46
CLC
sbrc r17, 7 ; если этот бит очищен, пропускает следующую команду ( проверяем не дошла ли еденица до 7 пина нашего бегущего огонька)
SEC
ROL R17
; ldi r17, 0b00000001 ; раз в 7 пине регистра r17 стоит единица, то пора регистр выставить в первоначальную позицию записав в ;него 0b00000001
; lsl r17 ; сдвиг влево ( смещаем нашу еденицу на 1 бит влево ( например было 0b00000001 стало 0b00000010
out SPDR, r17 ; запишем число в регистр данных SPDR и передача байта по SPI автоматически началась
Ср мар 20, 2019 22:27:16
Чт мар 21, 2019 00:22:44
Чт мар 21, 2019 06:58:45
вроде, самое большое количество личностей внутри одного человека психиатрия зафиксировала то ли 40, то ли около того... так шта есть еще куда двигатьсяbafomet911 писал(а):Ещё одна "нашенская" аватарка
Чт мар 21, 2019 12:45:59
А под спойлер взять исходники не ку?sergo80zxc писал(а):вот исправленные исходники)