AVR пробуждение от прерывания по изменению пина

Поделиться
HTML-код
  • Опубликовано: 17 ноя 2024

Комментарии • 16

  • @stanislavdambrauskas1101
    @stanislavdambrauskas1101 4 года назад

    Алексей, несколько раз пытался перейти с ардуино на PlatformIO. Благодаря Вашим урокам остановился на PLatformIO основательно. Просьба продолжать Ваше дело не смотря ни на что. Помните, мы в ответе за тех кого приручили:) из тем, с которыми у меня возникли вопросы esp8266, хранение настроек во флешпамяти и их загрузка при сбое напряжения ( продолжение программы с места сбоя), примеры настройки распределения памяти для esp, команды lua, nodemcu из среды PlatformIO.

  • @ArtemKAD1
    @ArtemKAD1 4 года назад

    Когда используешь PWD_MODE периферия выключается сама. По сути он так-же как и биты PRR отключает её тактирование. Остается только то, что не требует тактирования и WDT если включен.

  • @serg7535
    @serg7535 4 года назад

    ардуино про мини с выпаенным стабилизатором в режиме повердаун но с включенным внутренним сётчиком который отсчитывает время до повторного включения потребляет 7-9 микроампер, питание от 3в.

  • @alekseynikitin3354
    @alekseynikitin3354 4 года назад

    Спасибо познавательно!
    Но зачем нужны строчки power_all_disable() и power_all_enable()? Я думал режим SLEEP_MODE_PWR_DOWN и так отключает всю периферию, кроме ADC и BOD.

  • @digermpt
    @digermpt 4 года назад

    Спасибо! Взял на вооружение.

  • @androidpasha
    @androidpasha 4 года назад

    Собирал часы на atmega8. Подтверждаю что возможно потребление 10 микроампер во сне. При этом еще и таймер в асинхронном режиме работает с часовым кварцем 32кГц считая время. 7 лет уже часы считают от АКБ 720мА, ни разу не заряжал. 7сегментные индикаторы зажигаются от внешнего питания без подзарядки АКБ. Просто отключать всю перифирию нужно. В атмеге328 с этим проще, в ней регистр отклчения периферии есть. ruclips.net/video/IY8YyFwUa60/видео.html

  • @urmax3075
    @urmax3075 4 года назад

    Можно ли этот пример сделать на atmega8? Будет ли работать также?

    • @smprohd
      @smprohd 4 года назад

      Там старый стиль именования регистров, что-то придется переделывать.

    • @androidpasha
      @androidpasha 4 года назад

      Там нет прерывания от всех пинов. На сколько помню INT0, INT1. Даташит полистайте, он переведенный есть.

  • @МишаМихайлов-е4ф
    @МишаМихайлов-е4ф 4 года назад

    Спасибо!

  • @davidkain9046
    @davidkain9046 4 года назад

    а как вы в VS пишите под ардуино?

    • @alexmorozov73
      @alexmorozov73  4 года назад +2

      PlatformIO

    • @verseeq
      @verseeq 4 года назад

      А вас в гугле забанили? Два ключевых слова вы здесь написать не поленились, а на поисковик забили. Стыдно, товарищ!

  • @konstantingolinskiy4944
    @konstantingolinskiy4944 4 года назад +1

    Может кому то пригодиться на эту тему работа Atmega328P от внутреннего RC генератора на частоте 1МГц и питание от 2,4 Вольта Ток потребления в спящем состоянии менее 0,4 мкА, в момент нажатия на кнопку 9 мА ( просыпается только от двух пинов прерывание 0 и 1 ) #include "Arduino.h"
    #include
    #define ButtonOne 2
    #define ButtonTwo 3
    //************************************************************************
    void setup() {
    //Save Power by writing all Digital IO LOW - note that pins just need to be tied one way or another, do not damage devices!
    for (int i = 0; i < 20; i++) {
    if(i != ButtonOne || i != ButtonTwo || i != TransmitterPin ){
    pinMode(i, OUTPUT);
    digitalWrite(i,LOW);
    }
    }
    pinMode(ButtonOne, INPUT_PULLUP);
    pinMode(ButtonTwo, INPUT_PULLUP);

    }
    //**************************************************************************
    void loop() {
    // тут код который должен выполняться при пробуждении ( можно обработать с какой именно кнопки нажата и сделать обработку для каждой кнопки свое действие )
    ADCSRA = 0;
    set_sleep_mode (SLEEP_MODE_PWR_DOWN);
    sleep_enable();

    MCUCR = bit (BODS) | bit (BODSE);
    MCUCR = bit (BODS);
    noInterrupts();
    attachInterrupt(digitalPinToInterrupt(ButtonOne), sleepISR1, FALLING); // LOW
    attachInterrupt(digitalPinToInterrupt(ButtonTwo), sleepISR2, FALLING); // LOW
    // LOW - прерывание будет срабатывать всякий раз, когда на выводе присутствует низкий уровень сигнала
    // CHANGE - прерывание будет срабатывать всякий раз, когда меняется состояние вывода
    // RISING - прерывание сработает, когда состояние вывода изменится с низкого уровня на высокий
    // FALLING - прерывание сработает, когда состояние вывода изменится с высокого уровня на низкий.
    interrupts();
    sleep_cpu();


    }
    void sleepISR1() {
    // Запретить спящий режим, чтобы мы больше не заходили в него, кроме как намеренно, по коду
    sleep_disable();
    // код или действие при пробуждении по этому прерыванию
    // Отключаем прерывание, которое вывело нас из сна
    detachInterrupt(digitalPinToInterrupt(ButtonOne));
    // Теперь мы продолжаем запуск основной функции Loop () сразу после того, как мы пошли спать
    }
    void sleepISR2() {
    // Запретить спящий режим, чтобы мы больше не заходили в него, кроме как намеренно, по коду
    sleep_disable();
    // код или действие при пробуждении по этому прерыванию
    // Отключаем прерывание, которое вывело нас из сна
    detachInterrupt(digitalPinToInterrupt(ButtonTwo));
    // Теперь мы продолжаем запуск основной функции Loop () сразу после того, как мы пошли спать
    }

    • @alexmorozov73
      @alexmorozov73  4 года назад

      И чем ваш код интересен? Без нестандартных фьюзов он так же будет использовать внешний кварц на 16 МГц.
      С программированием предделителя можно и с внешним кварцем получить низкие частоты без проблем. И просыпаться по примеру кода из ролика можно от любого пина, а не только от 2 и 3.

  • @-USER_NAME
    @-USER_NAME 4 года назад

    Подписался . 10001