PIC PICC 的奇怪问题

2020-02-09 11:25发布

今天发现一个奇怪的问题。
使用PIC16F722  这个IC出来没多久 ,需要使用PICC 9.65的编译器。

程序用SIM仿真发现总是在中断中跑,于是我关了GIE 同时查看特殊功能寄存器,发现不可能进中断,

在中断中通过判断标准位
进了这个
if(TMR2IE&TMR2IF)// PWM TIME INT    CHANGE DUTY
      {TMR2IF=0;
       TMR2IE=0;
         CCPR2L=PWM_duty;
      }

可是这个怎么可能一直在中断中跑。

还有哪位知道Startup.as这个文件有没有必要要。怎么去掉。我非常的怀疑是它在搞鬼

同事也怀疑编译器的问题 。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
lixin91985
1楼-- · 2020-02-10 13:29
楼上正解。



请问,为什么会这样。

难道是将TMR2IE所在的寄存器(8BIT)全部和另外一个的一起做按位于,

可是在以前的编译器中基本所有都是&。
l4157
2楼-- · 2020-02-10 17:51
可能这个编译器要求严格一些吧,不要太在意这些,另,写程序最好正规些,可以少走弯路,呵呵
millwood0
3楼-- · 2020-02-10 22:08
"发现只要T0溢出,以后怎么搞都逛if(TMR2IE&TMR2IF)// .
     {TMR2IE=0; "

because you turned on PEIE, which made TMR2IE possible (which could have been accidentally set) and tmr2 starts to run so you go into it from time to time.

to try it, you can explicitly clear TMR2IE.

another mistake you made is that you never cleared TMR2IF so the isr is stuck processing TMR2 overflow. what you should have done is to clear TMR2IF in the isr, not TMR2IE.
millwood0
4楼-- · 2020-02-11 02:42
I ran the following code:

========code=========

#include <htc.h>
//#include "Main_heard.h"
#include "gpio.h"

__CONFIG(BORDIS & MCLRDIS & PWRTDIS & WDTDIS & HS & LVPDIS);
__CONFIG(IESODIS & FCMDIS & DEBUGDIS & BORV21);

#define LED_PORT                        PORTC                        //led indicators on portc
#define LED_DDR                                TRISC
#define LED_TMR0                        (1<<0)                        //flip'd if tmr0 interrupt is serviced
#define LED_TMR1                        (1<<1)                        //flip'd if tmr1 interrupt is serviced
#define LED_TMR2                        (1<<2)                        //flip'd if tmr2 interrupt is serviced
void main(void) {

        ANSEL=0x00;                                                                //all pins gpio
        ANSELH=0x00;
        IRCF2=1, IRCF1=1, IRCF0=0;                                //running at 4mhz
        //T0IF=0;
        T0IE=1;//open int  need alawys open  
        PSA=0; PS1=0;  PS0=0;
        T0CS=0;
        TMR0=0;
   
        PEIE=1;
        GIE=1;
       
        IO_CLR(LED_PORT, LED_TMR0 | LED_TMR1 | LED_TMR2);        //led_tmr0/1/2 driven to low
        IO_OUT(LED_DDR, LED_TMR0 | LED_TMR1 | LED_TMR2);        //led_tmr0/1/2 as output

        while(1)
                continue;
}


/****************ISR******************************/
static void interrupt ISR(void)         // Here be interrupt function - the name is unimportant.
{
        if (T0IE&T0IF)// SYSTEMTICK 4.096MS int  need scan led an count or decount  
                {T0IF=0;
                IO_FLP(LED_PORT, LED_TMR0);                //flip led_tmr0
        }

        if (RBIE&RBIF)//partB int need scan key  
                {RBIF=0;
        }
  
        if (TMR1IE&TMR1IF)//ccp INT  read perid
                {TMR1IF=0;
                IO_FLP(LED_PORT, LED_TMR1);                //flip led_tmr1
        }

        if (TMR2IE&TMR2IF)// PWM TIME INT    CHANGE DUTY
                {TMR2IE=0;                                                 //should reset the flag, not the interrupt enabling bit
                IO_FLP(LED_PORT, LED_TMR2);                //flip led_tmr2
        }
}
==========end code=============

it has three indicators, portc.0, portc.1, and portc.2 (on a 16F886), designated as tmr0/1/2 interrupt indicators: when tmr0 interrupt is serviced, LED_TMR0 (portc.0) is flip'd, and so on and so forth.

when I ran the code, the only thing flip'd is portc.0 (=LED_TMR0). that means the only interrupt service being executed is the one related to T0IF, as expected.
lixin91985
5楼-- · 2020-02-11 08:41
 精彩回答 2  元偷偷看……
wmm20031015
6楼-- · 2020-02-11 11:37
和_谐得不好,总有些怪异的问题,坛里有9.8的,bug比较少

一周热门 更多>