Помагите пожалуйста разобраться, где то есть ошибка!!! В работе UART Mega 2561. Пересылаю 2 байта (передатчик отправляет, приемник получает все ок!) но второй раз, по истечению времени, передача не идет причем пошагово (AVR Studio) все как бы работает
; инициализция переменных
.def ST1 = r24 ; Флаги передатчика приемника(нулевого №0):
.equ ST1_PAC_OK = 0 ; Флаг прием пакета ок
.equ ST1_STABLE = 1 ; Флаг устойчивого соединения по ( ... )
.equ ST1_RXD_ERR = 2 ; Флаг ошибки приема пакета
.equ ST1_TXD_ERR = 3 ; Флаг ошибка передачи пакета
.equ ST1_RXD = 4 ; Флаг окончания приема данных
.equ ST1_RXD_OK = 5 ; Флаг приема блока ОК
.equ ST1_TXD = 6 ; Флаг окончания передачи данных
.equ ST1_TXD_OK = 7 ; Флаг передачи блока ОК
.def TMP_X = r16 ; буфер задержеки
.def TMP_Y = r17 ; буфер при запуске конфигураций
.def TMP_D = r18 ; буфер коротких процессов (прерыв) если нехват то как ТМР_4
.def TMP_1 = r19 ; буфер данных не пересекается с конфигурацией
.def TMP_2 = r20 ; буфер данных не пересекается с конфигурацией
.def TMP_3 = r21 ; буфер данных не пересекается с конфигурацией
;------------------------------------------------------------------------------------
; инициализация UART
ldi TMP_Y,0xA0 ; загружаем во временный регистр младший байт
sts UBRR1L, TMP_Y
ldi TMP_Y,0x01 ; загружаем во временный регистр старший байт
sts UBRR1H,TMP_Y
ldi TMP_Y,0x00
sts UCSR1A,TMP_Y
ldi TMP_Y,0x88 ;(1<<RXEN1)|(0<<RXCIE1)|(1<<TXEN1)|(0<<TXCIE1)
sts UCSR1B,TMP_Y
ldi TMP_Y,0x86 ;(1<<UMSEL11)|(1<<UCSZ11)|(1<<UCSZ10)
sts UCSR1C,TMP_Y
sbr ST1,S_BIT4 ; прием ЗАПРЕЩЕН изначально
;...........................
main:
rcall REREDACHA
rcall OUT_DATA
rcall AUDIT_IN_DATA
rcall AUDIT_ANSWER
rjmp main
;------------------------------------------------------------
REREDACHA:
sbrs ST1, ST1_RXD
rjmp EXIT_REREDACHA
rjmp COMANDA_TXD ; п/п подготовки данных для передачи в ней шифруем данные кодом Мончестера и устанавливаем sbr ST1,S_BIT6
EXIT_REREDACHA:
ret
;-------------------------------------------------------------
//*************************************************************************************
// Передача данных
//*************************************************************************************
OUT_DATA:
sbrs ST1,ST1_TXD ; проверка оканчания передачи
rjmp EXIT_OUT_DATA
//---------ПРОВЕРКА БЫЛ ЛИ ЗАПУСК ВРЕМЕНИ----------------------------------------------
lds TMP_1,TimeTXD
cli
cpi TMP_1,ZERO
brne DELAY_TXD
sei
rjmp REREDACHA_KOL
//---------ПРОВЕРКА ВРЕМЕНИ ПЕРЕДАЧИ---------------------------------------------------
DELAY_TXD:
DELAY TimeTXD_L, TimeTXD_M, TimeTXD_H,TimeTXD
lds TMP_1,TimeTXD
cli
cpi TMP_1,ZERO
breq ERROR_TXD
sei
rjmp REREDACHA_KOL
//-------------ОБРАБОТКА ОШИБКИ ПЕРЕДАЧИ - ВРЕМЯ НА ПЕРЕДАЧУ ЗАКОНЧИЛОСЬ------------
ERROR_TXD: //???????????????
sei
rjmp EXIT_OUT_DATA
//----------ПРОВЕРКА КОЛИЧЕСТВА ПЕРЕДАЧ----------------------------------------------
REREDACHA_KOL:
lds TMP_1,CountTXD
cli
cpi TMP_1,KOL_TXD
brlo START_TXD_
sei
rjmp REREDACHA_KOL_OK
START_TXD_:
rjmp START_TXD
//----------ПЕРЕДАЧА ОКОНЧЕНА----------------------------------------------------
REREDACHA_KOL_OK:
/*//--------------------------------------------------------------------------------
in TMP_Y,PORTD ;порт
clt
bld TMP_Y,1
out PORTD,TMP_Y*/
//--------------------------------------------------------------------------------
//--------РАЗРЕШАЕМ ПРИЕМ-----------------------------------------------------
cli
ldi TMP_Y,0x90 ;(1<<RXEN1)|(1<<RXCIE1)|(0<<TXEN1)|(0<<TXCIE1)
sts UCSR1B,TMP_Y
sei
//-----------------------------------------
cbr ST1,S_BIT4
cbr ST1,S_BIT6
//--------ЗАПУСКАЕМ ВРЕМЯ ДЛЯ ОЖИДАНИЯ ПОВТОРНОЙ ПЕРЕДАЧИ---------------------------------------
NUMBER_ZERO TimeANSWER_L, TimeANSWER_M, TimeANSWER_H
MACROS_NUMBER T_N_ANSWER_L,T_N_ANSWER_M,T_N_ANSWER_H,TimeANSWER
TRANSVER_NUMBER TimeANSWER_L, TimeANSWER_M, TimeANSWER_H
rjmp EXIT_OUT_DATA
//---------------НАЧАЛО ПЕРЕДАЧИ--------------------------------------------------
START_TXD:
sei
NUMBER_ZERO TimeTXD_L,TimeTXD_M,TimeTXD_H
MACROS_NUMBER T_N_TXD_L,T_N_TXD_M,T_N_TXD_H,TimeTXD
TRANSVER_NUMBER TimeTXD_L,TimeTXD_M,TimeTXD_H
//--------------ПЕРЕДАЧА ДАННЫХ----------------------------------------------------
UART_SNT:
sei
//------------ЗАДЕРЖКА ВРЕМЕНИ НА ПЕРЕДАЧУ-----------------------------------------
lds TMP_1,Time10ms
cli
cpi TMP_1,ZERO
brne DELAY_10_
sei
rjmp UART_OUT_
DELAY_10_:
sei
DELAY Time10ms_L, Time10ms_M, Time10ms_H,Time10ms
rjmp EXIT_OUT_DATA
UART_OUT_:
rcall GO_10msec_
lds TMP_3, CountBateTXD
cli
cpi TMP_3,ZERO
breq ADR_5
cpi TMP_3,1
breq ADR_6
cpi TMP_3,2
breq ADR_7
cpi TMP_3,4
breq ADR_8
sei
clr TMP_3
sts CountBateTXD, TMP_3
rjmp EXIT_OUT_DATA
//---------------------------------------------------------------------------------
ADR_5:
sei
ldi ZH,high(ADR_5_TXD) ; загрузка адреса
ldi ZL,low(ADR_5_TXD) ; загружаем адрес
ld TMP_2,Z ; увеличиваем значение адр на 1
rjmp UART_OUT
ADR_6:
sei
ldi ZH,high(ADR_6_TXD) ; загрузка адреса
ldi ZL,low(ADR_6_TXD) ; загружаем адрес
ld TMP_2,Z ; увеличиваем значение адр на 1
rjmp UART_OUT
ADR_7:
sei
ldi ZH,high(ADR_7_TXD) ; загрузка адреса
ldi ZL,low(ADR_7_TXD) ; загружаем адрес
ld TMP_2,Z ; увеличиваем значение адр на 1
rjmp UART_OUT
ADR_8:
sei
ldi ZH,high(ADR_8_TXD) ; загрузка адреса
ldi ZL,low(ADR_8_TXD) ; загружаем адрес
ld TMP_2,Z ; увеличиваем значение адр на 1
rjmp UART_OUT
//---------------------------------------------------------------------------------
UART_OUT:
lds TMP_1,UCSR1A
sbrs TMP_1,N_BIT5 ; UDRE1
rjmp UART_OUT
sts UDR1,TMP_2 ;
lds TMP_3, CountBateTXD
inc TMP_3 ; разрешаем передачу следующего байта
sts CountBateTXD,TMP_3 ; сохранем содержимое регистра в переменной
lds TMP_3, CountTXD
inc TMP_3 ; разрешаем передачу следующего байта
sts CountTXD,TMP_3 ; сохранем содержимое регистра в переменной
rjmp EXIT_OUT_DATA
//---------------------------------------------------------------------------------
GO_10msec_:
NUMBER_ZERO Time10ms_L, Time10ms_M, Time10ms_H
MACROS_NUMBER T_N_10ms_L,T_N_10ms_M,T_N_10ms_H,Time10ms
TRANSVER_NUMBER Time10ms_L, Time10ms_M, Time10ms_H
ret
//---------ВЫХОД-----------------------------------------------------------------------
EXIT_OUT_DATA:
ret
Первая передача проходт все ок
Допустим что от ответной части не пришла команда, а время ожидания на ответ истекло
//*******************************************************************************
// п/п ПРОВЕРКА ВРЕМИНИ НА ОТВЕТ
//*******************************************************************************
AUDIT_ANSWER:
//-------ПРОВЕРКА РАЗРЕШЕН ПРИЕМ-----------------------------------------
sbrc ST1,ST1_RXD
rjmp EXIT_AUDIT_ANSWER
//-------ПРОВЕРКА ОКОНЧАНИ ВРЕМЕНИ ДОПУЩЕННОГО НА ОТВЕТ------------------
DELAY TimeANSWER_L, TimeANSWER_M, TimeANSWER_H,TimeANSWER
lds TMP_1,TimeANSWER
cli
cpi TMP_1,ZERO
brne EXIT_AUDIT_ANSWER
sei
//-------Время ИСТЕКЛО------------------------------------------------------
sbr ST1,S_BIT4 ; прием ЗАПРЕЩЕН
//--------------РАЗРЕШЕНИЕ ПЕРЕДАЧИ---------------------------------------------------
;!!!! Вот тут на асцилографе нет передачи но уровень ТХD устанавиливаеться в 1
cli
ldi TMP_Y,0x88 ;(1<<RXEN1)|(0<<RXCIE1)|(1<<TXEN1)|(0<<TXCIE1)
sts UCSR1B,TMP_Y
sei
//------------------------------------------------------------------------------------
clr TMP_1
sts CountTXD,TMP_1
sts TimeTXD,TMP_1
sts ComandaOldTXD,TMP_1
sts CountBateTXD,TMP_1
//-------ВЫХОД-----------------------------------------------------------
EXIT_AUDIT_ANSWER:
sei
ret