Там уже находятся указатели для каждой функции ISR пользователя (массив). Почему это вас не волнует? Если покопаться, то можно обнаружить, что Arduino Framework очень жирная библиотека. Пусть каждый читает документацию на avr gcc и использует прямую регистрацию обработчиков прерываний. Правда, сэкономить на этом не получится, если хотя бы один из обработчиков уже есть в этом массиве.
Какой тогда смысл во всей этой затее? Пишите всё вручную. Это вообще стандратный подход при программировании на avr. Все так пишут... нормальные программисты.
Я имел в виду какой смысл с Arduino Framework? Вы либо принимаете накладные расходы при её использовании, либо пишите всё сами. Если вы пользуетесь этой библиотекой, то уж разберитесь и с ней тоже, а не только с моим кодом, если так хочется покритиковать.
//Пусть каждый читает документацию .. и использует прямую регистрацию
//Пишите всё вручную.
//Вы либо принимаете .., либо пишите всё сами.
//уж разберитесь
Кто такой что повелеваеш кому чего делать? Без сопливых неплохо разбирались и будем далее. Знаеш поговорку, "не рассказуй что делать - не узнаеш куда пойти". Так пизуй кобыле в трещину со своими ЦУ!
Считаеш свой подход верным - твои проблемы. В лигу сексреформ уже написал - жди предсказаного ответа ;) Но есть значить мысль, что практика - она критерий истины, и если Петя четыре года не может средненький проект довести до ума, то наверно он чёт не так пишет и не слушает умных людей. А стало быть его практика порочна и подходы не верны.
Оказывается я не первый, кто сделал такую поддержку. Это уже обсуждалось на github'е (где содержится исходный код Arduino Framework и идёт общая над ним работа). Мне подсказали на основном форуме:
Т.е. в Arduino Framework это всё-таки будет включено, насколько я понял.
П.С. Если посмотреть на первоначальный код, то видно, что наши подходы почти одинаковы. В комментах они пошли дальше, исследуя накладные расходы и возможность использования lambda функций. Последнее ардуинщики вряд ли поймут.
Насколько я вижу, западные пользователи Arduino куда более вменяемые, нежели местные неадекваты.
Евгений, можно к вам тогда обратиться? Я просто новичёк. У меня есть проект на Arduino где мне нужно снимать показания с энкодеров, которые стоят на колёсах. Если счётчик прерываний делать статическим в классе Encoder , то он становится как бы общим для обоих колёс и выходит лажа. Мне нужно, чтобы pulses принадлежал конкретным объектам класса Encoder, но чтобы так сделать нужно передавать метод counter, где происходит итерация pulses, в качестве обработчика. Можно ли вообще другой способ организовать логику работы? А то закритиковали Uni много лет назад, я уже ничего не понял под конец чтива.
А то закритиковали Uni много лет назад, я уже ничего не понял под конец чтива.
вместо кода Уни посмотрите пример Логика в #39. Создайте для каждого экземпяра энкодера свой обработчик-обертку и вызывайте из нее счетчик нужного энкодера, да и все.
И функции-обработчики прерываний у Вас наверняка разные. А даже если одна (на PCINT), то легко определить с какого именно пина прерывание.
Ну а раз так, то кто Вам мешает при прерывании для левого колеса так прямо и вызывать
levoeKoleso.counter(pinVal);
ну и для правого соответственно.
Но это будет верно, если Вы сделаете counter методом, а pulses нормальным (нестатическим) членом. Сейчас counter у Вас не метод, а друг.
Неэстетично, конечно, зато дешево, надёжно и практично.
И да, кстати, когда будете объявлять метод, не забудьте сказать, что имеет дело с волатильной переменной. Т.е. его надо объявить волатильным методом. Это делается примерно так:
Там уже находятся указатели для каждой функции ISR пользователя (массив). Почему это вас не волнует? Если покопаться, то можно обнаружить, что Arduino Framework очень жирная библиотека. Пусть каждый читает документацию на avr gcc и использует прямую регистрацию обработчиков прерываний. Правда, сэкономить на этом не получится, если хотя бы один из обработчиков уже есть в этом массиве.
Какой тогда смысл во всей этой затее? Пишите всё вручную. Это вообще стандратный подход при программировании на avr. Все так пишут... нормальные программисты.
Какой тогда смысл во всей этой затее?
В какой затее? Это Вы затеяли, Вам и объяснять "какой смысл". По мне - так никакого.
Я имел в виду какой смысл с Arduino Framework? Вы либо принимаете накладные расходы при её использовании, либо пишите всё сами. Если вы пользуетесь этой библиотекой, то уж разберитесь и с ней тоже, а не только с моим кодом, если так хочется покритиковать.
... если так хочется ...
Нет, не хочется. Мне это неинтересно.
Петь, ты снова за старое?
//Пусть каждый читает документацию .. и использует прямую регистрацию
//Пишите всё вручную.
//Вы либо принимаете .., либо пишите всё сами.
//уж разберитесь
Кто такой что повелеваеш кому чего делать? Без сопливых неплохо разбирались и будем далее. Знаеш поговорку, "не рассказуй что делать - не узнаеш куда пойти". Так пизуй кобыле в трещину со своими ЦУ!
Считаеш свой подход верным - твои проблемы. В лигу сексреформ уже написал - жди предсказаного ответа ;) Но есть значить мысль, что практика - она критерий истины, и если Петя четыре года не может средненький проект довести до ума, то наверно он чёт не так пишет и не слушает умных людей. А стало быть его практика порочна и подходы не верны.
Оказывается я не первый, кто сделал такую поддержку. Это уже обсуждалось на github'е (где содержится исходный код Arduino Framework и идёт общая над ним работа). Мне подсказали на основном форуме:
Support extra parameter on `attachInterrupt()`
Т.е. в Arduino Framework это всё-таки будет включено, насколько я понял.
П.С. Если посмотреть на первоначальный код, то видно, что наши подходы почти одинаковы. В комментах они пошли дальше, исследуя накладные расходы и возможность использования lambda функций. Последнее ардуинщики вряд ли поймут.
Насколько я вижу, западные пользователи Arduino куда более вменяемые, нежели местные неадекваты.
западные пользователи Arduino куда более вменяемые, нежели местные неадекваты.
зато #Аллепонаш.. ой, всё
Здравствуйте, Uni. Можете помочь мою библиотеку прерываний переделать, чтобы она могла работать с методами класса?
Вот portchange.h
portchange.cpp
Здравствуйте, Uni. Можете помочь мою библиотеку прерываний переделать, чтобы она могла работать с методами класса?
Да я сам думал, что лучше на почту написать, тема то 5 лет назад была создана. Когда читал, так орал со срача
Евгений, можно к вам тогда обратиться? Я просто новичёк. У меня есть проект на Arduino где мне нужно снимать показания с энкодеров, которые стоят на колёсах. Если счётчик прерываний делать статическим в классе Encoder , то он становится как бы общим для обоих колёс и выходит лажа. Мне нужно, чтобы pulses принадлежал конкретным объектам класса Encoder, но чтобы так сделать нужно передавать метод counter, где происходит итерация pulses, в качестве обработчика. Можно ли вообще другой способ организовать логику работы? А то закритиковали Uni много лет назад, я уже ничего не понял под конец чтива.
Вот объявление класса
Вот определение метода
А то закритиковали Uni много лет назад, я уже ничего не понял под конец чтива.
вместо кода Уни посмотрите пример Логика в #39. Создайте для каждого экземпяра энкодера свой обработчик-обертку и вызывайте из нее счетчик нужного энкодера, да и все.
Может не очень изящно. зато просто и надежно
А то, что предложил Уни - ну уж слишком кривое.
vanro,
зачем плодить сущности? Такие вещи нужны когда у Вас до хрена объектов и они постоянно то создаются, то уничтожаются.
У Вас же всего два объекта и наверняка они объявлены глобально (по крайней мере ничто не мешает их так объявить), типа:
И функции-обработчики прерываний у Вас наверняка разные. А даже если одна (на PCINT), то легко определить с какого именно пина прерывание.
Ну а раз так, то кто Вам мешает при прерывании для левого колеса так прямо и вызывать
ну и для правого соответственно.
Но это будет верно, если Вы сделаете counter методом, а pulses нормальным (нестатическим) членом. Сейчас counter у Вас не метод, а друг.
Неэстетично, конечно, зато дешево, надёжно и практично.
И да, кстати, когда будете объявлять метод, не забудьте сказать, что имеет дело с волатильной переменной. Т.е. его надо объявить волатильным методом. Это делается примерно так:
Оно, конечно, умный компилятор по идее и сам это сделает, но я предпочитаю писать сам как надо.