Замена #define и #if...#endif на опрос входов МК
- Войдите на сайт для отправки комментариев
Добрый день.
Есть скетч, котрый компилируется под разное железо, путем выбора нужного режима. При этом выводы МК конфигурируются по-разному:
#define VALUE_1 1 #define VALUE_2 2 #define VALUE_3 3 #define VALUE_TYPE VALUE_1 //в зависимости от конфигурации железа, выбираем нужное значение VALUE_1...VALUE_3 const uint8_t PresetNum = 3; // в зависимости от выбранного VALUE_1...VALUE_3 объявляем нужный вывод МК #if VALUE_TYPE == VALUE_1 const uint8_t pinControl = 3; #elif VALUE_TYPE == VALUE_2 const uint8_t pinControl = A3; #elif VALUE_TYPE == VALUE_3 const uint8_t pinControl = A0; #endif void setup() { #if VALUE_TYPE == VALUE_3 for (int pin = 0; pin < PresetNum; pin++) pinMode(pinControl+pin, INPUT); //потому что нужны подряд А0...А2, и к + питания не подтягивать #else pinMode(pinControl, INPUT); #endif #if VALUE_TYPE == VALUE_1 attachInterrupt(digitalPinToInterrupt(pinControl), func, CHANGE); #endif } void loop() { #if VALUE_TYPE == VALUE_1 digitalRead(pinControl); #elif VALUE_TYPE == VALUE_2 analogRead(pinControl); #elif VALUE_TYPEE == VALUE_3 for (int pin = 0; pin < PresetNum; pin++) digitalRead(pinControl+pin)); #endif } #if VALUE_TYPE == VALUE_1 void func() { digitalRead(pinControl); // и дальше куча вычислений полученного с входа } #endif
Из этого кода убрано "лишнее", но структура сохранена именно так.
С подходом к конфигурированию в скетче есть неудобство - надо иметь 3 версии прошивки+лазить что-то перепрошивать.
Есть идея заменить конфигурирование через #define на аналог dip-переключателей, благо свободные выводы МК есть. При этом, в зависимости от состояния переключателей, нужный режим будет подобран автоматически, при включении МК.
Попытка модификации скетча:
#define VALUE_1 1 #define VALUE_2 2 #define VALUE_3 3 #define VALUE_TYPE VALUE_1 //в зависимости от конфигурации железа, выбираем нужное значение VALUE_1...VALUE_3 const uint8_t PresetNum = 3; // в зависимости от выбранного VALUE_1...VALUE_3 объявляем нужный вывод МК #if VALUE_TYPE == VALUE_1 // const uint8_t pinControl = 3; #elif VALUE_TYPE == VALUE_2 const uint8_t pinControl = A3; #elif VALUE_TYPE == VALUE_3 const uint8_t pinControl = A0; #endif void setup() { pinMode (10, INPUT_PULLUP); //попробуем заменить VALUE_1 pinMode (11, INPUT_PULLUP); pinMode (12, INPUT_PULLUP); if (digitalRead (10)) { const uint8_t pinControl = 3; //и уберем эту строку из #if ... } #if VALUE_TYPE == VALUE_3 for (int pin = 0; pin < PresetNum; pin++) pinMode(pinControl+pin, INPUT); //потому что нужны подряд А0...А2, и к + питания не подтягивать #else pinMode(pinControl, INPUT); #endif //#if VALUE_TYPE == VALUE_1 If (digitalRead (10)) { attachInterrupt(digitalPinToInterrupt(pinControl), func, CHANGE); //#endif } } void loop() { #if VALUE_TYPE == VALUE_1 digitalRead(pinControl); #elif VALUE_TYPE == VALUE_2 analogRead(pinControl); #elif VALUE_TYPEE == VALUE_3 for (int pin = 0; pin < PresetNum; pin++) digitalRead(pinControl+pin)); #endif } //#if VALUE_TYPE == VALUE_1 If (digitalRead (10) { void func() { digitalRead(pinControl); // и дальше куча вычислений полученного с входа } //#endif }
В итоге модификаций, появляется ошибка на строке 46 - не объявлена переменная pinControl
Скорее всего будет и ошибка по функции func.
Вопрос к общественности - решение такой проблемы реально, или без серьезного перелопачивания всего и вся затея бесперспективная?
Где можно посмотреть на аналогичные примеры?
вместо 12 строки (и 14)
и value определено или нет? 10 строку раскомментировтаь
Вполне реализуемо.
Понадобится всего 2 пина.
Value определить как переменную.
В setup делать проверку.
Типа такой:
Value=1+digitalRead(pin1)+digitalRead(pin2);
В итоге на выходе переменная будет принимать значения от 1 до 3.
Ну и дальше уже в зависимости от этого значения реализовывать в коде
В исходном коде нужно учитывать, что "пины сподряд А0...А2" ,это пины 14,15,16
Спасибо за наводки в нужные стороны! Получилось.
В итоге код с отказом от #define и # if... работающий как надо, и без ошибок в общем алгоритме железяки вышел такой:
Может кому пригодится из новичков. По идее в, 16 строке подкорректировав условие, можно получить еще одну комбинацию (всего возможно 4-е по 2-м джамперам (dip-переключателям)). Но по факту уложился в требуемые 3. Теперь поставил нужный режим, нажал сброс и железяка работает в другом алгоритме без плясок с перепрошивкой.
Разделом ошибся,
Видно же, что ему нужно от максимально функционального кода нужно перейти к максимально внятному
а если и далее расширяться то Value = 4*digitalRead(pin3)+2 * digitalRead(pin2) + digitalRead(pin1); ;-)))
Никак, и нет тут бага.
Все тупо до безумия.
Нет перемычек, вариант 1, одна перемычка(пофигу где) вариант 2, две перемычки, вариант 3.
собрано по ИЛИ; исключающее ИЛИ; И... а вам предложили дешифратор.