打印
[PIC®/AVR®/dsPIC®产品]

真心请教,我的PIC定时器中断为啥只能进去1次

[复制链接]
1515|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zsdshuai|  楼主 | 2014-9-1 19:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟最近开始使用PIC单片机,使用的是PIC18F45K80,使用PICKIT3作为调试工具,遇到以下难题:
系统时钟内部的16M,定时器前置4分频,也就是定时器时钟1M,定时10ms,现在调试发现定时器中断只能进去1次,到底是哪里出现了问题?恳请大家不吝赐教,谢谢!

我的程序如下:工程文件 test2.rar (46.18 KB)

/** C O N F I G U R A T I O N   B I T S ******************************/

#pragma config XINST = OFF,SOSCSEL=DIG,INTOSCSEL=LOW,RETEN=ON   //Config 1L
#pragma config IESO = OFF,FCMEN=OFF,PLLCFG=OFF,FOSC=INTIO2      //Config 1H
#pragma config BORPWR = LOW,BORV=3,BOREN=OFF,PWRTEN=OFF         //Config 2L
#pragma config WDTPS = 1,WDTEN=OFF                              //Config 2H
#pragma config MCLRE = ON                                       //Config 3H

/** I N C L U D E S **************************************************/
#include "p18f45k80.h"
/** D E C L A R A T I O N S ******************************************/

/* ***********************************************************************************
** 函 数 名: void main (void)
** 功能描述: 主函数
**           
**************************************************************************************/
void main (void)
{
  //  OSCCON = 0x60;           //选择8M内部时钟
      OSCCON = 0x70;           //选择16M内部时钟
     
      OSCTUNEbits.PLLEN = 0;   // *4 PLL 禁能
  //  OSCTUNEbits.PLLEN = 1;   // *4 PLL 使能
  
  
   T0CON=0b00000001;  //前置4分频  定时器1M的时钟
   TMR0H=0xD8;  
   TMR0L=0xEF;        //0xFFFF-0xD8EF= 10000  定时10ms
   T0CONbits.TMR0ON=1;  
   
   
   RCONbits.IPEN=1;   
   
   INTCONbits.TMR0IF=0;    /* 清除TMR0的中断标志 */
   INTCON2bits.TMR0IP=1;    /* TMR0中断高优先级 */
   INTCONbits.TMR0IE=1;    /* TMR0中断允许 */
   INTCONbits.PEIE_GIEL=1;
   INTCONbits.GIE_GIEH=1;
   
   
   
while (1);
}

void InterruptServiceHigh ()
{
  if(INTCONbits.TMR0IF==1)
   {
    TMR0H=0xD8;  
    TMR0L=0xEF;        //0xFFFF-0xD8EF= 10000  定时10ms
    INTCONbits.TMR0IF=0;
    INTCONbits.TMR0IE=1;
   }
}


#pragma code InterruptVectorHigh = 0x08
void InterruptVectorHigh (void)
{
  _asm
    goto InterruptServiceHigh //jump to interrupt routine
  _endasm
}
沙发
zsdshuai|  楼主 | 2014-9-1 19:22 | 只看该作者
请大家帮我看看,我是找了很久啊,不知道问题在哪里啊,特别邀请版主yewuyi帮忙看一下,万分感谢

使用特权

评论回复
板凳
lanmp| | 2014-9-1 21:57 | 只看该作者
在InterruptServiceHigh最后打开GIE应该能多进几次。这是你第一次用中断么?

使用特权

评论回复
地板
zsdshuai|  楼主 | 2014-9-2 09:08 | 只看该作者
lanmp 发表于 2014-9-1 21:57
在InterruptServiceHigh最后打开GIE应该能多进几次。这是你第一次用中断么?

这是我第1次用PIC单片机,在InterruptServiceHigh重新打开GIE确实能够再次打开中断,这个应该是总中断控制位啊?是不是每次中断产生后GIE都会清零,需要重新打开,或者是其它的问题?

使用特权

评论回复
5
lanmp| | 2014-9-2 09:32 | 只看该作者
zsdshuai 发表于 2014-9-2 09:08
这是我第1次用PIC单片机,在InterruptServiceHigh重新打开GIE确实能够再次打开中断,这个应该是总中断控 ...

是其他问题。所有单片机的终端函数都不能用你那种写法

使用特权

评论回复
6
zsdshuai|  楼主 | 2014-9-2 22:01 | 只看该作者
lanmp 发表于 2014-9-2 09:32
是其他问题。所有单片机的终端函数都不能用你那种写法

我的中断函数的写法有啥问题?请指教,谢谢,或者是给我个例程,让我好好领悟下

使用特权

评论回复
7
lanmp| | 2014-9-2 22:04 | 只看该作者
不能用GOTO

使用特权

评论回复
8
zsdshuai|  楼主 | 2014-9-2 23:57 | 只看该作者
结贴,找到了原因
在真正的中断函数void InterruptServiceHigh ()之前需要用#pragma interrupt InterruptServiceHigh声明
加上后,一切正常

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

47

帖子

1

粉丝