Страница 1 из 2
аппаратный UART PIC16F628A
Добавлено: Пн окт 16, 2017 05:33:33
Kavinsky
Всем привет. Проблема такая. Использую аппаратный 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
BOB51
Возможно тут
стр.3

Re: аппаратный UART PIC16F628A
Добавлено: Пн окт 16, 2017 23:06:43
Kavinsky
BOB51
Если я правильно понимаю, мне необходимо после включения Usart-модуля вновь настроить TRISB на вход?
Только что попробовал сбросить 2 бит регистра TRISB (нога TX как выход). Работает без изменений. Затем переместил настройку TRISB после инициализации и включения USART - работает точно также, режет старшие два бита в 0.
Re: аппаратный UART PIC16F628A
Добавлено: Вт окт 17, 2017 08:43:00
BOB51
Это предположение...

Re: аппаратный UART PIC16F628A
Добавлено: Вт окт 17, 2017 10:17:44
Kavinsky
Кто-нибудь может прошить свой мк моей программой? Хочу удостовериться, что проблема в софте, а не в самом контроллере
Re: аппаратный UART PIC16F628A
Добавлено: Вт окт 17, 2017 11:35:30
Аlex
Вы бы программу выложили сюда, было бы больше пользы.
Тут нет экстрасенсов.
Re: аппаратный UART PIC16F628A
Добавлено: Вт окт 17, 2017 22:27:07
Kavinsky
вот листинг
Код: Выделить всё
; контроллер - 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
Re: аппаратный UART PIC16F628A
Добавлено: Ср окт 18, 2017 08:46:42
Zhuk72
А почему вы проверяете буфер передатчика флагом прерывания, а не опросом TXSTA,TRMT?
Почитайте раздел 12.2.1 ДШ, там пошагово расписана процедура передачи.
Вообще, странный выбор скорости, 10400. Почему бы не стандартные 9600?
Re: аппаратный UART PIC16F628A
Добавлено: Ср окт 18, 2017 09:16:53
BOB51
Со скоростью обмена...
МНДЯаа...
Для асинхронного на 4МГЦ единственно вероятно BRGH = 1
при 9600 или 19200... (SPBRG =25 или SPBRG =12 соответственно)
зачем лишнюю отсебятину экспериментировать? (SPBRG =24 вместо 25)?
Для более устойчивого приема лучше два стопа ставить...

Re: аппаратный UART PIC16F628A
Добавлено: Ср окт 18, 2017 10:33:03
Kavinsky
По поводу скорости. Требуется организовать обмен данными с ЭБУ автомобиля (отправлять запрос и принимать ответ от блока), хочу реализовать это на аппаратном уровне. Подключался анализатором к K-line шине, обмен идет именно на такой скорости, формат - 8 бит с одним стопом. По поводу проверки буфера - таким образом не требуется переключать банки, как в случае с TMRT (хотя здесь могу ошибаться)
Добавлено after 2 minutes 43 seconds:
в принципе все и работает стабильно и на нужной скорости, только никак не могу понять, из-за чего старшие два бита всегда равны 0? число 0x11 кстати передается как положено, так как имеет вид 00010001
Re: аппаратный UART PIC16F628A
Добавлено: Ср окт 18, 2017 10:42:04
BOB51
Посмотри, что может идти не в анализатор (настроенный возможно на какой-нить протокол), а в терминалку на ПК.
Возможно маскирование бит согласно особенностей протокола...

Re: аппаратный UART PIC16F628A
Добавлено: Ср окт 18, 2017 10:50:34
Kavinsky
В одном анализаторе стоит ASYNC SERIAL (это в Saleae Logic) в другом UART (в DISCO2). Сомневаюсь, что что-то неправильно распознается, так как непосредственно с автомобиля (заводил сигнал через делитель напряжения) распознает обмен правильно. К тому же, если смотреть просто на фронты, то начинается посылка всегда с 2 сигналов нулевого уровня. Ломаю голову, может ли быть проблема в самом контроллере (брак?)
Re: аппаратный UART PIC16F628A
Добавлено: Ср окт 18, 2017 11:05:10
akl
Судя по комментариям в регистр скорости заносится 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
Kavinsky
Да, все верно, первый раз использовал 23. Затем, увидев в анализаторе скорость в 10600 (или около того, точно не помню), увеличил на 1 чтобы немного затормозить обмен. Может ли быть дело в том, что используется внутреннее тактирование, а не внешний кварц?
Re: аппаратный UART PIC16F628A
Добавлено: Ср окт 18, 2017 11:40:34
akl
Конечно может.
Re: аппаратный UART PIC16F628A
Добавлено: Ср окт 18, 2017 23:03:31
Kavinsky
[uquote="akl",url="/forum/viewtopic.php?p=3209352#p3209352"]Данные в USART следуют младшими вперед. Может поэтому в конце старшие биты проглатываются.[/uquote]
Я могу ошибаться, но в таком случае (если передача закончена или отменена), на линии должна появиться постоянная 1, а не 0.
Самое интересное, только что загнал программу в протеус, и там тоже в терминале некорректный прием, вместо 1111 1111 принимает 1111 1000
Re: аппаратный UART PIC16F628A
Добавлено: Чт окт 19, 2017 03:31:06
КРАМ
В Протеусе соедините передатчик МК с приемником и посмотрите как принимается эхо.
Вообще то с этого надо было начинать.
Re: аппаратный UART PIC16F628A
Добавлено: Чт окт 19, 2017 10:36:40
Kavinsky
Последовал совету КРАМ'а, в протеусе нет приема (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
Zhuk72
Проект Протеуса приложите.
Re: аппаратный UART PIC16F628A
Добавлено: Чт окт 19, 2017 12:30:07
КРАМ
Довольно типична такого рода ошибка при неверно выставленных активных уровнях у передатчика относительно приемника.
Можно вывести на внешние пины МК либо весь байт эха, либо по частям. В зависимости от количества свободных пинов. Тогда получится посмотреть в железе.
Это я к тому, что только эхо позволяет оценить правильность конфигурации. А что там у внешнего приемника - будете разбирать потом.
Кстати, а в К-шине часом не манчестер?