Возникла следующая проблема. При передачи данных по UART на выходе TX (PORTB.7) наблюдаю все время высокий уровень вне зависимости от передаваемых данных. Уже второй день не удается понять причину такого поведения МК.
Проверка схемы результатов не дала. Замыканий обнаружено не было. Выход UART идет только на внешний разъем. Дело скорее всего в программе.
Вот часть кода, которая отвечает за UART:
Код
;Focs = 4 МГц
#define br_1200 D'207'
#define br_2400 D'103'
#define br_9600 D'25'
#define br_10417 D'23'
#define br_19200 D'12'
;настройка UART
INIT_UART MACRO _br
BANKSEL PIE1
BCF PIE1,TXIE ;запрет прерывания от передатчика
BANKSEL SPBRGH ;установка скорости обмена согласно _br
MOVLW HIGH(_br) ; --//--
MOVWF SPBRGH ; --//--
BANKSEL SPBRG ; --//--
MOVLW LOW(_br) ; --//--
MOVWF SPBRG ; --//--
BANKSEL BAUDCTL
CLRF BAUDCTL
BANKSEL TXSTA
CLRF TXSTA;очистка регистра управления и статуса передатчика
MOVLW 0x04;асинхронный режим, 8 бит, высокоскоростной режим
BANKSEL RCSTA
CLRF RCSTA ;очистка регистра управления и статуса приемника
BSF RCSTA,SPEN;разрешение работы последовательного порта
ENDM
;отправка байта по UART
SEND_BYTE MACRO val
BANKSEL TXREG
MOVLW val ;помещение данных в WREG
MOVFW TXREG ;помещение данных в буфер передатчика
BANKSEL TXSTA
BSF TXSTA,TXEN;включение передатчика
BANKSEL TXSTA
BTFSS TXSTA,TRMT;проверка бита TRMT
GOTO $-1 ;ожидание установки TRMT в 1
BANKSEL TXSTA
BCF TXSTA,TXEN;выключение передатчика
ENDM
;настройка портов ввода/вывода
INIT_PORT
;все выходы используются как цифровые
BANKSEL ANSEL
CLRF ANSEL
CLRF ANSELH
;настройка Port B
;RB5 (In) - RxD (конфигурируется автоматически)
;RB7 (Out) - TxD (конфигурируется автоматически)
BANKSEL PORTB
CLRF PORTB
BANKSEL TRISB
MOVLW 0x70
MOVWF TRISB
RETURN
;настройка периферии микроконтроллера
INIT
;запрет всех прерываний
BANKSEL INTCON
CLRF INTCON
;настройка генератора (внешний кварц на 4 МГц)
BANKSEL OSCCON
MOVLW 0x08
MOVWF OSCCON
;настройка периферии
CALL INIT_PORT
INIT_UART br_2400
RETURN
;основная программа
MAIN:
CALL INIT
MAIN_CYCLE:
SEND_BYTE 0xAA
GOTO MAIN_CYCLE
END
#define br_1200 D'207'
#define br_2400 D'103'
#define br_9600 D'25'
#define br_10417 D'23'
#define br_19200 D'12'
;настройка UART
INIT_UART MACRO _br
BANKSEL PIE1
BCF PIE1,TXIE ;запрет прерывания от передатчика
BANKSEL SPBRGH ;установка скорости обмена согласно _br
MOVLW HIGH(_br) ; --//--
MOVWF SPBRGH ; --//--
BANKSEL SPBRG ; --//--
MOVLW LOW(_br) ; --//--
MOVWF SPBRG ; --//--
BANKSEL BAUDCTL
CLRF BAUDCTL
BANKSEL TXSTA
CLRF TXSTA;очистка регистра управления и статуса передатчика
MOVLW 0x04;асинхронный режим, 8 бит, высокоскоростной режим
BANKSEL RCSTA
CLRF RCSTA ;очистка регистра управления и статуса приемника
BSF RCSTA,SPEN;разрешение работы последовательного порта
ENDM
;отправка байта по UART
SEND_BYTE MACRO val
BANKSEL TXREG
MOVLW val ;помещение данных в WREG
MOVFW TXREG ;помещение данных в буфер передатчика
BANKSEL TXSTA
BSF TXSTA,TXEN;включение передатчика
BANKSEL TXSTA
BTFSS TXSTA,TRMT;проверка бита TRMT
GOTO $-1 ;ожидание установки TRMT в 1
BANKSEL TXSTA
BCF TXSTA,TXEN;выключение передатчика
ENDM
;настройка портов ввода/вывода
INIT_PORT
;все выходы используются как цифровые
BANKSEL ANSEL
CLRF ANSEL
CLRF ANSELH
;настройка Port B
;RB5 (In) - RxD (конфигурируется автоматически)
;RB7 (Out) - TxD (конфигурируется автоматически)
BANKSEL PORTB
CLRF PORTB
BANKSEL TRISB
MOVLW 0x70
MOVWF TRISB
RETURN
;настройка периферии микроконтроллера
INIT
;запрет всех прерываний
BANKSEL INTCON
CLRF INTCON
;настройка генератора (внешний кварц на 4 МГц)
BANKSEL OSCCON
MOVLW 0x08
MOVWF OSCCON
;настройка периферии
CALL INIT_PORT
INIT_UART br_2400
RETURN
;основная программа
MAIN:
CALL INIT
MAIN_CYCLE:
SEND_BYTE 0xAA
GOTO MAIN_CYCLE
END
Заранее спасибо за любую помощь.