読者です 読者をやめる 読者になる 読者になる

タイマー割り込み。


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));
			
		}
		
	}
	
}

//---------------------------------------------------------------------------------