ATTINY 85 в спящем режиме - PullRequest
       97

ATTINY 85 в спящем режиме

0 голосов
/ 25 января 2020

Я новичок в программировании микроконтроллеров, и я только начал использовать Attiny85. Я пытаюсь построить схему для светодиода с тактильным переключателем. При каждом нажатии тактильного переключателя светодиод переходит в следующее состояние работы. Так как он работает от батареи, когда светодиод выключен, я хочу, чтобы attiny 85 потреблял как можно меньше тока. На данный момент он потребляет 4 мА, когда светодиод выключен без режима ожидания. Итак, я попробовал режим отключения питания для Attiny 85, но кое-как застрял в режиме отключения питания

if(count == 8){
          analogWrite(0,LOW);
          //Serial.println("I am OFF");
          //Serial.println(count);
          set_sleep_mode(SLEEP_MODE_PWR_DOWN); //Power down everything
          sleep_mode();
          sleep_disable();
        }

Он успешно входит в спящий режим, но я не могу выйти из него. Можете пожалуйста кому-нибудь помочь. Я хочу, чтобы Attiny 85 вышел из спящего режима при повторном нажатии тактильного переключателя. Переключатель находится на контакте 7, т. Е. PB2 Атины 85.

1 Ответ

1 голос
/ 29 января 2020

Пожалуйста, обратитесь к таблице , раздел 7.1 Спящие режимы на странице 34.

В таблице, которую вы видите, в режиме выключения питания только 3 источника может разбудить процессор:

  1. INT0, только прерывание уровня и прерывание смены пина
  2. Состояние запуска модуля USI
  3. Прерывание сторожевого таймера

Это означает, что если вы хотите, чтобы деталь просыпалась при нажатии кнопки, то наилучшим вариантом будет настройка прерывания смены штырька.

Сначала необходимо настроить процедуру обработки прерывания (ISR). ISR требуется только для обработки события прерывания, без которого программа будет перезапущена. Поскольку никаких действий не требуется, ISR может быть пустым:

#include <avr/interrupt.h>

EMPTY_INTERRUPT(PCINT0_vect);

Далее вам необходимо настроить прерывание смены штырька (см. Раздел 9.2 External Interrupts в таблице данных). Например:

// I don't know which pin do you use for the button
// Let's assue it is PB0 which corresponds to PCINT0 
// (see section 1. Pin Configurations)
PCMSK = (1 << PCINT0); // set pin change mask to PCINT0
GIMSK = (1 << PCIE); // enable pin change interrupt
sei(); // enable global interrupts

Вот и все. После настройки прерывания любое изменение логического уровня на входе вызовет пробуждение ЦП.

...