Skocz do zawartości

ATtiny13 i Faunkcja sleep_cpu();


kacperos.89

Pomocna odpowiedź

Dzień dobry.

Robię sobie takie małe urządzonko na ATtiny13 i chciał bym używać opcji oszczędzania energii bo układ jest na baterii 3V. Do oszczędzania energii używam biblioteki <avr/sleep.h> ale po wprowadzeniu procesora w stan uśpienia (sleep_cpu()) później nie chce się wzbudzić (sleep_disable()). Używam Arduino IDE z biblioteką dla ATtiny13 (MicroCore).

Ten sam program uruchamiany na normalnym Arduino UNO (oczywiście z odpowiednio dopasowanymi pinami) Działa tak jak należy po uśpieniu wybudza się.

Kod programu wygląda tak:



#include <avr/sleep.h>

#define adc_disable() (ADCSRA &= ~(1<<ADEN)) // disable ADC (before power-off)
#define RLED 3
#define YLED 4
#define GLED 0
#define BUZZ 2
#define BUTT 1

int mode = 0;

void setup() 
{
  adc_disable();
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  
  pinMode(YLED, OUTPUT); //Yellow
  pinMode(GLED, OUTPUT); //Green
  pinMode(RLED, OUTPUT); //Red
  pinMode(BUZZ, OUTPUT); //Buzzer
  pinMode(BUTT, INPUT);  //Button

  //attachInterrupt(BUTT, button, RISING);

}

void button()
{
  digitalWrite(YLED, HIGH);
  delay(500);
  digitalWrite(YLED, LOW);
  delay(500);
  mode = ++mode;
  riseCPU();
}

void sleepCPU()
{
  attachInterrupt(BUTT, riseCPU, RISING);
  sleep_enable();
  delay(100); 
  sleep_cpu();
  tone(BUZZ, 50);
  delay(300);
  noTone(BUZZ);
}

void riseCPU()
{
  sleep_disable();
  attachInterrupt(BUTT, button, RISING);
}

void road()
{
  digitalWrite(RLED, HIGH);
  delay(5000);
  digitalWrite(YLED, HIGH);
  delay(1000);
  digitalWrite(RLED, LOW);
  digitalWrite(YLED, LOW);
  digitalWrite(GLED, HIGH);
  delay(5000);
  digitalWrite(YLED, HIGH);
  digitalWrite(GLED, LOW);
  delay(1000);
  digitalWrite(YLED, LOW);
}

void sound()
{
  tone(BUZZ, 100);
  delay(300);
  tone(BUZZ, 50);
  delay(300);
}

void loop() 
{
  attachInterrupt(BUTT, button, RISING);

  switch (mode)
  {
    case 0:
      noTone(BUZZ);
      digitalWrite(GLED, HIGH);
      delay(500);
      digitalWrite(GLED, LOW);
      delay(500);
      break;
      
    case 1:
      noTone(BUZZ);
      digitalWrite(GLED, HIGH);
      delay(100);
      digitalWrite(GLED, LOW);
      delay(100);
      digitalWrite(GLED, HIGH);
      delay(100);
      digitalWrite(GLED, LOW);
      delay(1000);
      sound();
      break;
      
    case 2:
      noTone(BUZZ);
      digitalWrite(GLED, HIGH);
      delay(100);
      digitalWrite(GLED, LOW);
      delay(100);
      digitalWrite(GLED, HIGH);
      delay(100);
      digitalWrite(GLED, LOW);
      delay(100);
      digitalWrite(GLED, HIGH);
      delay(100);
      digitalWrite(GLED, LOW);
      delay(500);
      road();
      break;

    case 3:
      sleepCPU();
      break;
      
    default:
      mode = 0;
      break;
  }
}

 

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.