Доброго дня, товарищи программисты-электронщики. Помогите решить проблему, пожалуйста! Есть код, который включает пару релешек и считывает давление, эти действия он должен выполнять по командам, приходящим с 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
Рейтинг сообщений: 1337
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4558 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
Цитата:
Никак не могу понять почему.
Ничего удивительного. Ни Вы, ни тем более мы, не видим в коде практически ничего, что касается UART'а, всё скрыто в библиотечные функции. Реализуйте всю работу с модулем сами, тогда можно будет прогнать в том же протеусе и посмотреть что происходит. И ещё, вопросик. Что Вы хотели сделать вот этой конструкцией :
Код не мой. Мне достался по наследству от предыдущего разработчика.. Полагаю, что подразумевается, что ничего не надо делать, если пришёл символ "х", так как посылка имеет вид "R01x01x01xx!". Почему тогда с первым уартом работает? И что такое протеус?
Открыта удобная площадка с выгодными ценами, поставляющая весь ассортимент продукции, производимой компанией MEAN WELL – от завоевавших популярность и известных на рынке изделий до новинок. MEAN WELL.Market предоставляет гарантийную и сервисную поддержку, удобный подбор продукции, оперативную доставку по России.
На сайте интернет-магазина посетители смогут найти обзоры, интересные статьи о применении, максимальный объем технических сведений.
R'j_395 писал(а): Почему тогда с первым уартом работает? Дак вопрос в чём, почему с первым работает, или почему со вторым не работает ?
Вопрос в том почему если мы работаем с первым уартом всё работает, а если меняем в коде основной программы первый на второй, при этом не меняя больше ничего, программа выходит из цикла после 5-10 секунд работы...
Продукция MOSO предназначена в основном для индустриальных приложений, использует инновационные решения на основе более 200 собственных патентов для силовой электроники и соответствует международным стандартам. LED-драйверы MOSO применяются в системах наружного освещения разных отраслей, включая промышленность, сельское хозяйство, транспорт и железную дорогу. В ряде серий реализована возможность дистанционного контроля и программирования работы по заданному сценарию. Разберем решения MOSO
подробнее>>
Zhuk72
Заголовок сообщения: Re: Проблемы с UART2 на PIC18F45K22
А при смене портов вы и названия битов меняете? Сейчас в прерывании имеется RC1IF и обращение uart2. Может где-то что-то забываете заменить?
И еще кое-что. В прерывании у вас какие-то длинные операции. После очистки флага приема поставьте метку и выходите оттуда, а основном цикле проверяйте ее и проделывайте чтение. Спойлер
Вообще удобнее создать структуру и назначить биты в виде флагов вместо целых переменных. Память не резиновая, даже в таком ПИКе.
Не знаю как в вашем МикроСи, но скорее всего в прерывании запрещать и разрешать бит GIE не нужно. Уточните этот момент. И еще совершенно непонятные манипуляции с Трисами в начальной инициализации. Сперва присваиваете значение целому регистру, а потом отдельно по битам.
_________________ Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
GIE нельзя разрешать в прерывании. И язык программирования тут не причем. При взведении флагов прерываний во время исполнения обработчика, сразу за установкой GIE последует вложенный вызов и порча контекста. У автора все работало, пока был один источник поерываний. Именно второй поверх первого и портил контекст и стек. К слову, GIE автоматически гасится при входе в обработчик и устанавливается командой retfie при выходе из обработчика. Этой командой завершается обработчик в обязательном порядке. В Си любой компилятор так и делает. Фигурная скобка закрывающая тело обраюотчика и есть эта команда+восстановление контекста.
Первое что я сделал, переходя с асм на Си, это проверил обработчик прерывания после компиляции в ХС8. Там были все сохранения, восстановления и retfie. А с другими средами и компиляторами я дел не имел, не знаю как и что. Но вот запрещать прерывания при входе - это уж точно лишнее, в любом языке.
_________________ Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 89
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения