タイマー割り込み。
Nintendo DSでプログラミングさんの解説と、
たろサさんの解説を参考にタイマー割り込みを学習しました。
タイマ割り込みと高速フーリエ変換を使ってマイク入力を解析してみる - Nintendo DSでプログラミング
http://void-main.org/dsprogram/index.php?%E3%82%BF%E3%82%A4%E3%83%9E%E5%89%B2%E3%82%8A%E8%BE%BC%E3%81%BF%E3%81%A8%E9%AB%98%E9%80%9F%E3%83%95%E3%83%BC%E3%83%AA%E3%82%A8%E5%A4%89%E6%8F%9B%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%83%9E%E3%82%A4%E3%82%AF%E5%85%A5%E5%8A%9B%E3%82%92%E8%A7%A3%E6%9E%90%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B
30fps割り込みを試してみる - コンピュータを楽しもう!
http://d.hatena.ne.jp/tarosay/20100218/1266515666
解説と libnds とをしばらく行き来してたら
タイマー割り込み用に関数が用意されてることに気付きました。
before
TIMER_DATA(0) = TIMER_FREQ_256(1000); TIMER_CR(0) = TIMER_ENABLE | TIMER_IRQ_REQ | TIMER_DIV_256; irqSet(IRQ_TIMER(0), Timer0Handler); irqEnable(IRQ_TIMER(0));
after
timerStart(0, ClockDivider_256, TIMER_FREQ_256(1000), Timer0Handler);
どっちを書いても動作結果は同じなのですが
あるものは活用してく方針ですので素直にパック関数を利用しました。
タイマー周期の値セット辺りでまだよく分かってません。
ミリセカンド周期のカウンターという取りあえずの目標は達成しましたが…。
main.c
/*--------------------------------------------------------------------------------- irq timer sample version 0.01 May 26, 2010 By REGEKATSU ---------------------------------------------------------------------------------*/ #include <nds.h> #include <stdio.h> static u32 frame = 0, timer = 0; void Timer0Handler(void); //--------------------------------------------------------------------------------- void Timer0Handler(void) { //--------------------------------------------------------------------------------- timer++; } //--------------------------------------------------------------------------------- int main(void) { //--------------------------------------------------------------------------------- consoleDemoInit(); //irq timer0 Set & Enable timerStart(0, ClockDivider_256, TIMER_FREQ_256(1000), Timer0Handler); /* TIMER_DATA(0) = TIMER_FREQ_256(1000); TIMER_CR(0) = TIMER_ENABLE | TIMER_IRQ_REQ | TIMER_DIV_256; irqSet(IRQ_TIMER(0), Timer0Handler); irqEnable(IRQ_TIMER(0)); */ while(1) { swiWaitForVBlank(); scanKeys(); if(++frame % 60 == 0){ frame = 0; } printf("timer=%d, frame=%d\n", timer, frame); if(keysDown() & KEY_START){ //irq timer0 Disable & Clear timerStop(0); }else if(keysDown() & KEY_B){ //irq timer0 Disable irqDisable(IRQ_TIMER(0)); }else if(keysDown() & KEY_A){ //irq timer0 Enable irqEnable(IRQ_TIMER(0)); } } } //---------------------------------------------------------------------------------