Конфликт SoftwareSerial и avr/interrupt.h
- Войдите на сайт для отправки комментариев
Сб, 19/10/2019 - 18:09
Здравствуйте, собственно сабж. Гуглить пытался, нашел даже похожую тему на этом форуме. Но разобраться пока не смог.
Собственно SoftwareSerial включен в библиотеку <ModbusRtu.h>. С помощью avr/interrupt.h реализую прерывания PCINT1 и PCINT2. Как только добавляю в скетч функцию обработчика прерываний
ISR(PCINT1_vect){ } ISR(PCINT2_vect){ }
При компиляции вываливается ошибка:
libraries\SoftwareSerial\SoftwareSerial.cpp.o (symbol from plugin): In function `SoftwareSerial::read()': (.text+0x0): multiple definition of `__vector_4' sketch\controller_01.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here libraries\SoftwareSerial\SoftwareSerial.cpp.o (symbol from plugin): In function `SoftwareSerial::read()': (.text+0x0): multiple definition of `__vector_5' sketch\controller_01.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here collect2.exe: error: ld returned 1 exit status exit status 1 Ошибка компиляции для платы Arduino Nano.
Открывал исходники обоих библиотек ни __vector_4, ни __vector_5 там нет. Подскажите куда копать.
Потупил еще файл SoftwareSerial.cpp
Там блин есть ссылки на PCINT:
Похоже не получится совместно использовать эти прерывания с SoftwareSerial(((
Если с умом, то получится.
Если с умом, то получится.
не, не все здесь "Пётр Петрович Гарин", с его мозгом )))
Да уж, прогялдел обработчики прерываний в softwareserial.cpp. Все векторы обозначены. Ума не приложу как их второй раз заюзать.
Два раза нельзя, надо эти модифицировать
Два раза нельзя, надо эти модифицировать
Не подскажете, что именно, у меня такая же бодяга с CustomSofwareSerial, а хочется освободить любое из прерываний для энкодера
Здесь, или не только здесь?
Начинает компилироваться по крайней мере )))
Проверено! Работает!
Два раза нельзя, надо эти модифицировать
Не подскажете, что именно, у меня такая же бодяга с CustomSofwareSerial, а хочется освободить любое из прерываний для энкодера
Здесь, или не только здесь?
Начинает компилироваться по крайней мере )))
Проверено! Работает!
Заме так? Это грубо. Просто добавь свой хендлер к чужому.
Ведь если софт-сериал не "листен", то его хендлер нифига не работает - в него просто вход и тут же выход.
Лучше модифицируй чужой код не ломая его. Хотя дело твоё, конечно.
Два раза нельзя, надо эти модифицировать
Не подскажете, что именно, у меня такая же бодяга с CustomSofwareSerial, а хочется освободить любое из прерываний для энкодера
Здесь, или не только здесь?
Начинает компилироваться по крайней мере )))
Проверено! Работает!
Заме так? Это грубо. Просто добавь свой хендлер к чужому.
Ведь если софт-сериал не "листен", то его хендлер нифига не работает - в него просто вход и тут же выход.
Лучше модифицируй чужой код не ломая его. Хотя дело твоё, конечно.
благодарю конечно, но это выше моего понимания процессов происходящего... сейчас в теле программы вызываю так:
ISR(PCINT0_vect) {
encoder.tick(); //
}
encoder.tick() это объект библиотеки RotaryEncoder, не понимаю, каким образом это скомпилируется
PS пишет - не задекларировано, если задекларировать, то и реализовывать надо внутри библиотеки либо как-то указывать, что функция внешняя...одни непонятки...
а перенести свои нужные пины на другой PCINT и нужный закомментировать в библиотеке, я так делал
я так и сделал, высвободил PCINТ0, но Дракула говорит, что некомильфо и я с ним согласен, по нормальному надо дописать в нужное прерывание свой обработчик только как его сделать внешним, а совсем правильно дописать в эту функцию менеджер обработчиков, какому из обработчиков передавать управление, тогда и "овцы целы и волки сыты" но это совсем уровень не начинающего )))
Тогда уж совсем радикально : использовать software serial только для отладки, в готовом устройстве убрать его, а с устройством работать по hw uart
Тогда уж совсем радикально : использовать software serial только для отладки, в готовом устройстве убрать его, а с устройством работать по hw uart
так библиотека от DetSimen и писалась в расчёте на то, что в режиме отладки будет использоваться CustomSoftwareSerial, а в боевом режиме, можно перекомпилировать на любой хардварный. вплоть до USB, для этого она завёрнута в поправленную библиотеку SomeSerial (поддержка 8N2)
ЗЫ даже если использовать хардваре, компилятор всё одно будет орать на двойное определение
Тем более, какая разница комильфо или нет, все равно в рабочем режиме это использоваться не будет.
прерывание, это задел на возможные проблемы с энкодером, он будет давать от 400 до 1000 импульсов на оборот, боюсь будут пропуски...
Я вот так использую оба uart, в итоговом просто отключу лог
прерывание, это задел на возможные проблемы с энкодером, он будет давать от 400 до 1000 импульсов на оборот, боюсь будут пропуски...
Тут не важно сколько на оборот. Тут важно сколько раз в секунду.
у тя всё просто, у меня всё сложнее, порт надо подсовывать другой библиотеке и, она должна его переварить, со всеми его параметрами...
прерывание, это задел на возможные проблемы с энкодером, он будет давать от 400 до 1000 импульсов на оборот, боюсь будут пропуски...
Тут не важно сколько на оборот. Тут важно сколько раз в секунду.
от 1000 до 5000
Тут не важно сколько на оборот. Тут важно сколько раз в секунду.
от 1000 до 5000
Ну, если делать по уму, то никаких проблем с пропусками при такой частоте быть не должно. Можно хоть INT0/1 использовать, хоть PCINT1/2/ Хотя на INT0/1 проще - не надо с демультиплексированием заморачиваться.
Тут не важно сколько на оборот. Тут важно сколько раз в секунду.
от 1000 до 5000
Ну, если делать по уму, то никаких проблем с пропусками при такой частоте быть не должно. Можно хоть INT0/1 использовать, хоть PCINT1/2/ Хотя на INT0/1 проще - не надо с демультиплексированием заморачиваться.
Этим и занят, освобождением прерываний )))
Ну, если делать по уму, то никаких проблем с пропусками при такой частоте быть не должно. Можно хоть INT0/1 использовать, хоть PCINT1/2/ Хотя на INT0/1 проще - не надо с демультиплексированием заморачиваться.
Этим и занят, освобождением прерываний )))
[/quote]
А чего их освобождать? INT1 и так свободен. Если надо обязательно INT0 то можно взять другой софт сериал - https://github.com/PaulStoffregen/AltSoftSerial этот INT0 не использует
Другие на поддерживают передачу параметров порта, 8N2 в частности, у меня используется кастомный вариант оной либы
Другие на поддерживают передачу параметров порта, 8N2 в частности, у меня используется кастомный вариант оной либы
Ну ОК, а чем INT1 не устраивает?
Другие на поддерживают передачу параметров порта, 8N2 в частности, у меня используется кастомный вариант оной либы
Ну ОК, а чем INT1 не устраивает?
заняты
В принципе понятно, что надо сделать, но хочется правильно, не верится, что компилятору нельзя сказать, что если если какой-то PCINT не используется то и конфликта из-за двойного определения нет )))
поправил библиотеку так, но что мне подсказывает, что тоже костыли:
А в теле программы функция реализована так:
осталось попробовать перенести софтовый сериал на пины этого же PCINT и напасматреть их совместную деятельность )))
Перенёс на D11 и D12, PCINT0 прекрасно разделяется между процедурами обработки софтового серийного порта и обработчиком Энкодера
подумал подумал, ничего умнее чем обернуть в кастомной библиотеке CustomSofwareSerial в такую конструкцию не придумал: ЗЫ в SofwareSerial всё точь в точь )))
в файле CPP
Интересно, кто-то решил эту проблему по человечески?
Вопрос решения конфликта по фэншую всё ещё актуален! Может есть у кого, что сказать?