MEGA8 - ведущий проц и есть несколько ведомых MEGA8515
Проблема в том что нет фильтрации пакетов (по документации все не адресные пакеты игнорируються если установлен бит MPCM в регистре UCSRA). В действительности идет прерывание на ВСЕХ пакетах.
Может я что то не так установил в настройках?
Привоже свои программы:
Часть программы для Меги8
;************* инициализация и настройка USART *********************
USART_init:
; UCSRA
ldi temp,0b00000000 ; бит название значение пояснения
; 7 завершение приема
; 6 завершение передачи
; 5 опустошение регистра данных
; 4 ошибка кадрирования
; 3 переполнение
; 2 ошибка контроля четности
; 1 удвоение скорости обмена
; 0 режим мультипроцессорного обмена
;
out UCSRA,temp
; UCSRB
ldi temp,0b00001100 ; бит название значение пояснения
; 7 разрешение прерывания по завершению приема
; 6 разрешение прерывания по завершению передачи
; 5 разрешение прерывания при очистке регистра данных
; 4 разрешение приема
; 3 разрешение передачи
; 2 UCSZ2 формат посылок
; 1 8 разряд принимаемых данных
; 0 8 разряд передаваемых данных
out UCSRB,temp
; UCSRC
ldi temp,0b10000110 ; бит название значение пояснения
; 7 выбор регистра UCSRC or UBRRH
; 6 режим работы USART 0-асинхронный режим
; 5 UPM1 режим работы контроля и формирования четности
; 4 UPM0 -//-
; 3 кол-во стоп битов 0-одит стоп бит
; 2 UCSZ1 формат посылки
; 1 UCSZ0 -//-
; 0 полярность тактового сигнала в асинхронним режиме всегда0
out UCSRC,temp
;******************************************ОПРЕДЕЛ ЯЕТ СКОРОСТЬ ПЕРЕДАЧИ******************
; UBRRH
ldi temp,0b00000000
out UBRRH,temp
; UBRRL
ldi temp,9
out UBRRL,temp
ret
; часть кода передающая пакет данных состояший из адреса и 8 байт данных
ldi Adress_Data,1
ldi DATA,1 ; передаем данные 1 плате
rcall USART_Transmit
;**************************************
ldi Adress_Data,0 ; дальше передаем данные
;**************************************
ldi r28,low(Skorost) ;
ldi r29,high(Skorost) ;
ld DATA,Y ; загрузили значение скорости и отправили по USART
rcall USART_Transmit
************************************************
;********************Передача одного байта данных с учетом 9 бита (Адрес или данные)
USART_Transmit: ; DATA - хранит пересылаемые данные
; Adress_Data- ханит инфу о том пересылаеться адресс или дата
;ждать очистки буфера передатчика
sbis UCSRA,UDRE
rjmp USART_Transmit
;скопировать 9-й разряд данных из r17 в TXB8
cbi UCSRB,TXB8
sbrc Adress_Data,0
sbi UCSRB,TXB8
;загрузить младший байт данных в буфер, начать передачу
out UDR,DATA
ret
И КОД ПРИЕМНИКА - - - -
;************* инициализация и настройка USART *********************
USART_init:
; UCSRA работаем в режиме мульпроцессорного обмена
; кадры не сожержащие адресс фильтруються
ldi temp,0b00000001 ; бит название значение пояснения
; 7 завершение приема
; 6 завершение передачи
; 5 опустошение регистра данных
; 4 ошибка кадрирования
; 3 переполнение
; 2 ошибка контроля четности
; 1 удвоение скорости обмена
; 0 режим мультипроцессорного обмена
;
out UCSRA,temp
; UCSRB
ldi temp,0b10010100 ; бит название значение пояснения
; 7 разрешение прерывания по завершению приема
; 6 разрешение прерывания по завершению передачи
; 5 разрешение прерывания при очистке регистра данных
; 4 разрешение приема
; 3 разрешение передачи
; 2 UCSZ2 формат посылок
; 1 8 разряд принимаемых данных
; 0 8 разряд передаваемых данных
out UCSRB,temp
; UCSRC
ldi temp,0b10000110 ; бит название значение пояснения
; 7 выбор регистра UCSRC or UBRRH
; 6 режим работы USART 0-асинхронный режим
; 5 UPM1 режим работы контроля и формирования четности
; 4 UPM0 -//-
; 3 кол-во стоп битов 0-одит стоп бит
; 2 UCSZ1 формат посылки
; 1 UCSZ0 -//-
; 0 полярность тактового сигнала в асинхронним режиме всегда0
out UCSRC,temp
;******************************************ОПРЕДЕЛ ЯЕТ СКОРОСТЬ ПЕРЕДАЧИ******************
; UBRRH
ldi temp,0b00000000
out UBRRH,temp
; UBRRL
ldi temp,4
out UBRRL,temp
ret
;******************Подпрограмма обработки события - получение байта по шине USART***************************
USART_TX:
ldi data,0b10101010
out PORTB,data
; прочитать 9-й разряд данных и флаги состояния
in UCSRAm,UCSRA
in UCSRBm,UCSRB
;прочитать младший байт данных
in data,UDR
out PORTC,data
e:rjmp e
; в случае ошибки вернуть -1
andi UCSRAm,(1‹‹FE)|(1‹‹DOR)|(1‹‹UPE)
breq no_error
USART_Receive_ret:
ldi UCSRBm,HIGH(-1)
ldi UCSRAm,LOW(-1)
reti
no_error:
; выделить 9-й разряд данных
lsr UCSRBm
lsr UCSRBm ; 9 бит данных в флаге С
cpi data,1 ; АДРЕССССС ПЛАТЫ
breq adressPrav
reti
adressPrav:
ldi temp,0b00000000 ; отключаю режим фильтрации пакетов
out UCSRA,temp
rcall USART_Receive
ldi r28,low(Skorost) ; загрузить младший байт регистра Z
ldi r29,high(Skorost) ; загрузить старший байт
st Y,data ; сохранили константу в ОЗУ
rcall USART_Receive
ldi r28,low(uprSHIM1) ; загрузить младший байт регистра Z
ldi r29,high(uprSHIM1) ; загрузить старший байт
st Y,data ; сохранили константу в ОЗУ
rcall USART_Receive
ldi r28,low(uprSHIM2) ; загрузить младший байт регистра Z
ldi r29,high(uprSHIM2) ; загрузить старший байт
st Y,data ; сохранили константу в ОЗУ
rcall USART_Receive
ldi r28,low(uprSHIM3) ; загрузить младший байт регистра Z
ldi r29,high(uprSHIM3) ; загрузить старший байт
st Y,data ; сохранили константу в ОЗУ
rcall USART_Receive
ldi r28,low(uprSHIM4) ; загрузить младший байт регистра Z
ldi r29,high(uprSHIM4) ; загрузить старший байт
st Y,data ; сохранили константу в ОЗУ
rcall USART_Receive
ldi r28,low(uprSHIM5) ; загрузить младший байт регистра Z
ldi r29,high(uprSHIM5) ; загрузить старший байт
st Y,data ; сохранили константу в ОЗУ
rcall USART_Receive
ldi r28,low(uprSHIM6) ; загрузить младший байт регистра Z
ldi r29,high(uprSHIM6) ; загрузить старший байт
st Y,data ; сохранили константу в ОЗУ
rcall USART_Receive
ldi r28,low(uprSHIM7) ; загрузить младший байт регистра Z
ldi r29,high(uprSHIM7) ; загрузить старший байт
st Y,data ; сохранили константу в ОЗУ
rcall USART_Receive
ldi r28,low(uprSHIM
; загрузить младший байт регистра Z
ldi r29,high(uprSHIM
; загрузить старший байт
st Y,data ; сохранили константу в ОЗУ
ldi temp,0b00000001 ; включаю режим фильтрации пакетов
out UCSRA,temp
reti
;************************************************* ************************************************** ********
USART_Receive:
ldi data,0b10101010
out PORTC,data
; ждать загрузки данных в буфер приемника
sbis UCSRA,RXC
rjmp USART_Receive
; прочитать 9-й разряд данных и флаги состояния
in UCSRAm,UCSRA
in UCSRBm,UCSRB
;прочитать младший байт данных
in data,UDR
out PORTC,data
; в случае ошибки вернуть -1
andi UCSRAm,(1‹‹FE)|(1‹‹DOR)|(1‹‹UPE)
breq no_error1
USART_Receive_reti:
ldi UCSRBm,HIGH(-1)
ldi UCSRAm,LOW(-1)
reti
no_error1:
; выделить 9-й разряд данных
lsr UCSRBm
lsr UCSRBm ; 9 бит данных в флаге С
ret