ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
24 ноября
162271
nppELm (28.07.2009 08:05, просмотров: 534)
Помагите пожалуйста разобраться, где то есть ошибка!!! В работе 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