аппаратный UART PIC16F628A
аппаратный UART PIC16F628A
Всем привет. Проблема такая. Использую аппаратный 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
Были подозрения на анализатор, но он не врет, попробовал на 2 разных, Saleae Logic и Disco2
- Реклама
Re: аппаратный UART PIC16F628A
Возможно тут
стр.3

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

Re: аппаратный UART PIC16F628A
Кто-нибудь может прошить свой мк моей программой? Хочу удостовериться, что проблема в софте, а не в самом контроллере
- Реклама
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: аппаратный UART PIC16F628A
Вы бы программу выложили сюда, было бы больше пользы.
Тут нет экстрасенсов.
Тут нет экстрасенсов.
Re: аппаратный UART PIC16F628A
вот листинг
Код: Выделить всё
; контроллер - 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]
Причина: Тег [code]
- Zhuk72
- Сверлит текстолит когтями
- Сообщения: 1231
- Зарегистрирован: Ср янв 29, 2014 08:41:31
- Откуда: Баку
- Контактная информация:
Re: аппаратный UART PIC16F628A
А почему вы проверяете буфер передатчика флагом прерывания, а не опросом TXSTA,TRMT?
Почитайте раздел 12.2.1 ДШ, там пошагово расписана процедура передачи.
Вообще, странный выбор скорости, 10400. Почему бы не стандартные 9600?
Почитайте раздел 12.2.1 ДШ, там пошагово расписана процедура передачи.
Вообще, странный выбор скорости, 10400. Почему бы не стандартные 9600?
Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Re: аппаратный UART PIC16F628A
Со скоростью обмена...
МНДЯаа...
Для асинхронного на 4МГЦ единственно вероятно BRGH = 1
при 9600 или 19200... (SPBRG =25 или SPBRG =12 соответственно)
зачем лишнюю отсебятину экспериментировать? (SPBRG =24 вместо 25)?
Для более устойчивого приема лучше два стопа ставить...

МНДЯаа...
Для асинхронного на 4МГЦ единственно вероятно BRGH = 1
при 9600 или 19200... (SPBRG =25 или SPBRG =12 соответственно)
зачем лишнюю отсебятину экспериментировать? (SPBRG =24 вместо 25)?
Для более устойчивого приема лучше два стопа ставить...
Re: аппаратный UART PIC16F628A
По поводу скорости. Требуется организовать обмен данными с ЭБУ автомобиля (отправлять запрос и принимать ответ от блока), хочу реализовать это на аппаратном уровне. Подключался анализатором к K-line шине, обмен идет именно на такой скорости, формат - 8 бит с одним стопом. По поводу проверки буфера - таким образом не требуется переключать банки, как в случае с TMRT (хотя здесь могу ошибаться)
Добавлено after 2 minutes 43 seconds:
в принципе все и работает стабильно и на нужной скорости, только никак не могу понять, из-за чего старшие два бита всегда равны 0? число 0x11 кстати передается как положено, так как имеет вид 00010001
Добавлено after 2 minutes 43 seconds:
в принципе все и работает стабильно и на нужной скорости, только никак не могу понять, из-за чего старшие два бита всегда равны 0? число 0x11 кстати передается как положено, так как имеет вид 00010001
Re: аппаратный UART PIC16F628A
Посмотри, что может идти не в анализатор (настроенный возможно на какой-нить протокол), а в терминалку на ПК.
Возможно маскирование бит согласно особенностей протокола...

Возможно маскирование бит согласно особенностей протокола...
Re: аппаратный UART PIC16F628A
В одном анализаторе стоит ASYNC SERIAL (это в Saleae Logic) в другом UART (в DISCO2). Сомневаюсь, что что-то неправильно распознается, так как непосредственно с автомобиля (заводил сигнал через делитель напряжения) распознает обмен правильно. К тому же, если смотреть просто на фронты, то начинается посылка всегда с 2 сигналов нулевого уровня. Ломаю голову, может ли быть проблема в самом контроллере (брак?)
Re: аппаратный UART PIC16F628A
Судя по комментариям в регистр скорости заносится 24, а нужно 23. Данные в USART следуют младшими вперед. Может поэтому в конце старшие биты проглатываются.
BAUD=4000000/(16(X+1)) -> X+1=4000000/16/10400=24 и X=23. При этом ошибка 0,16%. При 24 ошибка 3,84% - многовато.
BAUD=4000000/(16(X+1)) -> X+1=4000000/16/10400=24 и X=23. При этом ошибка 0,16%. При 24 ошибка 3,84% - многовато.
Re: аппаратный UART PIC16F628A
Да, все верно, первый раз использовал 23. Затем, увидев в анализаторе скорость в 10600 (или около того, точно не помню), увеличил на 1 чтобы немного затормозить обмен. Может ли быть дело в том, что используется внутреннее тактирование, а не внешний кварц?
Re: аппаратный UART PIC16F628A
Конечно может.
Re: аппаратный UART PIC16F628A
[uquote="akl",url="/forum/viewtopic.php?p=3209352#p3209352"]Данные в USART следуют младшими вперед. Может поэтому в конце старшие биты проглатываются.[/uquote]
Я могу ошибаться, но в таком случае (если передача закончена или отменена), на линии должна появиться постоянная 1, а не 0.
Самое интересное, только что загнал программу в протеус, и там тоже в терминале некорректный прием, вместо 1111 1111 принимает 1111 1000
Я могу ошибаться, но в таком случае (если передача закончена или отменена), на линии должна появиться постоянная 1, а не 0.
Самое интересное, только что загнал программу в протеус, и там тоже в терминале некорректный прием, вместо 1111 1111 принимает 1111 1000
- КРАМ
- Друг Кота
- Сообщения: 25259
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: аппаратный UART PIC16F628A
В Протеусе соедините передатчик МК с приемником и посмотрите как принимается эхо.
Вообще то с этого надо было начинать.
Вообще то с этого надо было начинать.
Re: аппаратный UART PIC16F628A
Последовал совету КРАМ'а, в протеусе нет приема (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- Zhuk72
- Сверлит текстолит когтями
- Сообщения: 1231
- Зарегистрирован: Ср янв 29, 2014 08:41:31
- Откуда: Баку
- Контактная информация:
Re: аппаратный UART PIC16F628A
Проект Протеуса приложите.
Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
- КРАМ
- Друг Кота
- Сообщения: 25259
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: аппаратный UART PIC16F628A
Довольно типична такого рода ошибка при неверно выставленных активных уровнях у передатчика относительно приемника.
Можно вывести на внешние пины МК либо весь байт эха, либо по частям. В зависимости от количества свободных пинов. Тогда получится посмотреть в железе.
Это я к тому, что только эхо позволяет оценить правильность конфигурации. А что там у внешнего приемника - будете разбирать потом.
Кстати, а в К-шине часом не манчестер?
Можно вывести на внешние пины МК либо весь байт эха, либо по частям. В зависимости от количества свободных пинов. Тогда получится посмотреть в железе.
Это я к тому, что только эхо позволяет оценить правильность конфигурации. А что там у внешнего приемника - будете разбирать потом.
Кстати, а в К-шине часом не манчестер?


