Всем привет. Проблема такая. Использую аппаратный 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
BOB51 Если я правильно понимаю, мне необходимо после включения Usart-модуля вновь настроить TRISB на вход? Только что попробовал сбросить 2 бит регистра TRISB (нога TX как выход). Работает без изменений. Затем переместил настройку TRISB после инициализации и включения USART - работает точно также, режет старшие два бита в 0.
;основная программа инициализации контроллера START clrw ; сброс W bcf STATUS,RP0 bcf STATUS,RP1 ; переход в банк 0 movwf INTCON ; запрет всех прерываний movwf PIR1; сброс всех флагов прерываний bsf STATUS,RP0 ; переход в банк 1 movwf PIE1 ; запрет прерываний от периферии bcf STATUS,RP0 ; переход в банк 0
; подпрограмма передачи данных по USART TRANSFER btfss PIR1,TXIF ; пуст ли буфер передатчика? goto TRANSFER ; если нет, то повторная проверка movf DATA_OUT,w ; иначе считывание значения и копирование в буфер передатчика movwf TXREG return
end
Последний раз редактировалось Аlex Вт окт 17, 2017 22:56:20, всего редактировалось 1 раз.
А почему вы проверяете буфер передатчика флагом прерывания, а не опросом TXSTA,TRMT? Почитайте раздел 12.2.1 ДШ, там пошагово расписана процедура передачи.
Вообще, странный выбор скорости, 10400. Почему бы не стандартные 9600?
_________________ Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Со скоростью обмена... МНДЯаа... Для асинхронного на 4МГЦ единственно вероятно BRGH = 1 при 9600 или 19200... (SPBRG =25 или SPBRG =12 соответственно) зачем лишнюю отсебятину экспериментировать? (SPBRG =24 вместо 25)? Для более устойчивого приема лучше два стопа ставить...
По поводу скорости. Требуется организовать обмен данными с ЭБУ автомобиля (отправлять запрос и принимать ответ от блока), хочу реализовать это на аппаратном уровне. Подключался анализатором к K-line шине, обмен идет именно на такой скорости, формат - 8 бит с одним стопом. По поводу проверки буфера - таким образом не требуется переключать банки, как в случае с TMRT (хотя здесь могу ошибаться)
Добавлено after 2 minutes 43 seconds: в принципе все и работает стабильно и на нужной скорости, только никак не могу понять, из-за чего старшие два бита всегда равны 0? число 0x11 кстати передается как положено, так как имеет вид 00010001
Посмотри, что может идти не в анализатор (настроенный возможно на какой-нить протокол), а в терминалку на ПК. Возможно маскирование бит согласно особенностей протокола...
В одном анализаторе стоит ASYNC SERIAL (это в Saleae Logic) в другом UART (в DISCO2). Сомневаюсь, что что-то неправильно распознается, так как непосредственно с автомобиля (заводил сигнал через делитель напряжения) распознает обмен правильно. К тому же, если смотреть просто на фронты, то начинается посылка всегда с 2 сигналов нулевого уровня. Ломаю голову, может ли быть проблема в самом контроллере (брак?)
Судя по комментариям в регистр скорости заносится 24, а нужно 23. Данные в USART следуют младшими вперед. Может поэтому в конце старшие биты проглатываются. BAUD=4000000/(16(X+1)) -> X+1=4000000/16/10400=24 и X=23. При этом ошибка 0,16%. При 24 ошибка 3,84% - многовато.
Да, все верно, первый раз использовал 23. Затем, увидев в анализаторе скорость в 10600 (или около того, точно не помню), увеличил на 1 чтобы немного затормозить обмен. Может ли быть дело в том, что используется внутреннее тактирование, а не внешний кварц?
Данные в USART следуют младшими вперед. Может поэтому в конце старшие биты проглатываются.
Я могу ошибаться, но в таком случае (если передача закончена или отменена), на линии должна появиться постоянная 1, а не 0. Самое интересное, только что загнал программу в протеус, и там тоже в терминале некорректный прием, вместо 1111 1111 принимает 1111 1000
Последовал совету КРАМ'а, в протеусе нет приема (RCREG пустой) но подключенный параллельно терминал отображает данные корректно. Прошил контроллер, передача происходит корректно. С чем это связано - не знаю, уже запутался в своих действиях, что только не менял. На всякий случай выкладываю рабочий (на данный момент) код.
;основная программа инициализации контроллера START clrw ; сброс W bcf STATUS,RP0 bcf STATUS,RP1 ; переход в банк 0 movwf INTCON ; запрет всех прерываний movwf PIR1; сброс всех флагов прерываний bsf STATUS,RP0 ; переход в банк 1 movwf PIE1 ; запрет прерываний от периферии bcf STATUS,RP0 ; переход в банк 0
; подпрограмма передачи данных по USART TRANSFER btfss PIR1,TXIF ; пуст ли буфер передатчика? goto TRANSFER ; если нет, то повторная проверка call DELAY movf DATA_OUT,w ; иначе считывание значения и копирование в буфер передатчика movwf TXREG return
Довольно типична такого рода ошибка при неверно выставленных активных уровнях у передатчика относительно приемника. Можно вывести на внешние пины МК либо весь байт эха, либо по частям. В зависимости от количества свободных пинов. Тогда получится посмотреть в железе. Это я к тому, что только эхо позволяет оценить правильность конфигурации. А что там у внешнего приемника - будете разбирать потом. Кстати, а в К-шине часом не манчестер?
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения