打印

简单的 PIC单片机定时器中断程序怎么进不去?

[复制链接]
6508|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liuyanlbg|  楼主 | 2012-5-16 21:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位好!我用PIC16F73单片机编一个定时器程序,但无法进入中断程序,如果把中断程序放到主函数中能正常运行。程序如下:
#include "init.h"
#define set_bit(a,b) a|=1<<b
#define clr_bit(a,b) a&=~(1<<b)
uchar timecnt;
//看门狗初始化
void watchdoginit(void)
{
  OPTION = 0x0F;  //B口上拉,内部RC时钟,预分频给WDT,WDT分频为1:128
}
//定时器1初始化,10ms定时
void timer1init(void)
{
  TMR1H = 0XFB;
  TMR1L = 0X1E;
  TMR1IF = 0;
  PEIE = 1;
  TMR1IE = 1;
  T1CON = 0X31;
}
//端口初始化
void portinit(void)
{
  //clr_bit(OPTION,7);     //端口B内部上拉使能
  TRISA = 0xFF;
  TRISB = 0x7F;
  clr_bit(PORTB,7);
  TRISC = 0x00;
  PORTC = 0x10;
}
void init(void)
{
  di();
  portinit();
  timer1init();
  ei();
}
//中断服务程序
void interrupt ISR(void)
{
  if(TMR1IF)
  {
    TMR1IF = 0;
    TMR1H = 0XFB;
    TMR1L = 0X1E;
    timecnt++;
    if(timecnt<30)
    {
      set_bit(PORTC,0);
    }
    else
    {
      clr_bit(PORTC,0);
    }
    if(timecnt>60)
      timecnt = 0;
  }
}
void main(void)
{
  clr_bit(TRISC,0);
  clr_bit(TRISC,1);
  clr_bit(TRISC,3);
  watchdoginit();
  init();
  while(1)
  {
    CLRWDT();
  }
}
求高手求解!
沙发
XIEYUANBIN| | 2012-5-16 21:47 | 只看该作者
intcon : gie 全局中断允许没开

使用特权

评论回复
板凳
liuyanlbg|  楼主 | 2012-5-17 09:11 | 只看该作者
ei()在PIC.H中已定义为GIE=1;定时器程序能运行,中断程序放到主函数中能正常运行,说明已经有中断产生,但是中断程序放到外面时就无法识别

使用特权

评论回复
地板
liuyanlbg|  楼主 | 2012-6-4 22:32 | 只看该作者
是编译器的问题,换一个编译器就好了,哈哈!

使用特权

评论回复
5
yewuyi| | 2012-6-5 09:04 | 只看该作者
TIME1不光受GIE控制,还有一个外部中断源容许位的吧?那个打开了吗?

使用特权

评论回复
6
兰天白云| | 2012-6-5 14:46 | 只看该作者
void init(void)
{
  di();
  portinit();
  timer1init();   //这里已经启动T1并允许中断
  ei();              //这里干了些什么,有没有关中断?或T1
}

使用特权

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

本版积分规则

37

主题

59

帖子

0

粉丝