ATtiny10でプログラミング (その2) Sleep編

電池駆動を前提にしているので、Lチカの次はスリープを確認します

 

#define PIN 1
#define DTIME 1000
#define DTIME2 100
#include <avr/sleep.h>
#include <avr/io.h>

boolean PWR = false;

void setup() {
  pinMode(PIN, OUTPUT);
  pinMode(2,INPUT_PULLUP);
  //稼働電流測定用2sec
  delay(2000);
  ADCSRA &= ~(1<<ADEN); //Disable ADC, saves ~230uA
  sei(); //割り込み許可
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();
  attachInterrupt(0, wakeup, LOW);
  sleep_mode();
}

void loop() {
  int a;
  cli(); //INT0割り込み禁止
  for(a=0;a<10;a++){
  digitalWrite(PIN, HIGH);
  delay(DTIME);
  digitalWrite(PIN, LOW);
  delay(DTIME);
  }
  sleep_enable();
  attachInterrupt(0, wakeup, LOW);
  sei();
  sleep_mode(); 
}

void wakeup()
{
  //GIMSK = 0; // disable INT0;
  digitalWrite(PIN, LOW);
}

INT0割り込みが発生したらwakeupの中でcli()を呼べばいいと思ったんですが、loop内でないとダメみたいです・・・なんでかなー

手持ちのテスターや電源では1mAまで測定しかできないのでこんなログになります

電源ONの後の2秒は通常状態(2mA)→スリープ(1mA以下)→INT0割込でLED点滅10回(LED-on=5mA,LED-off=2mA)→スリープ(1mA以下)です

あとは実際に試してボタン電池の消耗具合で判断するしかないですね