Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить

аппаратный UART PIC16F628A

Пн окт 16, 2017 05:33:33

Всем привет. Проблема такая. Использую аппаратный UART для передачи последовательности байтов. Тактирование контроллера от внутреннего генератора 4 МГЦ. Скорость обмена настроил на 10400 (расчетная) Реальная скорость составляет 10390 (если верить автонастройке лог.анализатора) Проблема в том, что теряются первые 2 бита передаваемого байта. То есть, отправляю 1000 0010 (82) а получаю на выходе 0000 0010 (02), то есть первые 2 бита распознаются анализатором как 0. То же самое и с остальными байтами. Пробовал передавать 1111 1111, на выходе - 0011 1111. Прошу подсказки, в чем может быть проблема. При этом результаты всегда стабильны, то есть в бесконечном цикле получаются всегда одни и те же результаты. Отправляю 82-11-F1-21-F1-96, анализатор распознает их как 02-11-31-21-31-16
Были подозрения на анализатор, но он не врет, попробовал на 2 разных, Saleae Logic и Disco2

Re: аппаратный UART PIC16F628A

Пн окт 16, 2017 12:51:10

Возможно тут
80151N_pic16f627a_628a_648a_errata_rev_a.pdf
(118.79 KiB) Скачиваний: 377

стр.3
:roll:

Re: аппаратный UART PIC16F628A

Пн окт 16, 2017 23:06:43

BOB51
Если я правильно понимаю, мне необходимо после включения Usart-модуля вновь настроить TRISB на вход?
Только что попробовал сбросить 2 бит регистра TRISB (нога TX как выход). Работает без изменений. Затем переместил настройку TRISB после инициализации и включения USART - работает точно также, режет старшие два бита в 0.

Re: аппаратный UART PIC16F628A

Вт окт 17, 2017 08:43:00

Это предположение...
:roll:

Re: аппаратный UART PIC16F628A

Вт окт 17, 2017 10:17:44

Кто-нибудь может прошить свой мк моей программой? Хочу удостовериться, что проблема в софте, а не в самом контроллере

Re: аппаратный UART PIC16F628A

Вт окт 17, 2017 11:35:30

Вы бы программу выложили сюда, было бы больше пользы.
Тут нет экстрасенсов.

Re: аппаратный UART PIC16F628A

Вт окт 17, 2017 22:27:07

вот листинг
Код:
; контроллер - PIC16F628A
#include "p16f628a.inc"
 __CONFIG _FOSC_INTOSCIO & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _CP_OFF ; конфигурация контроллера
; объявление регистров
 DATA_OUT equ h'0010'
 Reg_1 equ h'0011'
 Reg_2 equ h'0012'
 org 0000h
 goto START ; вектор сброса
 
 org 0004h
 retfie ; вектор прерывания
 
 ;основная программа инициализации контроллера
START
 clrw ; сброс W
 bcf STATUS,RP0
 bcf STATUS,RP1 ; переход в банк 0
 movwf INTCON ; запрет всех прерываний
 movwf PIR1; сброс всех флагов прерываний
 bsf STATUS,RP0 ; переход в банк 1
 movwf PIE1 ; запрет прерываний от периферии
 bcf STATUS,RP0 ; переход в банк 0
 
; отключение неиспользуемых модулей
 movlw 07h
 movwf CMCON ; отключение модуля компараторов
 
 clrf T2CON ; отключение таймера 2
 
 clrf CCP1CON ; отключение ШИМ
 
 bsf STATUS,RP0 ; банк 1
 clrf VRCON ; отключение источника опорного напряжения
 
 bcf OPTION_REG,T0CS ;обнуляем бит T0CS, что соответствует тактированию TMR0 от внутреннего сигнала
 
 bcf STATUS,RP0 ;0-й банк       
 clrf T1CON; отключение таймера 1
 
; настройка модуля USART
 bsf STATUS,RP0 ; банк 1
 movlw b'00000110' ;
 movwf TRISB
 movlw b'00011000'
 movwf SPBRG ; 24. скорость обмена - 10400
 
 movlw b'10100100'
 movwf TXSTA ; внутреннее тактирование, 8 разрядная передача, передача разрешена, асинхронный режим, высокоскоростной режим
 

 
 bcf STATUS,RP0 ; банк 0
 movlw b'10000000'
 movwf RCSTA ; USART вкл, 8 разрядный прием, прием запрещен

; основной цикл
MAIN
 call DELAY
;подпрограмма отправки запроса
 movlw b'11111111' ;
 movwf DATA_OUT ;
 call TRANSFER ; передача 0x82
 call DELAY
 goto MAIN
DELAY
; Задержка 100 000 машинных циклов
; Длительность задержки 100 миллисекунд
; Частота задающего генератора 4 МГц

            movlw       .221
            movwf       Reg_1
            movlw       .130
            movwf       Reg_2
            decfsz      Reg_1,F
            goto        $-1
            decfsz      Reg_2,F
            goto        $-3
            nop
            nop
return
 
; подпрограмма передачи данных по USART
TRANSFER
 btfss PIR1,TXIF ; пуст ли буфер передатчика?
  goto TRANSFER ; если нет, то повторная проверка
 movf DATA_OUT,w ; иначе считывание значения и копирование в буфер передатчика
 movwf TXREG
 return
 

 end
Последний раз редактировалось Аlex Вт окт 17, 2017 22:56:20, всего редактировалось 1 раз.
Причина: Тег [code]

Re: аппаратный UART PIC16F628A

Ср окт 18, 2017 08:46:42

А почему вы проверяете буфер передатчика флагом прерывания, а не опросом TXSTA,TRMT?
Почитайте раздел 12.2.1 ДШ, там пошагово расписана процедура передачи.

Вообще, странный выбор скорости, 10400. Почему бы не стандартные 9600?

Re: аппаратный UART PIC16F628A

Ср окт 18, 2017 09:16:53

Со скоростью обмена...
МНДЯаа...
Для асинхронного на 4МГЦ единственно вероятно BRGH = 1
при 9600 или 19200... (SPBRG =25 или SPBRG =12 соответственно)
зачем лишнюю отсебятину экспериментировать? (SPBRG =24 вместо 25)?
Для более устойчивого приема лучше два стопа ставить...
:roll:

Re: аппаратный UART PIC16F628A

Ср окт 18, 2017 10:33:03

По поводу скорости. Требуется организовать обмен данными с ЭБУ автомобиля (отправлять запрос и принимать ответ от блока), хочу реализовать это на аппаратном уровне. Подключался анализатором к K-line шине, обмен идет именно на такой скорости, формат - 8 бит с одним стопом. По поводу проверки буфера - таким образом не требуется переключать банки, как в случае с TMRT (хотя здесь могу ошибаться)

Добавлено after 2 minutes 43 seconds:
в принципе все и работает стабильно и на нужной скорости, только никак не могу понять, из-за чего старшие два бита всегда равны 0? число 0x11 кстати передается как положено, так как имеет вид 00010001

Re: аппаратный UART PIC16F628A

Ср окт 18, 2017 10:42:04

Посмотри, что может идти не в анализатор (настроенный возможно на какой-нить протокол), а в терминалку на ПК.
Возможно маскирование бит согласно особенностей протокола...
:dont_know:

Re: аппаратный UART PIC16F628A

Ср окт 18, 2017 10:50:34

В одном анализаторе стоит ASYNC SERIAL (это в Saleae Logic) в другом UART (в DISCO2). Сомневаюсь, что что-то неправильно распознается, так как непосредственно с автомобиля (заводил сигнал через делитель напряжения) распознает обмен правильно. К тому же, если смотреть просто на фронты, то начинается посылка всегда с 2 сигналов нулевого уровня. Ломаю голову, может ли быть проблема в самом контроллере (брак?)

Re: аппаратный UART PIC16F628A

Ср окт 18, 2017 11:05:10

Судя по комментариям в регистр скорости заносится 24, а нужно 23. Данные в USART следуют младшими вперед. Может поэтому в конце старшие биты проглатываются.
BAUD=4000000/(16(X+1)) -> X+1=4000000/16/10400=24 и X=23. При этом ошибка 0,16%. При 24 ошибка 3,84% - многовато.

Re: аппаратный UART PIC16F628A

Ср окт 18, 2017 11:32:05

Да, все верно, первый раз использовал 23. Затем, увидев в анализаторе скорость в 10600 (или около того, точно не помню), увеличил на 1 чтобы немного затормозить обмен. Может ли быть дело в том, что используется внутреннее тактирование, а не внешний кварц?

Re: аппаратный UART PIC16F628A

Ср окт 18, 2017 11:40:34

Конечно может.

Re: аппаратный UART PIC16F628A

Ср окт 18, 2017 23:03:31

Данные в USART следуют младшими вперед. Может поэтому в конце старшие биты проглатываются.


Я могу ошибаться, но в таком случае (если передача закончена или отменена), на линии должна появиться постоянная 1, а не 0.
Самое интересное, только что загнал программу в протеус, и там тоже в терминале некорректный прием, вместо 1111 1111 принимает 1111 1000

Re: аппаратный UART PIC16F628A

Чт окт 19, 2017 03:31:06

В Протеусе соедините передатчик МК с приемником и посмотрите как принимается эхо.
Вообще то с этого надо было начинать.

Re: аппаратный UART PIC16F628A

Чт окт 19, 2017 10:36:40

Последовал совету КРАМ'а, в протеусе нет приема (RCREG пустой) но подключенный параллельно терминал отображает данные корректно. Прошил контроллер, передача происходит корректно. С чем это связано - не знаю, уже запутался в своих действиях, что только не менял. На всякий случай выкладываю рабочий (на данный момент) код.

Код:
; контроллер - PIC16F628A
#include "p16f628a.inc"
 __CONFIG _FOSC_INTOSCIO & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _BOREN_OFF & _LVP_OFF & _CPD_OFF & _CP_OFF ; конфигурация контроллера
; объявление регистров
 DATA_OUT equ h'0010'
 Reg_1 equ h'0011'
 Reg_2 equ h'0012'
 org 0000h
 goto START ; вектор сброса
 
 org 0004h
 retfie ; вектор прерывания
 
 ;основная программа инициализации контроллера
START
 clrw ; сброс W
 bcf STATUS,RP0
 bcf STATUS,RP1 ; переход в банк 0
 movwf INTCON ; запрет всех прерываний
 movwf PIR1; сброс всех флагов прерываний
 bsf STATUS,RP0 ; переход в банк 1
 movwf PIE1 ; запрет прерываний от периферии
 bcf STATUS,RP0 ; переход в банк 0
 
; отключение неиспользуемых модулей
 movlw 07h
 movwf CMCON ; отключение модуля компараторов
 
 clrf T2CON ; отключение таймера 2
 
 clrf CCP1CON ; отключение ШИМ
 
 bsf STATUS,RP0 ; банк 1
 clrf VRCON ; отключение источника опорного напряжения
 
 bcf OPTION_REG,T0CS ;обнуляем бит T0CS, что соответствует тактированию TMR0 от внутреннего сигнала
 
 bcf STATUS,RP0 ;0-й банк       
 clrf T1CON; отключение таймера 1
 
; настройка модуля USART
 bsf STATUS,RP0 ; банк 1
 movlw b'00000110' ;
 movwf TRISB
 movlw b'00011000'
 movwf SPBRG ; 24. скорость обмена - 10400
 
 movlw b'10000111'
 movwf TXSTA ; внутреннее тактирование, 8 разрядная передача, !передача разрешена, асинхронный режим, высокоскоростной режим
 

 
 bcf STATUS,RP0 ; банк 0
 movlw b'11111111'
 movwf PORTB
 movlw b'10111000'
 movwf RCSTA ; USART вкл, 8 разрядный прием, прием запрещен
 bsf STATUS,RP0 ; банк 1
 bsf OPTION_REG,NOT_RBPU ; вкл. подтяжку
 bsf TXSTA,TXEN ; вкл. передачи
 bcf STATUS,RP0 ; банк 0

; основной цикл
MAIN
 call DELAY
 call DELAY
 call DELAY
;подпрограмма отправки запроса
 movlw b'10000010' ;
 movwf DATA_OUT ;
 call TRANSFER ; передача 0x82
 call DELAY
 goto MAIN
DELAY
; Задержка 100 000 машинных циклов
; Длительность задержки 100 миллисекунд
; Частота задающего генератора 4 МГц

            movlw       .221
            movwf       Reg_1
            movlw       .130
            movwf       Reg_2
            decfsz      Reg_1,F
            goto        $-1
            decfsz      Reg_2,F
            goto        $-3
            nop
            nop
return
 
; подпрограмма передачи данных по USART
TRANSFER
 btfss PIR1,TXIF ; пуст ли буфер передатчика?
  goto TRANSFER ; если нет, то повторная проверка
 call DELAY
 movf DATA_OUT,w ; иначе считывание значения и копирование в буфер передатчика
 movwf TXREG
 return
 

 end

Re: аппаратный UART PIC16F628A

Чт окт 19, 2017 11:10:47

Проект Протеуса приложите.

Re: аппаратный UART PIC16F628A

Чт окт 19, 2017 12:30:07

Довольно типична такого рода ошибка при неверно выставленных активных уровнях у передатчика относительно приемника.
Можно вывести на внешние пины МК либо весь байт эха, либо по частям. В зависимости от количества свободных пинов. Тогда получится посмотреть в железе.
Это я к тому, что только эхо позволяет оценить правильность конфигурации. А что там у внешнего приемника - будете разбирать потом.
Кстати, а в К-шине часом не манчестер?
Ответить