原创 R8C/M16C中,怎么中断程序

2011-2-25 14:00 2959 4 4 分类: MCU/ 嵌入式
来源:瑞萨单片机论坛

;=============================================== 
标题一:瑞萨HEW中怎样写中断函数 

以下用R8C/1B为例写TimerX的中断函数: 
1、首先确认TimerX的中断向量标号为22,数据手册中断章节可以查到。 
2、改写sect30.inc文件中的向量表 
.lword dummy_int ; vector 17 
.lword dummy_int ; vector 18 
.lword dummy_int ; vector 19 
.lword dummy_int ; vector 20 
.lword dummy_int ; vector 21 
.glb _TimerXInt 
.lword _TimerXInt ; vector 22 
.lword dummy_int ; vector 23 
.lword dummy_int ; vector 24 
.lword dummy_int ; vector 25 
3、写中断函数,用户程序文件当中 
/************************************************************************ 
*函数原型: TimerXInt 
*功能 : TIMER X 中断 中断向量22 
************************************************************************/ 
#pragma INTERRUPT TimerXInt() vect=22; 
void TimerXInt(void) //1s 

ir_txic = 0; 
用户代码 

4、开相关中断并设置中断优先级 
/************************************************************************ 
*函数原型: InitTimerX() 
*功能 : 短延时程序,约6US @8MHz 
************************************************************************/ 
void InitTimerX() // 定时器X 


txck0 = 1; 
txck1 = 0; 
prex=125; 
tx=125; 
txmr = 0x00; 
txic = 1; // Interrupt priority level = 1 
ir_txic = 0; // Interrupt request flag clear 
txs = 1; // Timer X count start flag = start 

5、开中断 
asm("FSET I"); 



;================================================================== 

标题二:R8C/1A 1B系列的相关例程和应用 

TimerX的中断使用例程: 
初始化程序: 
void InitTimerX() // 定时器X 

txck0 = 0; /* Timer X count source = f1 */ 
txck1 = 0; 

/* Setting main cycle timer */ 
/* 8MHz * 1/1 * 256 * 250 = 2ms */ 
prex = 256-1; /* Setting Prescaler X register */ 
tx = 250-1; /* Setting timer X register */ 

txmr = 0x00; /* Timer X : timer mode */ 
txic = 5; /* Interrupt priority level = 5 */ 

ir_txic = 0; /* Interrupt request flag clear */ 
txs = 1; /* Timer X count start flag = start */ 


中断程序: 
#pragma INTERRUPT TimerXInt() vect=22; 
void TimerXInt(void) //6.4ms 

//用户程序 
ir_txic = 0; 


中断向量:SECT30.INC文件中 
.glb _TimerXInt 
.lword _TimerXInt ; vector 22 



;================================================== 

标题三:关于M16C/62P的定时器中断 

#include "sfr62p.h" 

/*************************************************************************/ 
//定时器模式,中断A0 
#pragma INTERRUPT/B vect 21 ms_timer_a0 
void ms_timer_a0(void){ 

ta0 = 24000-1; //1msec @24MHz 

if(beep_time==0)beep=1; 
else beep_time--; 



/************************************************************************* 
等待20ms,直到PLL时钟稳定 
*************************************************************************/ 
void pll_stable_20ms(void) 


//TA0MR:定时器A0模式寄存器 
ta0mr = 0x80; //定时器模式,32分频 

ta0 = 3750-1; //20ms:@6MHz, f32 

ta0ic = 0x00; //Level 0 
tabsr = 0x01; //TimerA0启动 

while(ir_ta0ic == 0){} //延时20ms;Vcc = 5V 
tabsr = 0x00; //TimerA0停止 
ir_ta0ic = 0; //清中断标志位 



/*************************************************************************/ 
//寄存器初始化 
void mcu_init(void) 


prc0=1;//允许写PRC0 
prc1=1;//允许写PRC1 

pm0 = 0x00; //单芯片模式 
pm1 = 0x08; 

cm0 = 0x08; //主时钟 
cm1 = 0x20; //系统时钟为主时钟 

plc0 = 0x12; 

pm2 = 0x00; 

plc0 = 0x92; //PLL时钟启动 

pll_stable_20ms(); //等待20ms,直到PLL时钟稳定 
cm1 = 0x22; //系统时钟为PLL时钟 

pclkr = 0x03; 

prc0=0; 
prc1=0; //PRCR禁止写 

adcon2 = 0x01; //AD4分频;端口P10;采样保持 

adcon0 = 0x02; //软件触发;单次模式;通道2 

adcon1 = 0x28; //不使用ANEX0和ANEX1;Vref;10位模式 

//定时器设置 
ta0ic = 0x01; //有中断请求,LEVEL 1 
ta0mr = 0x00; //定时器模式,f1 
ta0 = 24000-1; //1msec @24MHz 
ta0s = 1; //start counting 





/*************************************************************************/ 
void main(void) 

mcu_init(); //寄存器初始化 


while(1){ 


}

文章评论0条评论)

登录后参与讨论
我要评论
0
4
关闭 站长推荐上一条 /3 下一条