Программный UART -= H E L P =-

Всё об интерфейсах, протоколах, подключении к МК разных устройств, подключении контроллеров к ПК...
lavrentyi
Читатель
Читатель
Сообщения: 11
Зарегистрирован: 22 май 2016, 11:19

Программный UART -= H E L P =-

Сообщение lavrentyi »

Доброго времени суток всем.. Собрал программный UART вот по такому алгоритму
http://www.radiohlam.ru/program/pic_pr_usart_prost.htm
Изменил скорость на 9600. Поменял задачу. Т.е. один МК передает байт второй принимает
и как есть отсылает его на следующее устройство. Смоделировал все это хозяйство в PROTEUS.
Подцепил терминалы отладчики на входе и выходе приемопередающего МК.
Наблюдаю следующее: С первой отправкой байта с первого МК второй МК выдает не достоверную
инфу. А все последующие идут четко. Пока отправляю один байт. Далее по условию надо отправлять
штук пятнадцать байт. Люди добрые ... Подскажите дилетанту в чем ошибка.
Вложения
kod.JPG
;
;
Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 3060
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
Контактная информация:

Re: Программный UART -= H E L P =-

Сообщение rhf-admin »

Попробуй линию Tx(I)-Rx(II) притянуть резистором к питанию или включить какую-то задержку включения второго МК.
В отсутствии передачи на линии должна висеть 1, я думаю проблема где-то в этом месте, нужно чтобы к тому моменту, когда второй контроллер начнёт работать как приёмник, первый уже выставил на линии 1 и ничего там не дрыгалось.
С уважением, администрация сайта.
lavrentyi
Читатель
Читатель
Сообщения: 11
Зарегистрирован: 22 май 2016, 11:19

Re: Программный UART -= H E L P =-

Сообщение lavrentyi »

Спасибо что ответили. Пробовал я и отдельную ПП recieve для первого байта.
И тайминги менял в первом байте. Ни в какую. На железо пока не спускался.
Мож еще протез подтупляет как вариант. Вообщем решил проблему пока
вот так как на прилагаемом скине в этом посте.
Тему пока не закрываю. Чтоб новую ветку не открывать. Следующий шаг.
От первого МК поступает пакет из 13ти байт. Первые три байта предназначаются
для приемо передающего МК. А остальные 10 транзитные на оконечное устройство.
Первые два байта из трех для второго МК, являются криптовыми. Т.е. второй МК
нюхает если они не по формату то остальные десять байт на оконечный
приемник не отсылает. Как то так....
Вложения
otchet.JPG
obmanka.JPG
za9c
Читатель
Читатель
Сообщения: 94
Зарегистрирован: 31 авг 2011, 15:50

Re: Программный UART -= H E L P =-

Сообщение za9c »

а в чём вы пишите ? В первом посте у вас b $-1 а в конце b interview!!! это куда ?
za9c
Читатель
Читатель
Сообщения: 94
Зарегистрирован: 31 авг 2011, 15:50

Re: Программный UART -= H E L P =-

Сообщение za9c »

если Вы уже решили так писать - запретите прерывания - после этого отправляйте пик в помехоприёмный полёт командой btfss Flag,1 == goto $-1!! (Админ дал простейший пример)... даже если приём пришёл - где гарантия что не помеха - или передатчик не настраивается на работу? - временная выдержка с подтверждением напрашивается сама собой! В третьих - любое сообщение начинайте с определённого байта - если он - значит начало посылки - нет -бред -ожидаем дальше - если ваш первый пакет потерялся - второй дойдёт почти 100%! на INSAT.RU есть бесплатный ModbusOpcuUiversalModbus на 32 тега!!! Скачайте - с сайта соберите преобразователь - подключайтесь к пику и вы там всё увидите! Я когда начинал частотники подключать и программить протоколы - много интересного узнал!!!
lavrentyi
Читатель
Читатель
Сообщения: 11
Зарегистрирован: 22 май 2016, 11:19

Re: Программный UART -= H E L P =-

Сообщение lavrentyi »

za9c доброго времени.. Пишу в MP LAB. К чему шел , того добился пока только В PROTEUS работает отлично. А вот на
макетке приемная часть не в какую не принимает. Некоторые ученые мужи подсказывают мне что
это характерная особенность ПИКов.
:o :o :o
Скорее всего процедура согласования/квитирования готовности на приеме и на передаче.
У моего варианта только передатчик программный. На прием пикушка не работает - только ловит согласие приема по своему запросу:
viewtopic.php?p=2593182#p2593182
а ПК после адаптера - расширителя перехватываеит весь пакет.
:? :? :? :? :?
Еще буду пробывать. Попробую по предложенному вами алгоритму. Прерыванием только нюхать. А обрабатывать опросом.
:-? :-? :-? :-? :-?
za9c
Читатель
Читатель
Сообщения: 94
Зарегистрирован: 31 авг 2011, 15:50

Re: Программный UART -= H E L P =-

Сообщение za9c »

если не затруднит Вас - весь код увидеть можно?
Что-то непонятное некоторые ученые мужи подсказывают!
lavrentyi
Читатель
Читатель
Сообщения: 11
Зарегистрирован: 22 май 2016, 11:19

Re: Программный UART -= H E L P =-

Сообщение lavrentyi »

Вот промежуточный МК.
код под спойлером
====================================




include P12F629.inc ; подключаем файлик компилятора на выбранный контроллер
__CONFIG 3194h ; конфигурируем MK - встроенный RC, MCLR выкл, собака выкл.
errorlevel -207,-302,-305 ; обьявляем компилятору не выводить указанных ошибок

;===============================================================================================
;------------- Назначаем ячейки ОЗУ ( Обзываем регистры общего назначения )---------------------
;===============================================================================================

cblock 0x20
Reg_1 ; дежурные регистры
Reg_2 ; -//-
Reg_3 ; -//-
; W_ ; под хранение данных регистра W при обработке преываний
; STATUS_ ; под хранение данных регистра STATUS при обработке преpываний
Tbyte ; буфер передатчика
Rbyte ; буфер приемника
Flags ; флаги (0/1) (0 - состояние Tbyte (пуст/не пуст),
; 1 - состояние Rbyte (пуст/не пуст),
; 2 - переполнение приемника (нет/есть),
; 3 - ошибка приема (нет/есть))
Tx_Count ; счетчик переданных бит
Rx_Count ; счетчик принятых бит
SCount ; счетчик циклов задержки
CMD_mp3 ; под хранение команды отправляемой в TF_плеер програмным UART
BD_H ; под хранение старшего байта данных команд в TF_плеер
BD_L ; под хранение младшего байта данных команд в TF_плеер
FB_mp3 ; байт обратной связи для передачи в TF_плееp
countX
B_Data ; под хранение байтов принятого пакета
endc

cblock .0
endc

;===============================================================================================
;------------- Определяем константы ------------------------------------------------------------
;===============================================================================================

Baudrate equ .24 ; подсчитаное число циклов задержки для данной скорости USART

;===============================================================================================
;------------- Обзываем лапы МК ----------------------------------------------------------------
;===============================================================================================

#define U_rx_pin GPIO,2 ; приемный вход UART от МК управления
#define U_tx_pin GPIO,5 ; передающий выход UART на FTPlayer

;===============================================================================================
;------------- Пишем микропрограмки ( МАКРОСЫ) -------------------------------------------------
;===============================================================================================

Bank_0 macro ; переход в банк 0
bcf STATUS,RP0
bcf STATUS,RP1
endm

Bank_1 macro ; переход в банк 1
bsf STATUS,RP0
bcf STATUS,RP1
endm

;===============================================================================================
org 0x0 ; задаем стартовый адрес основной программы
goto InitPIC
;===============================================================================================
org 0x04 ; задаем стартовый адрес обработчика прерываний
;===============================================================================================
;----------- ОБРАБОТЧИК ПРЕРЫВАНИЙ -------------------------------------------------------------
;===============================================================================================
; movwf W_ ; сохраняем текущий контекст ключевых регистров, чтобы после
; swapf STATUS,W ; выполнения обработчика прерываний вернуться к прерваному месту
; movwf STATUS_ ; в основной программе
;===============================================================================================
call Recieve
bcf INTCON,0 ; сбросить флаг прерывания от RB4...RB7
;===============================================================================================
; swapf STATUS_,W ;
; movwf STATUS ;
; swapf W_,F ;
; swapf W_,W ;
retfie ; выходим из обработчика прерываний

;===============================================================================================
;------------- ИНИЦИАЛИЗАЦИЯ КОНТРОЛЛЕРА -------------------------------------------------------
;===============================================================================================

InitPIC
clrf GPIO ; чистим PORT
bsf U_tx_pin ; передающую линию UARTa в дежурное состояние
movlw 0x07 ; компаратор нах
movwf CMCON
Bank_1
movlw b'00000100' ; затачиваем PORT под себя
movwf TRISIO
movlw b'00000100' ; подключаем подтягивающие резюки
movwf WPU
bcf OPTION_REG,7;
movlw b'00000100' ; разрешаем прерывания по изменению состояния на лапе RB2
movwf IOCB
Bank_0

;--- Настройка прерываний

clrf Flags ; чистим регистр флагов
bsf INTCON,3 ; разрешаем прерывания от RB4..RB7

;--- Квитируем МК на прием n+1 байт в пакете. В данном проекте в пакете 11 байт.

movlw .12
movwf countX
call Recieve
decfsz countX,F
b $-2

;===============================================================================================
;--------- О С Н О В Н А Я П Р О Г Р А М М А -------------------------------------------------
;===============================================================================================

RX_frame
bsf INTCON,7 ; разрешаем все немаскированные прерывания

;--- Прием пакета

btfss Flags,1 ; ждем приема
b $-1
movf Rbyte,0 ; перепишем принятый байт в регистр для хранения
movwf B_Data
bcf Flags,1 ; сбрасываем флаг приемника

btfss Flags,1 ; ждем приема
b $-1
movf Rbyte,0 ; перепишем принятый байт в регистр для хранения
movwf B_Data+1 ;
bcf Flags,1 ; сбрасываем флаг приемника

btfss Flags,1 ; ждем приема
b $-1
movf Rbyte,0 ; перепишем принятый байт в регистр для хранения
movwf B_Data+2 ;
bcf Flags,1 ; сбрасываем флаг приемника

btfss Flags,1 ; ждем приема
b $-1
movf Rbyte,0 ; перепишем принятый байт в регистр для хранения
movwf B_Data+3 ;
bcf Flags,1 ; сбрасываем флаг приемника

btfss Flags,1 ; ждем приема
b $-1
movf Rbyte,0 ; перепишем принятый байт в регистр для хранения
movwf B_Data+4 ;
bcf Flags,1 ; сбрасываем флаг приемника

btfss Flags,1 ; ждем приема
b $-1
movf Rbyte,0 ; перепишем принятый байт в регистр для хранения
movwf B_Data+5 ;
bcf Flags,1 ; сбрасываем флаг приемника

btfss Flags,1 ; ждем приема
b $-1
movf Rbyte,0 ; перепишем принятый байт в регистр для хранения
movwf B_Data+6 ;
bcf Flags,1 ; сбрасываем флаг приемника

btfss Flags,1 ; ждем приема
b $-1
movf Rbyte,0 ; перепишем принятый байт в регистр для хранения
movwf B_Data+7 ;
bcf Flags,1 ; сбрасываем флаг приемника

btfss Flags,1 ; ждем приема
b $-1
movf Rbyte,0 ; перепишем принятый байт в регистр для хранения
movwf B_Data+8 ;
bcf Flags,1 ; сбрасываем флаг приемника

btfss Flags,1 ; ждем приема
b $-1
movf Rbyte,0 ; перепишем принятый байт в регистр для хранения
movwf B_Data+9 ;
bcf Flags,1 ; сбрасываем флаг приемника

btfss Flags,1 ; ждем приема
b $-1
movf Rbyte,0 ; перепишем принятый байт в регистр для хранения
movwf B_Data+10 ;
bcf Flags,1 ; сбрасываем флаг приемника

bcf INTCON,7 ; запрещаем прерывания

;--- Проверка принятого пакета

movf B_Data+9,W ; вычисляем контрольную сумму из принятого пакета
movwf B_Data+9 ; от 10го принятого байта вычитаем 5ый принятый байт
movwf Reg_1 ;

movf B_Data+5,W ;
movwf B_Data+5 ;
subwf Reg_1,W ; W = 10 - 5
subwf B_Data+10,W ; сверяем с 11ым принятым в пакете байтом

bnz RX_frame ; если не соответствует значит пакет не принят. Уходим к новому приему пакета
; если пакет принят то проверяем старший криптобайт
movlw 0x19
subwf B_Data+1 ;
bnz RX_frame ; если не соответствует значит пакет не свой. Уходим к новому приему пакета
; если соответствует то проверяем младший криптобайт
movlw 0x73
subwf B_Data+2 ;
bnz RX_frame ; если не соответствует значит пакет не свой. Уходим к новому приему пакета
; если соответствует то формируем пакет на передачу в устройство.
;=================

; Здесь можно вставить код для опроса и выполнения команд промежуточным МК
; его байт в приемном пакете Data_3

;=================

;--- Отправка пакета оконечному устройству

movlw 0x7E ; стартовый байт
call Transmit

movlw 0xFF ; номер модификации устройства
call Transmit

movf B_Data+4,W ; ключевой байт контрольной суммы пакета
call Transmit

movf B_Data+5,W ; команда плееру
call Transmit

movf B_Data+6,W ; ответный байт
call Transmit

movf B_Data+7,W ; старший байт данных
call Transmit

movf B_Data+8,W ; младший байт данных
call Transmit

movlw 0xFE ; старший байт контрольной суммы пакета
call Transmit

movf B_Data+9,W ; младший байт контрольной суммы пакета
call Transmit

movlw 0xEF ; стоповый байт
call Transmit

b RX_frame

;===============================================================================================
;------------- ПОД'ПРОГРАММЫ -------------------------------------------------------------------
;===============================================================================================

;---- Прием байта

Recieve
btfsc U_rx_pin ; если вход=0, то обнаружен старт-бит
return

btfsc Flags,1 ; проверяем - пуст ли приемник,
b Err_overflow; если нет - выставл. флаг переполн. и выходим
bsf Flags,1 ; ставим признак принятия посылки
movlw .8
movwf Rx_Count ; счетчик принятых бит=8
call Delay2 ; пауза = 1/4 длительности бита (чтобы читать бит ближе к середине
call Delay
bcf STATUS,0 ; сбрасываем флаг cf
rrf Rbyte,1 ; сдвигаем регистр вправо
btfsc U_rx_pin ; если вход=1, то пишем 1, если нет - пропускаем
bsf Rbyte,7 ; ставим бит=1
decfsz Rx_Count,1 ; уменьш.счетчик и провер.- приняли 8 бит или нет
b $-6 ; если нет - принимаем следующий бит
call Delay
btfsc U_rx_pin ; если вход=0, то стоп бит не пришел
b $+4
bsf Flags,3 ; если стоп бит не пришел - ошибка приема
b $+2
Err_overflow
bsf Flags,2 ; выставляем флаг переполнения

return

;--- Передача байта ( вызывается после после загр-ки данных в буфер (TByte))

Transmit
movwf Tbyte
bsf Flags,0 ; устанавливаем флаг состояния передатчика в 1
movlw .8
movwf Tx_Count ; Счетчик переданных бит=8
bcf U_tx_pin ; Посылаем старт бит (=0)
Next_Tx
call Delay
btfss Tbyte,0 ; Проверяем бит для посылки
; (посылаем биты от младшего к старшему)
b $+3 ; если 0 - идем сюда, если 1, пропуск-м эту команду
bsf U_tx_pin ; Посылаем единицу
b $+2
bcf U_tx_pin ; Посылаем ноль
rrf Tbyte,1 ; Переходим к следующему биту
decfsz Tx_Count,1 ; Уменьш. счетчик переданных бит и проверяем,
; если он = 0, то след-щая команда пропуск-ся
b Next_Tx ; Переходим к посылке следующего бита
call Delay ; Задержка для последнего бита
bsf U_tx_pin ; Посылаем стоп-бит
call Delay ; Ждем (пока его не принял приемник - нельзя
; посылать следующий байт)
clrf Tbyte ; Очищаем регистр TByte
bcf Flags,0 ; и сбрасываем флаг его состояния

return

;--- Задержка, в соответствии с baudrate (в данном случае от 9 мкс до 1,029 мс с шагом 4 мкс)

Delay
movlw Baudrate
movwf SCount
nop
decfsz SCount,1
b $-2

return

;--- Задержка/4 ------------------------------------------

Delay2
movlw Baudrate
movwf SCount
bcf STATUS,0
rrf SCount,1
bcf STATUS,0
rrf SCount,1
nop
decfsz SCount,1
goto $-2

return

;===============================================================================================

end
Последний раз редактировалось lavrentyi 26 май 2016, 09:11, всего редактировалось 5 раз.
lavrentyi
Читатель
Читатель
Сообщения: 11
Зарегистрирован: 22 май 2016, 11:19

Re: Программный UART -= H E L P =-

Сообщение lavrentyi »

Количество байт в приемном пакете можно на 2 - 3 уменьшить. МК управленец будет хлопец из 18 семейства.
Если есть необходимость могу папочку проекта скинуть. Но там пока только отладка данного канала.
Да и МК управленец с промежуточным МК будут УАРТ держать на радиоканале. Ответа о состоянии
не планируется. Но это пока. Я искренне рад что Вы не бросаете меня в моих начинаниях. :D :D :D :D :D :D
za9c
Читатель
Читатель
Сообщения: 94
Зарегистрирован: 31 авг 2011, 15:50

Re: Программный UART -= H E L P =-

Сообщение za9c »

Нда - с косвенной адресацией я так понимаю незнакомы? Завтра чуть подправлю!
Ответить

Вернуться в «Интерфейсы / Протоколы / Периферия»