这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 定时器 TRA定时器模式中断 无法自动进入??

共4条 1/1 1 跳转至

定时器 TRA定时器模式中断 无法自动进入??

菜鸟
2008-03-19 10:44:19     打赏

两个INT 和一个定时器TRA中断,ITN0、INT1两个可以自动进入中断,并安全退出。但是TRA定时器模式中断不行,有溢出TUNDF。就是进不了程序。帮我看看,谢谢了。

//INT0(P4_5)\INT1(P1_7)同时输入中断信号
//INT0(P4_5)中断则P1_4亮;INT1(P1_7)中断则P1_5亮。

//定时器 TRA定时器模式中断?????????
/* 原型声明 ********************/

#pragma interrupt timer_ra_int
#pragma interrupt int0_int
#pragma interrupt int1_int

void int1_int(void);
void int0_int(void);
void timer_ra_int(void);

#include"sfr_r82l.h"
unsigned int i,j,k;
unsigned char a,a0,a1;

void int0_int(void) /*   */
 {
  p1_4=1;
  p1_5=0;
  }

void int1_int(void) /*   */
 {
  p1_4=0;
  p1_5=1;
  }

void timer_ra_int(void)
 {
 tundf_tracr = 0;
  p2_6 =!p2_6;
 }

void main(void)
{
 prcr = 0x03;
 pm0 = 0x00;
 pm1 = 0x00;
 cm0 = 0x08;
 cm1 = 0x20;
 asm("FCLR I");
 pd2 = 0x7f;          
 pd1_4 = 1;
 pd1_5 = 1;
  
 int0ic = 0x02;        //INT0中断控制寄存器下降、优先级2级
 int1ic = 0x03;        //INT1中断控制寄存器下降、优先级3级
 inten = 0x05;         //外部输入允许寄存器
 intf = 0x0a;          //输入滤波器选择寄存器
  
 tramr = 0x00;      //计数源供给  f1 定时器模式 
 trapre = 20-1;    //定时器预定标器寄存器 
 tra = 25-1;       //定时器RA寄存器

 tracr = 0x00;      //定时器RA控制寄存器
 traic = 0x01;  //中断控制寄存器 优先级1级
 tstart_tracr = 1;     //计数

 
 asm("FSET I");

 
 i=0;
 while(1);
   
}  




关键词: 定时器     模式     中断     无法     自动     进入    

助工
2008-03-19 13:47:19     打赏
2楼

您好!
看了一下,您的主时钟设定部分不太完整,致使系统并没有完全切换到主时钟(外部晶振)去。而您的TimerRA 却使用了这个主时钟。
修改了一下您的程序,现在可以进入中断了。请参考
#pragma interrupt timer_ra_int
void timer_ra_int(void);
#pragma interrupt int0_int
void int0_int(void);
#pragma interrupt int1_int
void int1_int(void);

#include"sfr_r82l.h"
unsigned int i,j,k;
unsigned char a,a0,a1;

void int0_int(void) /*   */
 {
  p1_4=1;
  p1_5=0;
  }

void int1_int(void) /*   */
 {
  p1_4=0;
  p1_5=1;
  }

void timer_ra_int(void)
 {
 tundf_tracr = 0;
  p2_6 =!p2_6;
 }

void main(void)
{
 
    /*--------------------------------------------------
    - Change on-chip oscillator clock to Main clock  -
    ---------------------------------------------------*/
 prc0 = 1;       /* Protect off */
 cm13 = 1;       /* Xin Xout */
 cm15 = 1;       /* XIN-XOUT drive capacity select bit : HIGH */
 cm05 = 0;       /* Xin on */
    while( i <= 255 ) i++;    /* This setting is an example of waiting time for the */
          /* oscillation stabilization. Please evaluate the time */
          /* for oscillation stabilization by a user. */
 ocd2 = 0;       /* Main clock change */
 cm16 = 0;       /* Main clock = No division mode */
 cm17 = 0;
 cm06 = 0;       /* CM16 and CM17 enable */
 prc0 = 0;       /* Protect on */
 
 pd2 = 0x7f;          
 pd1_4 = 1;
 pd1_5 = 1;
 
 int0ic = 0x02;        //INT0中断控制寄存器下降、优先级2级
 int1ic = 0x03;        //INT1中断控制寄存器下降、优先级3级
 inten = 0x05;         //外部输入允许寄存器
 intf = 0x0a;          //输入滤波器选择寄存器
  
 tramr = 0x00;      //计数源供给  f1 定时器模式
 tracr = 0x00;      //定时器RA控制寄存器
 traioc = 0x00;  //定时器RA IO控制寄存器

 trapre = 20-1;    //定时器预定标器寄存器 
 tra = 25-1;       //定时器RA寄存器

 traic = 0x01;  //中断控制寄存器 优先级1级
 tstart_tracr = 1;     //计数

 
 asm("FSET I");

 
 i=0;
 while(1);
   
}


助工
2008-03-20 11:41:01     打赏
3楼
借地方问个问题
当TRA中断时,MCU是怎么知道去执行timer_ra_int()里的程序的??

是否可以这样解释:
在声明里:
#pragma   interrupt   timer_ra_int           //声明timer_ra_int是一个中断

在中断向量表里:
.lword     timer_ra_int                               //TRA中断向量

这样TRA中断时,就自带执行了timer_ra_int()

助工
2008-03-20 13:23:28     打赏
4楼
当中断产生时,R8C/tiny与其它单片机一样,PC指针讲指向该中断的中断向量表地址。
对纯HEX机器语言来讲,中断向量地址处写的是中断处理程序的入口地址,即中断响应-->PC指向中断向量地址-->转向中断处理程序入口地址.....

用C语言编写的话,就象您所说的一样,需要对中断程序的入口地址进行申明与定义,且在启动文件中配置到正确的中断向量表里。

共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]