Доброго дня, товарищи программисты-электронщики. Помогите решить проблему, пожалуйста! Есть код, который включает пару релешек и считывает давление, эти действия он должен выполнять по командам, приходящим с UART'а. Однако, проблема в том, что при подключении второго UART'a цикл основной программы прекращается. Никак не могу понять почему. Если передавать данные по первому UART'y, всё прекрасно работает и на приём, и на передачу. Однако, при подключении второго, программа выходит из цикла и поэтому, UART не передаёт данные обратно на компьютер, при этом, принимая их и производя необходимые действия.
Текст основной программы в среде microC PRO for PIC
/*****************************************************************************/ /* Функция инициализации USART1->FT232RL to USB & USART2->Terminal */ /*****************************************************************************/
void initialisation_usart(void){
UART1_Init(38400); UART2_Init(38400); }
/*****************************************************************************/ /* Функция запуска прерываний и таймера */ /*****************************************************************************/
Заголовок сообщения: Re: Проблемы с UART2 на PIC18F45K22
Добавлено: Чт июл 06, 2017 13:31:12
Модератор
Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4510 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
Цитата:
Никак не могу понять почему.
Ничего удивительного. Ни Вы, ни тем более мы, не видим в коде практически ничего, что касается UART'а, всё скрыто в библиотечные функции. Реализуйте всю работу с модулем сами, тогда можно будет прогнать в том же протеусе и посмотреть что происходит. И ещё, вопросик. Что Вы хотели сделать вот этой конструкцией :
Код не мой. Мне достался по наследству от предыдущего разработчика.. Полагаю, что подразумевается, что ничего не надо делать, если пришёл символ "х", так как посылка имеет вид "R01x01x01xx!". Почему тогда с первым уартом работает? И что такое протеус?
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
R'j_395 писал(а): Почему тогда с первым уартом работает? Дак вопрос в чём, почему с первым работает, или почему со вторым не работает ?
Вопрос в том почему если мы работаем с первым уартом всё работает, а если меняем в коде основной программы первый на второй, при этом не меняя больше ничего, программа выходит из цикла после 5-10 секунд работы...
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
А при смене портов вы и названия битов меняете? Сейчас в прерывании имеется RC1IF и обращение uart2. Может где-то что-то забываете заменить?
И еще кое-что. В прерывании у вас какие-то длинные операции. После очистки флага приема поставьте метку и выходите оттуда, а основном цикле проверяйте ее и проделывайте чтение. Спойлер
Вообще удобнее создать структуру и назначить биты в виде флагов вместо целых переменных. Память не резиновая, даже в таком ПИКе.
Не знаю как в вашем МикроСи, но скорее всего в прерывании запрещать и разрешать бит GIE не нужно. Уточните этот момент. И еще совершенно непонятные манипуляции с Трисами в начальной инициализации. Сперва присваиваете значение целому регистру, а потом отдельно по битам.
_________________ Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
GIE нельзя разрешать в прерывании. И язык программирования тут не причем. При взведении флагов прерываний во время исполнения обработчика, сразу за установкой GIE последует вложенный вызов и порча контекста. У автора все работало, пока был один источник поерываний. Именно второй поверх первого и портил контекст и стек. К слову, GIE автоматически гасится при входе в обработчик и устанавливается командой retfie при выходе из обработчика. Этой командой завершается обработчик в обязательном порядке. В Си любой компилятор так и делает. Фигурная скобка закрывающая тело обраюотчика и есть эта команда+восстановление контекста.
Первое что я сделал, переходя с асм на Си, это проверил обработчик прерывания после компиляции в ХС8. Там были все сохранения, восстановления и retfie. А с другими средами и компиляторами я дел не имел, не знаю как и что. Но вот запрещать прерывания при входе - это уж точно лишнее, в любом языке.
_________________ Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения