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

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

  1. rkit

    rkit Гуру

    Ацп выключали в первой строчке, а включать обратно кто будет?
     
  2. Stas0232

    Stas0232 Нерд

    Это перспективное желание. Точнее так: сперва научиться на более простом делать то, что выполняет интересные задачи, а потом уже переходить и переводить все на нормальное програмирование для МК с нормальной оптимизацией кода. А пока - простота и доступность :)

    Может подскажите какие-нибудь материалы для изучения avrdude (сишку не надо:D), которые опять же не льют много воды, не объясняются непонятными терминами, а более тактично и последовательно излагают материал?
     
  3. Stas0232

    Stas0232 Нерд

    А есть ли смысл выключать АЦП, если задействован режим SLEEP_MODE_PWR_DOWN? Он же и так вроде как все рубит, кроме wdt и асинхронного таймера.
    Честно признаюсь, что этот вопрос назрел из-за того, что не получается включить АЦП после выключения. Единственное, что нашел, так это вместо
    Код (C++):
    ADCSRA = 0;
    ставить
    Код (C++):
    ADCSRA &= ~(1 << ADEN);
    А включать
    Код (C++):
    ADCSRA |= (1 << ADEN);
    Подскажите как правильно и вообще нужно ли)
     
  4. rkit

    rkit Гуру

    Опять 25. Берете мультиметр и измеряете. Две минуты и точно ясно.
     
  5. Stas0232

    Stas0232 Нерд

    Ок, измерю. Так как же все таки правильно отключать и потом включать АЦП? Если можно подходящим для моей ситуации. И если можно прямо в командах на С.
     
  6. mcureenab

    mcureenab Гуру

    Код (C++):
    // выключать
    ADCSRA &= ~_BV(ADEN);

    // включать
    ADCSRA |= _BV(ADEN);
     
     
  7. Stas0232

    Stas0232 Нерд

    В общем вроде как с первоначальным вопросом разобрался. Есть какой-то косяк (может кто-то знает как его исправить, то подскажите как?) с записью скетча в контроллер через плату arduino, если поменять фьюзы на низкое энергопотребление. Решение оказалось простым (нашел это на нескольких сайтах, в том числе англоязычных) - заливать скетч через программатор (по SPI), можно тот же arduino с прошивкой ArduinoISP (скетч -> Загрузить через программатор).
    1. В файл .../arduino/hardware/arduino/avr/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. Соединяем arduino с МК на борту (не нужно вытаскивать из ардуинки МК) с нашим МК (Atmega328P-PU) через SPI:
    [​IMG]
    Для прошивки можно обойтись без резистора и кондеров. И внешний кварц нужен только если прежде фьюзы были выставлены на работу с внешним кварцем (например стандартная конфигурация Arduino UNO).

    3. Запускаем Arduino IDE.
    4. Загружаем в МК, который стоит на ардуинке скетч с ArduinoISP: Файл -> Примеры -> ArduinoISP.
    5. Выставляем нашу конфигурацию МК: Инструменты -> Плата -> Atmega328P (1.8v 1Mhz).
    6. Выставляем порт Ардуинки.
    7. Выставляем Программатор Arduino as ISP: Инструменты -> Программатор -> Arduino as ISP.
    8. И прошиваем гагрузчик: Инструменты -> Записать загрузчик.

    После этого в контроллере выставлена новая конфигурация (в моем случае для работы на пониженном напряжении 1.8 вольт, от встроенного генератора на частоте 1 MHz).

    *** И если теперь нужно загрузить в наш МК скетч, то ничего не меняем а просто открываем нужный скетч и загружаем через программатор: Скетч -> Загрузить через программатор.
    Обычная загрузка почему-то не рулит (если наш МК засунуть в плату Arduino).
    Но когда уже загрузили скетч, то можно спокойно работать как привыкли.
    Вот статья с картинками.
    В помощь картинка Arduino UNO с Atmega328P-PU на борту с расписанными пинами.

    С этой конфигурацией и кондерами на nrf МК начал исправно работать от CR2032 и передавать данные. Пока удалось измерить только до ~2.3 вольт. Ниже не хватает заряда для работы nrf. Да и при 2.6 вольт уже спячка перестает срабатывать нормально. А без nrf принять независимые данные не выходит, т.к. при подключении по UART походу идет паразитное питание и показания батареи и мультиметра странно разнятся.
     
    Последнее редактирование: 24 июл 2017
  8. Stas0232

    Stas0232 Нерд

    Назрел другой вопрос. Вроде наладил и обмен и работу... а вот с датчиком накосячил. Для DHT минимальное напряжение 3.3 вольта. Решил сделать для примера уличного датчика модуль с термистором и всего лишь измерять температуру.
    А вот вопрос(ы):
    1. Есть куча примеров для термистора на 10 кОм, но подойдет ли он для моего питания?
    2. Вообще термистор с каким сопротивлением нужно ставить при напряжении от 2 до 3 вольт?
    3. Есть ли отдельная схема и расчет термистора для питания 2-3 вольта? Попрошу подсказать где искать или скинуть готовые примеры.
     
    Последнее редактирование: 24 июл 2017
  9. parovoZZ

    parovoZZ Нерд

    BOD настраивал? А лучше отключить вовсе.
     
  10. Stas0232

    Stas0232 Нерд

    Ну вообще тема с этого и началась, чтобы перенастроить BOD :)
    Да и по идее смысла большого нет его отключать. Nrf работает минимально на 1.9 вольт, цифровые датчики с минимальным напряжением работы, которыми интересовался - от 2 вольт (пока не понял сколько нужно для ds18b20), сама atmega328p кто знает как начнет себя вести (особенно при старте), если отключить BOD. И самое веселое, что CR2032 сама имеет рабочее напряжение от 2 до 3 вольт.
     
  11. parovoZZ

    parovoZZ Нерд

    Как нет? Он жрет аки черт.