基本は追加SWの状態を見て、妖怪ウオッチのメダル識別SWをON/OFFすることです。
召還SWと種族切替えSWを割り込み端子につないで
SW割り込みにより、プログラムが起動されるようにします。
押されたSWが決まれば次は、メダルのパターンを出力ポートに順次出力するだけです。
このときメダル挿入時の出力と、メダル抜き出し時の出力は
出力パターンが真逆になるので、それぞれ処理を用意します。
・プログラム構成
プログラムは以下のような構成にします。
・初期化処理
・割り込み処理
INT0:召還SW割り込み処置
INT1:種族変更SW割り込み処理
・アイドル処理
召還処理
種族変更処理
スリープ処理
・初期化処理
a)PORTB、PORTDの方向設定とプルアップルの指定を行います。
DDRB = 0xff; //方向設定レジスタの指定 x1111 1111
DDRD = 0xb3; //方向設定レジスタの指定 x1011 0011
PORTD = 0xff; // データレジスタの指定
b)スリープモードの指定。SWが押されずなにもすることがないときにスリープ状態にして
電池の消耗を押さえることが目的です。初期化処理で
#include <avr/sleep.h>
set_sleep_mode(SLEEP_MODE_PWR_DOWN); と指定することで、
パワーダウンモードのスリープとなり、クロック発信器を停止させ、クロックの供給を停止します。外部割り込みは動作を継続します。WDTを停止させておけば 0.3μAしか電池を消耗しなくなります。 電池で動く物には必須ですね。
・割り込み処理
#include <avr/interrupt.h>
ISR (INT0_vect,ISR_BLOCK) // 召還 SW 割り込み
{
//召還 SWが押されたことを記録
sw_stat = NEXT_SW;
}
ISR (INT1_vect,ISR_BLOCK) // 種族きりかえ SW 割り込み
{
//種族きりかえ SWが押されたことを記録
sw_stat = CHANGE_SW;
}
sw_stat変数は、アイドル処理で参照するので、volatile指定にします。
volatile unsigned char sw_stat = 0;//割り込みSW押下状態(族切り替えSW,召還 SW)
・アイドル処理
アイドル処理は、SWの押された状態を判断して、各々の処理を行います
そして最後にスリープします。次にSWが押されるまで停止します。
for (;;)
{
//SW 状態により各、メダルパターン出力処理を実行
sleep_mode(); //スリープ開始。
}
戻る |
0 件のコメント:
コメントを投稿