打印

为什么PIC的两个中断响应就不能正常工作了

[复制链接]
5361|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xinyancode|  楼主 | 2011-1-30 00:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
pic, TI, TE, tc
为什么PIC的两个中断响应就不能正常工作了

我用的是PIC16F877A开发板,我的程序当只含有串口接收中断处理函数时没有问题,当只含有定时中断时也没有问题,
可是当我把这两个中断响应函数放在一个程序里时,串口过一会就停在那里了不动了,但是定时器Timer0定时的led还在闪,不知道是怎么回事?
请指点一下吧,谢谢!

// based on PIC16F877A
#include<pic.h>
#define uchar unsigned char
#define uint  unsigned int
//__CONFIG(0x3B31);
#define RESTART_TIMING  0x01

unsigned int  couter = 0;
int i= 5400;

void init_UART()
{
TRISC = 0xC0;  //config Rc6, RC7 as input pin
//PORTC = 0xff;

TXSTA = 0x24;   //Transmit status register
                 //BRGH =1 : High baud rate bit selected
                 //SYNC =0 : Asynchronous mode
RCSTA=0x90;   //SPEN = 1 : serial port is enable
               //CREN = 1 : continuous receive is enable
SPBRG = 25;   //ste up baud rate to 9600 bps

RCIE=1;       //enable Receive SCI interrupt

}


/////////////////////////////////////////////////////////////////
void Config_Timer0()
{
    //configure Timer 0
    //when crystal is 4M
    OPTION = OPTION & 0xDF;   //internal instruction cycle clock select
    OPTION = OPTION & 0xF7;   //prescaler is assigned to Timer 0 module
    //OPTION = OPTION | 0x07;   //1:125 proscaler
    //OPTION = OPTION | 0x04;     //1:32 prescaler
    PS2 = 0;   //1:2
    PS1 = 0;
    PS0 = 0;
   
    TMR0 = 0xc3;       //定时器初值
    INTCON = INTCON | 0x20;     //TMR0IE: Enable TMR0 overflow intererupt
}



////////////////////////////////////////////
void interrupt com()
{
unsigned char uchTemp;


//if( RCIE && RCIF )
if ( RCIF )
{
  TXREG = RCREG;
  while( !TRMT );
  
  //nGlobalTimeFlag = RESTART_TIMING;
  //nTimeCount = 100;
}


if ( T0IF)     //how many us is interval time 512us = 0.512ms
{
        couter++;
     
        if( couter >= 1953 )
        {
         couter = 0;
         
            PORTC = PORTC | 0x01;
            while ( i> 0 )
            {
          NOP();
          i--;
            }
         
            PORTC = PORTC & 0xFE;
        }
        
        TMR0 = 0x00;
      
        T0IF = 0;
    }

}




/////////////////////////////////////////////////////
void main()
{

int nTimeCount = 0;

GIE = 0;   //Disable all unmask interrupt
PEIE = 0;

Config_Timer0();
init_UART();
    PEIE=1;
    GIE=1;   //enable all unmask interrupt

  while(1)
{
}
}
沙发
yewuyi| | 2011-1-30 08:26 | 只看该作者
请编写正确的中断函数代码。

提示:
1、PIC16的中断函数应该根据中断使能和中断溢出标志同时判断,你只做了中断溢出标志判断。
2、UART收发代码应该有恰当的错误处理代码。

使用特权

评论回复
板凳
xinyancode|  楼主 | 2011-1-30 11:20 | 只看该作者
谢谢楼上的高人!
您提到的:
2、UART收发代码应该有恰当的错误处理代码
请问这个错误处理代码指的是什么?能否再具体一点,呵呵,我还不知道怎么回事呢!:)

使用特权

评论回复
地板
yewuyi| | 2011-1-30 11:48 | 只看该作者
可查询手册中有关UART部分

本身MCU就能提供一些错误标志,另外,自己的代码也应该有针对报文的错误检查

使用特权

评论回复
5
兰天白云| | 2011-1-31 09:09 | 只看该作者
在中断函数里应该同时判断中断使能位和中断标志位

使用特权

评论回复
6
tcc8073| | 2011-2-24 16:44 | 只看该作者
PIC进入中断后其他中断是不能打断这个中断的(除非你用嵌套),这个时候新产生的中断标志使能位就被保存起来,等上一个中断程序处理完后才会处理这个新的中断,如果在第一中断过程中有几个中断产生,那么响应的先后就被查询的先后顺序决定,反正对PIC中断的理解一定要比较认真看明白.这点很重要.

使用特权

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

本版积分规则

85

主题

147

帖子

0

粉丝