Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: PIC16F690 и UART
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > PIC
Grigorij
Здравствуйте.

Возникла следующая проблема. При передачи данных по 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


Заранее спасибо за любую помощь.
dac
на вскидку, на асме давно не писал smile.gif несмотря на то, что тх - передатчик, для нормальной работы UART он должен быть настроен как ВХОД. (прочитайте внимательно даташит). если не поможет, будем смотреть дальше smile.gif
Ilya_A
Цитата
Дело скорее всего в программе.

Конечно, а в чем еще? (ну если только порт у контроллера не выгорел...)

У вас программа то вообще работает? Че-то не вижу "goto MAIN"

Непонятно зачем вы постоянно включаете/выключаете передатчик при каждой отправке байта? Включите его один раз в INIT_UART и не трогайте больше....

а в регистр TXREG вы байтик то не ложите:
Код
у вас:
MOVFW    TXREG;помещение данных в буфер передатчика

такой инструкции вообще несуществует wacko.gif , у вас как программа то компилируется? sad.gif

нужно написать так:
Код
MOVWF    TXREG;помещение данных в буфер передатчика


И вообще, я немного не догоняю, зачем процедура отправки байта написана через макрос? Ладно отправлять постоянные значения, а как вы будете отправлять динамически изменяющиеся? ИМХО нужно сделать через CALL и WREG
Grigorij
Цитата(Илья @ Mar 26 2008, 06:41) *
Конечно, а в чем еще? (ну если только порт у контроллера не выгорел...)

У вас программа то вообще работает? Че-то не вижу "goto MAIN"


Я привел не всю программу, а только ту часть, которая отвечает за uart

Цитата(Илья @ Mar 26 2008, 06:41) *
а в регистр TXREG вы байтик то не ложите:
Код
у вас:
MOVFW    TXREG;помещение данных в буфер передатчика

такой инструкции вообще несуществует wacko.gif , у вас как программа то компилируется? sad.gif


Вот похоже допущенная мною ошибка. Сам поражаюсь, почему у меня программа компилируется. Завтра обязательно попробую с MOVWF

Цитата(Илья @ Mar 26 2008, 06:41) *
И вообще, я немного не догоняю, зачем процедура отправки байта написана через макрос? Ладно отправлять постоянные значения, а как вы будете отправлять динамически изменяющиеся? ИМХО нужно сделать через CALL и WREG


Приведенная программа - это мой первый опыт написания программ на асемблере. Обязательно учту Ваши замечания.
dac
Цитата(Grigorij @ Mar 26 2008, 14:56) *
Вот похоже допущенная мною ошибка. Сам поражаюсь, почему у меня программа компилируется. Завтра обязательно попробую с MOVWF


компилируется потому что воспринимается как команда movf _регистр_,w
а порт как вход все равно настроить надо
Grigorij
Цитата(dac @ Mar 26 2008, 17:07) *
компилируется потому что воспринимается как команда movf _регистр_,w
а порт как вход все равно настроить надо


Завтро попробую и отпишу результаты.
Grigorij
В общем, ошибка была действительно в строке:

Код
MOVFW    TXREG;помещение данных в буфер передатчика


После ее исправления и настройки порта на вход, как говорил dac, все заработало. С учетом приведенных замечаний исходный код принял следующей вид (привед код относящийся только к eusart):

Код
;все выходы используются как цифровые
BANKSEL    ANSEL
CLRF    ANSEL
CLRF    ANSELH
    
;настройка Port B
;RB5 (In)    - RxD (дальше конфигурируется автоматически)
;RB7 (In)    - TxD (дальше конфигурируется автоматически)
BANKSEL    PORTB
CLRF    PORTB
BANKSEL    TRISB
MOVLW    0xF0
MOVWF    TRISB

;значение SPBRG для указанный скоростей обмена
;(при Fosc = 4 МГц, SYNC = 0, BRGH = 1, BRG16 = 1)
#define br_300    D'3332'
#define br_1200    D'832'
#define br_2400    D'416'
#define br_9600    D'103'
#define br_10417    D'95'
#define br_19200    D'51'

;отправка байта по UART (данные хранятся в WREG)
SEND_BYTE

    BANKSEL    TXREG
    MOVWF    TXREG    ;помещение данных в буфер передатчика
    
    BANKSEL    TXSTA
    BTFSS    TXSTA,TRMT;проверка бита TRMT (очистка сдвигового регистра перед-ка)
    GOTO    $-1    ;ожидание установки TRMT в 1
    
RETURN

;настройка UART
INIT_UART

    BANKSEL    PIE1
    BCF    PIE1,TXIE        ;запрет прерывания от передатчика
                                
    BANKSEL    SPBRGH        ;установка скорости обмена
    MOVLW    HIGH(br_19200)
    MOVWF    SPBRGH

    BANKSEL    SPBRG
    MOVLW    LOW(br_19200)
    MOVWF    SPBRG
    
    BANKSEL    BAUDCTL    
    CLRF    BAUDCTL      
    BSF    BAUDCTL,BRG16;16-битный генератор
    
    BANKSEL    TXSTA
    CLRF    TXSTA    ;очистка регистра управления и статуса передатчика
    BSF    TXSTA,BRGH;асинхронный режим, 8 бит, высокоскоростной режим
    
    BANKSEL    RCSTA
    CLRF    RCSTA    ;очистка регистра управления и статуса приемника
    BSF    RCSTA,SPEN;разрешение работы последовательного порта    
    
    BANKSEL    TXSTA
    BSF    TXSTA,TXEN;разрешение работы передатчика

RETURN


Всем спасибо за оказаную помощь.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.