Attiny13Aにて、スリープモード(SLEEP_MODE_PWR_DOWN)から復帰した後、micros()関数が意図通り機能しません。
スリープ後にもmicrosを使う方法を教えていただけないでしょうか?
スリープモードから復帰後、PB0を3秒間HIGHにしたいのですが、スリープ後はPB0が一瞬だけHIGHになり、すぐにLOWになってしまいます。
なお、電源投入後からスリープ前の初回のLED()は問題なく動作します。
また、"micros"の代わりに"delay"を使うと問題なく動作します。
タイマー関連のレジスタの設定が原因かと思いましたが、解決方法を見つけることができませんでした。
よろしくお願いいたします。
使用ツール: Arduino IDEのMicroCore + Arduino Nano (互換品)
ArduinoIDE
1#include <avr/sleep.h> 2#include <avr/interrupt.h> 3 4void setup() { 5 DDRB = 0b00000001; 6 PORTB = 0b00010000; 7 set_sleep_mode(SLEEP_MODE_PWR_DOWN); 8} 9 10// スリープモード 11void Sleep() { 12 GIMSK |= _BV(PCIE); 13 PCMSK |= _BV(PB4); 14 sei(); 15 sleep_enable(); 16 sleep_cpu(); 17 cli(); 18 sleep_disable(); 19 GIMSK &= ~_BV(PCIE); 20 PCMSK &= ~_BV(PB4); 21} 22 23ISR(PCINT0_vect) { 24} 25 26// 3秒間PB0をHIGH 27void LED(){ 28 PORTB |= _BV(PB0); 29 unsigned long t = micros(); 30 while (micros() - t < 3000000); // ここを「delay(3000)」に置き換えると問題なし。 31 PORTB &= ~_BV(PB0); 32} 33 34void loop() { 35 LED(); // 初回のLED()は問題なく作動する。2回目以降は一瞬でPB0がLOWになる。 36 Sleep(); 37}
回答2件
あなたの回答
tips
プレビュー