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}
> タイマー関連のレジスタの設定が原因かと思いましたが
で、タイマー関連のレジスタ内容を何らかの方法で確認したのですか?
コメントありがとうございます。
microsはTCNT0とTIFR0を使用しているようなのですが、私の知識不足のため、どのように設定を変えればよいかわかりませんでした。
【参考①: micros関数のソースコード】
https://garretlab.web.fc2.com/arduino/inside/hardware/arduino/avr/cores/arduino/wiring.c/micros.html
【参考②: ATTINYのデータシート】
https://avr.jp/user/DS/PDF/tiny13.pdf
一応確認しておくけど、ちゃんと「Micros Enabled」にはしてるよね?
ご質問ありがとうございます。
Micros Enabledには設定しています。
スリープ前はmicrosは問題なく動作しているので、スリープモードがトリガーとなって動作不良が発生しているのかと思います。
回答2件
あなたの回答
tips
プレビュー