Atmega328P 1.8 вольт (CR2032 или ААх2)

Тема в разделе "Микроконтроллеры AVR", создана пользователем Stas0232, 17 июл 2017.

  1. Stas0232

    Stas0232 Нерд

    Добрый день.
    Исходя из названия задача в следующем. Нужно запитать Atmega328P-PU (без Ардуино и обвязок) от батарейки-таблетки CR2032 (или от двух АА). Т.е. 3v 210+ mAh. Прочитал из даташита, что атмега может работать начиная от 1.8 до 5.5 вольт и от 0 до 4 MHz. Устраивает вариант 1.8v+ и 1MHz. Нашел пример, где достигнута такая возможность. Я попробовал и его вариант с редактированием файла boards.txt и еще несколько. А так же вариант, где с помощью калькулятора выставил фьюзы. Все варианты после некоторой доработки успешно прошиваются в МК. А вот дальше как раз таки косяк. При загрузке программы (загружаю стандартный Blink) выдает:
    Код (Text):
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00
    и так 10 раз.

    Вот вставка в файл boards.txt
    Код (Text):
    battery.name=Atmega328P (1.8v 1Mhz)

    battery.upload.tool=avrdude
    battery.upload.protocol=arduino
    battery.upload.maximum_size=30720
    battery.upload.maximum_data_size=2048
    battery.upload.speed=19200

    battery.bootloader.tool=avrdude
    battery.bootloader.low_fuses=0x62
    battery.bootloader.high_fuses=0xD9
    battery.bootloader.extended_fuses=0xFE
    battery.bootloader.unlock_bits=0x3F
    battery.bootloader.lock_bits=0x0F
    battery.bootloader.file=atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex

    battery.build.mcu=atmega328p
    battery.build.f_cpu=1000000L
    battery.build.board=AVR_ATMEGA_1MHZ
    battery.build.core=arduino
    battery.build.variant=standard
    Подскажите что нужно и чего может не хватать для работы в заданной конфигурации?
     
  2. Green

    Green Нерд

    19200 не катит на 1мгц. Соотв-но и бут нужно переделывать.
     
  3. Stas0232

    Stas0232 Нерд

    Спасибо за наводку. Только если возможно попрошу более конкретные варианты реализации.
    Можно более "на пальцах" что на что заменить, чтобы заработало (как бы это бонально не звучало)? Какую скорость выставить? Попробовал 9600 и 4800 - результат тот же :( . Знал бы что и куда копать - повременил бы еще с форумом.

    P.S. Насчет конкретики. Я понимаю что может для кого-то это бонально, а кому-то тупо лень. Но дело в другом. Помочь и мне и другим пользователям разобраться в том, как возможно завести МК и успешно работать при > 1.8 вольт. Часто на форумах много воды и советов типа "читайте мат. часть". Но как ни странно чаще всего на форум пишут для того, чтобы получить конкретные ответы реализации или когда закончились свои варианты и нужна конкретная помощь. Вода не помогает!
     
  4. Tomasina

    Tomasina Иномирянин

  5. mcureenab

    mcureenab Гуру

    На кой вам бутлоадер? Заливайте МК через ISP.
     
  6. mcureenab

    mcureenab Гуру

    ATtiny48 работает от двух NiMh аккумуляторов. Частота 1МГц. Даже не знаю какие сложности?
    Прошивается через ISP 5 Вольт.
     
  7. rkit

    rkit Гуру

    Шейте через программатор, с кнопкой шифт. Загрузчик изменять - геморрой тот еще.
     
  8. Stas0232

    Stas0232 Нерд

    Tomasina, спасибо. Уже читаю. Многое из этого ранее изучал.
    Уточню ситуацию.
    WDT уже настроил. Прогу в принцепе написал. использую Atmega328P и nRF24L01+.
    Задача: измерить *что либо* - передать на приемник - заснуть. И так по кругу с таймаутом. И все это от батарейки CR2032.
    Подключал от батарейки и скетч работает. Но ровно до момента передачи. Когда начинается непосредственная работа с nRF24L01+, то атмега ребутиться (как я понял).
    Заливал счетч без работы с nRF24L01+ и все норм работало и уходило в сон от той же CR2032.
    В теории понятно, что не хватает питания. Точнее, что питание просаживается ниже BOD. И как понимаю BOD сейчас 2,7в. Поэтому и нужно понизить BOD до 1.8в, чтобы атмега не уходила в ребут.
    Ну вот именно поэтому мне и нужно работа при 1.8 v и 1 MHz.
     
  9. rkit

    rkit Гуру

    Неправильно. Вам нужна батарейка, способная выдать достаточный ток. Такой провал в питании в любом случае приведет к сбоям.
     
  10. Stas0232

    Stas0232 Нерд

    наверное я пока не до конца понимаю работу бутлоадера. Я и так заливаю через ISP. Но когда встречается описание как сделать из ардуинки програматор и заливать через ISP таже всегда пишут, что фьюзы нужно менять при прошивке. Может я неправильно делаю.
    Делаю из ардуинки програматор - меняю фьюзы в boards.txt - записываю загрузчик через Arduino as ISP, выставив плату со своими фьюзами - потому заливаю скетч в свою перепрошитую атмегу, опять же в плату со своими фьюзами.
    Как это правильно нужно делать?
    Насчет этого поподробнее. пока не понял какой программатор и при чем тут кнопка шифт? Выходит ничего не понял:)
    Есть желание сделать на ATtiny85V но там корпус не DIP. Насчет ATtiny48 нужно изучить. Остается еще возможность питать не от двух NiMh аккумов, а от одной CR2032.
     
    Последнее редактирование: 19 июл 2017
  11. Stas0232

    Stas0232 Нерд

    А кондер какой не спасет? Дело в том, что как-то же на таблетке реализуют похожие проекты. Правда там CR2450. Но все равно же 3v напруги.
     
  12. rkit

    rkit Гуру

    Может и спасет. Я не экстрасенс. Ваше поделие - измеряйте, считайте, пробуйте.
     
  13. mcureenab

    mcureenab Гуру

    Действительно, в Arduino IDE фьюзы устанавливаются командой загрузки бутлоадера. Но, бутлоадер может быть пустым. По крайней мере для ATtiny45 это так.
    Чтобы настроить ATtiny45 на работу с внешним кварцем, я в Arduino IDE выбрал вариант МК ATtiny45, Внешний кварц, 8 МГц. И выполнил загрузку бутлоадера. Понятно, никакой бутлоадер на ATtiny45 не загрузился (его просто нет), но фьюзы прошились. МК работает от внешнего кварца.

    От двух NiMh Eneloop аккумуляторов с 8МГц кварцем МК не завелся. Кварц поменял на 1МГц и все заработало. Только функция millis() считает в 8 раз медленнее. Чтобы время правильно считалось, нужно настроить конфигурацию МК в boards.txt.

    Литиевые батарейки-таблетки хороши тем, что их напряжение слабо зависит от износа. Например ЖК экран на 3 Вольта будет хорошо работать от литиевой батарейки без всяких стабилизаторов.
     
  14. mcureenab

    mcureenab Гуру

    Есть даташит на батарейку.

    http://data.energizer.com/pdfs/cr2032.pdf
     
  15. Stas0232

    Stas0232 Нерд

    Спасибо, собираюсь прикупить ATtiny45 или ATtiny85 и буду пробовать. Единственное я не нашел возможность работы на низком напряжении в корпусе PID в продаже (т.е. ATtiny85V). Только SOIC.
    А что все же делать для настройки Atmega328P для такой работы?

    UPD: я тут косяконул. Не PID, а DIP.
     
    Последнее редактирование: 19 июл 2017
  16. parovoZZ

    parovoZZ Нерд

    Забыть про ардуино и изучить дудку. Писать на С. Тактироваться от внутреннего осциллятора. Кондером на nrf не увлекаться - 10 мкФ достаточно. Ведь всю энергию, которую он отдаст, он тут-же заберет от батарейки. Не забывать, что nrf по даташиту работает от 1.9 в. У меня от двух AA такая связка работает крайне стабильно. Кварц внешний на 8 МГц.
     
  17. mcureenab

    mcureenab Гуру

    От двух АА батареек или аккумуляторов?
     
  18. mcureenab

    mcureenab Гуру

    Сейчас ATtiny45 с кварцем 4МГц работает от 2.2 Вольт.
     
  19. Green

    Green Нерд

    Не PID, а DIP. Пид это с другой оперы.)
    Pro Mini со стандартным boot-ом и nRf24L01+ от 2032 "пашет как первый советский трактор".
     
    Последнее редактирование: 19 июл 2017
  20. Stas0232

    Stas0232 Нерд

    Сорян, напутал с DIP PID)) Но думаю смысл был понятен.
    Назрел другой вопрос. Тут и тут вычитал и применил у себя в проекте измерение напряжения питания. После подбора константы реально вполне точные данные выдает. Ставлю стандартную функцию с небольшими доработками:
    Код (C++):
    float readVcc() {
      byte i;
      float result = 0.0;
      float tmp = 0.0;

      for (i = 0; i < 5; i++) {
        // Read 1.1V reference against AVcc
        // set the reference to Vcc and the measurement to the internal 1.1V reference
        #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
            ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
        #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
            ADMUX = _BV(MUX5) | _BV(MUX0);
        #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
            ADMUX = _BV(MUX3) | _BV(MUX2);
        #else
            // works on an Arduino 168 or 328
            ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
        #endif

        delay(75); // Wait for Vref to settle
        ADCSRA |= _BV(ADSC); // Start conversion
        while (bit_is_set(ADCSRA,ADSC)); // measuring

        uint8_t low  = ADCL; // must read ADCL first - it then locks ADCH
        uint8_t high = ADCH; // unlocks both

        tmp = (high<<8) | low;
        tmp = (1.1 * 1023.0) / tmp;
        result = result + tmp;
        delay(5);
      }

      result = result / 5;
      return result;
    }
    и задержку 1 сек - работает как нужно. Через каждую секунду с хвостиком выдает актуальное напряжение. Проверяю через потенциометр.

    Но когда ставлю сон по WDT:
    Код (C++):
    void sleep() {
      // disable ADC
      ADCSRA = 0;
     
      // clear various "reset" flags
      MCUSR = 0;  
      // allow changes, disable reset
      WDTCSR = bit (WDCE) | bit (WDE);
      // set interrupt mode and an interval
      WDTCSR = bit (WDIE) | bit (WDP3) | bit (WDP0);    // set WDIE, and 8 second delay
      wdt_reset();  // pat the dog

      set_sleep_mode (SLEEP_MODE_PWR_DOWN);
      sleep_enable();
      // turn off brown-out enable in software
      MCUCR = bit (BODS) | bit (BODSE);
      MCUCR = bit (BODS);
      sleep_cpu ();

      // cancel sleep as a precaution
      sleep_disable();
    }
    то перестает работать. Постоянно выдает напряжение, которое в первый раз посчитало после старта.
    Т.е. если стартовал на ~3.3 вольт то вывожу на потенциометре ~5 вольт, но все равно показывает что 3.3 вольта. Перезагружаю МК и он после старта показывает актуальное напряжение с которым стартовал и если понижаю, то все равно показывает то же самое напряжения.

    Если еще более просто, то без WDT - работает, включаю функцию sleep() - перестает работать. Функция sleep() не зарезервированная и имеет другое название, это для примера.

    Кто знает как заставить работать?