这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 请教一下代码的问题,实在有点汗颜

共14条 1/2 1 2 跳转至

请教一下代码的问题,实在有点汗颜

助工
2008-04-27 16:55:05     打赏

如下是我给客户写的参考代码,可在运行程序时不能连续中断,除非复位后再执行,想请教一下各位大虾帮我指点一下。
void main(void)    
{ asm("FCLR I");   // Interrupt disable 
   prc0 = 1;    // Protect off .configure main clock
 cm13 = 1;    // X-in X-out
 cm15 = 1;    // XCIN-XCOUT drive capacity select bit : HIGH
 cm05 = 0;    // X-in on
 cm16 = 0;    // Main clock = No division mode
 cm17 = 0;
 cm06 = 0;    // CM16 and CM17 enable 
 asm("nop");
 asm("nop");
 asm("nop");
 asm("nop");
 ocd2 = 0;    // Main clock change
 prc0 = 0;     //Protect on
 pd3_3=0;   //use for inputting as IRQ2(INT3 Interrupt input)
 tcc00=0;    //only when tcc00=0,can change tcc07,tcc06,tcc03,tcc04
 tcc07=0;
 tcc06=1;
 tcc03=0;
 tcc04=1;  //cc04 tcc03=01 ,falling can interrupt
 tcout3=1;
 ssisel=0;
 tcc10=1;
 tcc11=1;
 ilvl0_int3ic=1; //the highest interrupt level
 ilvl1_int3ic=1;
 ilvl2_int3ic=1;
 ir_int3ic=0;  //clear int3 interrupt
 asm("FSET I");    //Interrupt disable
 while(1)
 {; }
}        

void int3(void)     //interrupt program
{  unsigned int count=2;
  while(count>0)
 {
  count--;     //在此设置询问是想监视ir_int3ic位是否自动清0
  ir_int3ic=0;
  }
}
如下是sect30.inc文件的部分内容
.lword dummy_int  ; vector 25
 .glb    _int3   ; vector 26
 .lword _int3   
 .lword dummy_int  ; vector 27




关键词: 请教     一下     代码     问题     实在     有点     汗颜    

助工
2008-04-27 20:49:13     打赏
2楼

MCU运行环境设置是用的自动生成的??
是不是中断堆栈溢出,ISP有赋值吗,栈的大小多少?


助工
2008-04-27 22:24:58     打赏
3楼

我用新建工程向导完成,除了没有选择使用标准的IO定义文件,
如下部分是有关堆栈和向量等方面的配置:
__STANDARD_IO__    .equ 0 ; STANDARD I/O flag definition
__HEAPSIZE__       .equ 050H ; HEEP SIZE definition
__STACKSIZE__      .equ 080H ; STACK SIZE definition
__ISTACKSIZE__     .equ 080H ; INTERRUPT STACK SIZE definition
__VECTOR_ADR__     .equ 0fedcH ; INTERRUPT VECTOR ADDRESS definition
__ROM_TOPADR__     .equ 0C000H ; ROM TOP ADDRESS definition
还有我发现,sect30.inc文件里面,如果要中断必须要做如下设置:

  .org  __VECTOR_ADR__
;.if 0                       这里要么屏蔽,要么改成   if 1 才能进入中断。
  .lword dummy_int  ; vector  0
  .lword dummy_int  ; vector  1
......
 .glb        _int3_inter;     ;vector 26
 .lword   _int3_inter;    
 .lowrd dummy_int;      ;vector  27


助工
2008-04-28 08:21:17     打赏
4楼
你说的不能连续中断是什么意思
是程序运行正常,只是开始响应中断,后来不响应了?
还是程序跑飞?

助工
2008-04-28 08:53:07     打赏
5楼
中断返回后就在while(1){}里面一直循环不再响应中断。我看过我所设置的寄存器,没有变化,因此就太奇怪了。

助工
2008-04-28 08:56:08     打赏
6楼

在您的中断程序中,没有看到#pragma interrupt int3的定义。请确认一下你是否在头文件中定义了,你的只进一次中断的现象,很象是没有定义。


助工
2008-04-28 09:01:32     打赏
7楼
在这句上设置断点看是否有进入中断:while(count>0)

另外,你看的寄存器是count???
你的程序里的count--只执行2次,在count=0后不再被减。。。

助工
2008-04-28 09:02:36     打赏
8楼
 .org  __VECTOR_ADR__
;.if 0                       这里要么屏蔽,要么改成   if 1 才能进入中断。
  .lword dummy_int  ; vector  0
  .lword dummy_int  ; vector  1
......
 .glb        _int3;     ;vector 26
 .lword   _int3;                                 这里已经指明了中断入口地址了呀
 .lowrd dummy_int;      ;vector  27

哎,用了这条语句后就好了。。

助工
2008-04-28 09:09:20     打赏
9楼
屏蔽if  0等效if  1
这是条件编译
程序里必须编译 if  0下面的语句,否则MCU无法正常工作
也就是if   0 必须改为if   1

助工
2008-04-28 09:12:00     打赏
10楼

你用的编译器是NC30 5.42以上的版本,是必须把if 0改称if 1.


共14条 1/2 1 2 跳转至

回复

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