Всем привет. Проблема такая. Использую аппаратный 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.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
;основная программа инициализации контроллера 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
Довольно типична такого рода ошибка при неверно выставленных активных уровнях у передатчика относительно приемника. Можно вывести на внешние пины МК либо весь байт эха, либо по частям. В зависимости от количества свободных пинов. Тогда получится посмотреть в железе. Это я к тому, что только эхо позволяет оценить правильность конфигурации. А что там у внешнего приемника - будете разбирать потом. Кстати, а в К-шине часом не манчестер?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения