Прерывания по таймеру
- Войдите на сайт для отправки комментариев
Всем привет. Суть в следующем - нужно 3-5 раз в секунду считывать состояние портов ввода вывода в предназначенные для этого переменные и затем выводить их состояние на экран. Все это уже реализовано но без прерываний. Имеем плату расширения портов ввода вывода и LCD шилд. Все это подключено по I2C. Решил сделать считывание портов по прерыванию таймера. Использовать решил библиотеку http://robocraft.ru/blog/arduino/614.html. Так же поключены библиотеки <MCP23xxx.h> <LiquidCrystal_MCP23x17.h>
void scanIOport() { portI = mcp23_in.digitalRead16(); portO = mcp23_out.digitalRead16(); }
Так вот суть проблемы в том что контроллер виснет сразу после запуска. Висяк вызван именно методом .digitalRead16(); Если вместо считывания присваивать переменным рандомные значения то все работает как часы. И дело похоже не в частоте опроса портов, так как ни 1 раз в 2 секунды ни 2 раза в секунду опрашивания не происходит. Имеем просто светящийся оранжевый экран. Программа не выполняет ни единой строчки из цикла loop(); пробовал и без использования библиотеки TimerOne - аналогично. пожоже конфликт с I2C?
MarioM, о том как , и в какое прерывание вы это засовывате -нужно самому догадываться?
Написал же что использую библиотеку TimerOne ( ссылку дал)
вот как инициализируется объект в этой библиотеке
вот в какое прерывание засунута моя функция :
вот как происходит привязывание
а если в кратце то пробовал и c TIMER1 и TIMER2 без использования библиотеки TimerOne. но с прерываниями я еще на Вы и подумал, что делаю что-то не так, поэтому и подключил библиотеку TimerOne, но результат аналогичный. Вообще позволяет ли Ардуина работать с I2C по прерыванию?
MarioM, могу только высказать предположение. Где-то видимо используется прерывание, а запуск некоего кода, использующего прерывания из-под другого прерывания по-умолчанию запрещён. Попробуйте разрешить, может прокатит. Лучше пробывать без timerOne . Опция используется так: ISR(XXX_vect, ISR_NOBLOCK)
MarioM, могу наврать, но по-моему функция по указателю не так вызывается.
Как правильно - не помню, спишите откуда-нибудь. Я сам всегда списываю. :)
-----
Upd: Вот так попробуйте:
Для примера, PORTC5 переключается раз в секунду а PORTC4 раз в max_tick секунд.
dimax, спасибо заработало но не без глюков. Буду дальше копать.