Выбор типа кода при загрузке

Тема в разделе "Arduino & Shields", создана пользователем sanik, 28 ноя 2020.

  1. sanik

    sanik Гик

    Полистав интернет я встречал тему как выбирается например тип платы и в зависимости от типа объявляются различные пины.
    Но не как не пойму как решить мою задачу
    Хочется при первой загрузки считывалась ячейка из EEPROM и контролер выбирал какой из трех кодов использовать Но что то не хватает знания. Подскажите как это реализовать? Что то вроде этого
    Код (C++):
    #include <EEPROM.h>
    #include <LiquidCrystal_I2C.h>
    LiquidCrystal_I2C lcd(0x27, 16, 2); //SDA -  А4 ,SCL - А5
    byte T = EEPROM.read(50);
    if(T ==1){
      Typ1;
    }
    #ifdef Typ 1 //работаем с первым кодом
    #include "DHT.h"
    #ifdef Typ 2 // работаем со вторым кодом
    #include <Wire.h>
    #include <SHT2x.h>
    #else // работаем с третьим кодом
    #include <DallasTemperature.h>
    #include <OneWire.h>
    #endif
     
    Последнее редактирование: 28 ноя 2020
  2. Nekto_nikto

    Nekto_nikto Гик

    Как вариант можно в следующую ячейку EEPROM писать значение флага, который будет означать что загрузка не первая, только для чего я не понимаю, т.к. в первую ячейку то значение вы будете писать как мне это видится....
     
  3. sanik

    sanik Гик

    Переменная Т это и есть флаг при первом включении будет выпадать меню с выбором типа устройства после этого будет перезагрузка И устройство будет выполнять уже нужный блок кода. Просто в зависимости от блока нужен выбор пинов и подгружаемых библиотек
     
  4. sanik

    sanik Гик

    Сейчас у меня ругается на условие if :)
     
  5. sanik

    sanik Гик

    Уточняю вопрос Как записать условие которое проверяло бы чему равен флаг Т?
     
  6. Airbus

    Airbus Радиохулиган Модератор

    if(T) если Т флаг то он или True или False. Или ноль или Не ноль а любое число
     
  7. Airbus

    Airbus Радиохулиган Модератор

    А не проще это делать в Setup?Крутиться там в while до выбора нужного флага?А потом после выбора выполнять нужный блок?
     
  8. a1000

    a1000 Гуру

    Если я правильно понял, вы условие if ставите не в setup и не в loop а до них. Боюсь ошибиться, но там не может быть исполняемых команд.
    И ещё
    откуда вы будете подгружать библиотеки?
     
  9. sanik

    sanik Гик

    Условие if как в коде не подходит компилятор ругается error: expected unqualified-id before 'if'
    булевая не подходит так как три блока кода в одном например участвует DHT в другом SHT в третьем DS18 Соответственно Для каждого нужна своя библиотека все три подключать не хочется
    Проще но нужно чтоб пользователь выбрал к примеру тип датчика и все при следующей загрузки ардуино подключит соответствующую библиотеку и номер пина То есть нужно отключить не нужное как задефайнить :) ненужные библиотеки я разобрался А вот как при прочтении EEPROM указать какой из трех #define выбрать не получается у меня
    Код (C++):
    byte T = EEPROM.read(50); // как прочитав значение с ячейки выбрать нужный #define

    #define 1

    #define 2

    #define3

    #ifdef 1
    #include "DHT.h"
    #ifdef 2
    #include <SHT2x.h>
    #else
    #include <DallasTemperature.h>
    #include <OneWire.h>
    #en
     
  10. sanik

    sanik Гик

    Да правильно условие там не выполняется Я пытаюсь разобраться в Директивах препроцессора в Arduino
     
  11. a1000

    a1000 Гуру

    Так я вас растрою - директивы выполняются на этапе компиляции. В итоговый hex файл они не транслируются.
     
    Daniil нравится это.
  12. sanik

    sanik Гик

    Получается вариантов нет и придется подключать все библиотеки? Спасибо!
     
  13. a1000

    a1000 Гуру

    Ну а как по другому. Только библиотеки вы подключаете не к прошивке а к проекту. Это разные вещи. Когда код компилируется в чистый и незамутнённый ASM, компилятор выбирает из библиотек только задействованные функции. Если вы подключите лишнюю библиотеку и не будете её использовать, то в итоговом hex от неё ничего и не будет.
    Ну а ваша задумка вполне работоспособна, но направление реализации не совсем верное. Пробуйте по варианту предложенному Airbus
     
  14. parovoZZ

    parovoZZ Гуру

    Используй NOINIT переменные. Такие переменные инициализируются сразу после подачи питания и исполнения кода. При ресете сохраняют своё значение. При сбросе питания цикл повторяется заново.
     
  15. Airbus

    Airbus Радиохулиган Модератор

    Тут вот в чем дело- если флаг писать в ЕЕПРОМ то при новой загрузке он будет считываться и выполнять тот же блок кода что и ранее. Тоесть чтобы поменять устройство или его функции ( блок кода) надо снова ловить и выбирать а потом снова перезагружать.Вам оно надо? Плюс в том что при пропадании питания и его появлении снова устройство вспоминает что оно делало До Того. Мой вариант при подаче питания каждый раз ждет команды выбора в setup и безвыбора ничего не делает.
    Ясен пень нет. Если нет в коде нужной либы то как он будет работать? Это Вам не скрипты
     
  16. Airbus

    Airbus Радиохулиган Модератор

    Я вообще такие вещи делаю аппаратно. Есть джампер на несколько пинов по числу блоков кода. Он замыкает пин на GND. В коде если замкнут джампер 1 делать А если замкнут 2 делать В если замкнут джампер 3 делать С. Если ничего не замкнуто мигать светодиодом или делать еще что то. Джамперы можно оперативно дергать на работающем МК и оперативно менять алгоритм работы
     
    a1000 и Vovka нравится это.
  17. a1000

    a1000 Гуру

    Попробовал поискать на просторах интернета что-же такое NOINIT переменные. Нашёл очень мудрёное описание
    Тоесть всётаки SRAM.
    Обратимся непосредственно к железу. В процессе знакомства с ассемблером я усвоил, что МК имеет три сегмента памяти, определяемые директивами.
    .DSEG - SRAM
    .CSEG - FLASH
    .ESEG - EEPROM
    В SRAM, после рестарта, не может содержаться ничего кроме мусора вызванного случайными флуктациями зарядов. Обычто её при старте принудительно обнуляют. Следовательно NOINIT переменные в SRAM попадают из другого сегмента. Остаются FLASH и EEPROM. В FLASH данные при рестарте сохраняются, но изменить их можно только перепрошивкой. Остаётся EEPROM, который удовлетворяет всем требованиям. Откуда шли, туда и пришли. Если я правильно понял NOINIT переменные это мудрёный способ работы с EEPROM?
     
  18. parovoZZ

    parovoZZ Гуру

    Не рестарта, а подачи питания. Ресет никак не воздействует на SRAM.
     
  19. parovoZZ

    parovoZZ Гуру

    Нет. На это никто ни тратит ни время, ни программный код. Инициализируют только ту область SRAM, в которой размещаются переменные.
     
  20. parovoZZ

    parovoZZ Гуру

    Нет. NOINIT, например, позволяет узнать причину перезагрузки по вачдогу. Ну и ещё масса применений.
    Аналог еепром- это persistent в МК на FRAM.