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

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.