INT0外部中断程序进入不了中断(hitech编译器)

2020-02-08 09:10发布

本帖最后由 chandler-00 于 2012-6-26 15:39 编辑

先上程序,打算用rb0口的外部中断,中断计数两次控制rd0 ,rd1端口电压反向,可是中断一直进入不了用的是hitech 的编译器
求大神帮助!!!求hitech 中断的例程

//#include <p18F4685.h>
#include <htc.h>
#pragma config OSC=HS
#pragma config WDT=OFF
#pragma config LVP=OFF

unsigned char i;
void inter();
void interrupt HI_ISR()
     {
         if (INTCONbits.INT0IF == 1)
   
     inter();
     }
          
void main(void)
{
   
        i = 0;
        //端口输入输出设置 初始化
        TRISDbits.TRISD0 = 0;
        TRISDbits.TRISD1 = 0;
        PORTDbits.RD0 = 0;
        PORTDbits.RD1 = 1;
        TRISBbits.TRISB0 = 1;               // RB0设置输入 ,外部中断
       
   
       
        //中断允许
        INTCONbits.PEIE = 1;                // peripheral interrupt enable
        INTCONbits.GIE = 1;                 // global interrupt enable
        INTCONbits.INT0IE = 1;              //允许int0外部中断
        INTCONbits.INT0IF = 0;              //INT0外部中断标志为清零
    //INTCONbits.RBIE = 1 ;               //允许rb端口电平变化中断
        //INTCON2bits.RBIP = 1;               //int0始终高优先级
    while (1)                          //等待中断发生
        {
    if (i = 2)
          {
          PORTDbits.RD0 = ~PORTDbits.RD0;
          PORTDbits.RD1 = ~PORTDbits.RD1;
      i = 0 ;
      }
    }   
}
void inter()
      {
      i ++;
      INTCONbits.INT0IF  = 0 ;
      }
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
16条回答
millwood0
1楼-- · 2020-02-09 10:15
调试的时候设置了断点的,总是等待中断发生的状态。


In that case, you are assuming that your debugger is behaving correctly, which may not be true.

the usual way here is to flip a pin in the isr.

Looks like you didn't disable other functions on RB0. Look up the datasheet for that.

if (i = 2)


That's just the shittest piece of code.
chandler-00
2楼-- · 2020-02-09 13:25
millwood0 发表于 2012-6-26 20:48
In that case, you are assuming that your debugger is behaving correctly, which may not be true.

t ...

“Looks like you didn't disable other functions on RB0. Look up the datasheet for that.”  
I have checked ,and this is the latest code , it did not work ! by the way , if (i = 2) is a obvious mistake ,I have changed it , Thanks !

#include <htc.h>
unsigned char i;

void interrupt HI_ISR()
     {
         if (INTCONbits.INT0IF == 1)
       {
         i ++;
         INTCONbits.INT0IF  = 0 ;
       }
     }
          
void main(void)
{
   
        i = 0;
        //端口输入输出设置 初始化
        ADCON1|= 0x0F;            //********将RB0等设置为数字I/O
        TRISD0 = 0;
        TRISD1 = 0;
        RD0 = 0;
        RD1 = 1;
        TRISB0 = 1;               // RB0设置输入 ,外部中断
       
   
       
        //中断允许

        IPEN = 1 ;                //使能中断优先级
        INT0IF = 0;               //INT0外部中断标志为清零
        INTEDG0 = 1;            //上升沿触发
        RBIF = 0 ;                 // RB4~RB7 电平变化标志位清零
        INT1IF = 0 ;             //INT1外部中断标志位清零
        RBIP = 1;                 //int0始终高优先级       
       INT0IE = 1;              //允许int0外部中断
        PEIE = 1;                // peripheral interrupt enable
        GIE = 1;                 // global interrupt enable
    while (1)                //等待中断发生
        {
    if (i == 2)             //如果频率过高,可能永远也执行不了
          {
          RD0 = ~RD0;
          RD1 = ~RD1;
      i = 0 ;
      }
    }   
}
millwood0
3楼-- · 2020-02-09 15:19
not sure what your problem is but here is what I would do:
  1. void interrupt int0_isr(void) {
  2.         static unsigned char i=0;
  3.        
  4.         INT0IF = 0;                                                        //clera the flag
  5.         i+=1;                                                                //increment the counter
  6.         if (i==2) {
  7.                 IO_FLP(OUT_PORT, OUT);                                //flip out
  8.                 i=0;                                                        //reset the counter
  9.         }
  10. }
  11.        
  12. void int0_init(void) {
  13.         IO_CLR(OUT_PORT, OUT);                                //clear out
  14.         IO_OUT(OUT_DDR, OUT);                                //out as output
  15.        
  16.         IO_IN(INT0_DDR, INT0);                                //int0 as input
  17.        
  18.         INTEDG0 = 1;                                                //intrrupt on rising edge
  19.        
  20.         INT0IF = 0;                                                        //clera the flag
  21.         INT0IE = 1;                                                        //enable int0 isr
  22. }
  23.        
复制代码int0_init() sets up the input and output pins, and activates the isr. in the isr, we use a counter to count the number of rising edges on int0 before the output pin is flipped.

they all follow roughly the same scheme to set up and to run.
chandler-00
4楼-- · 2020-02-09 20:15
 精彩回答 2  元偷偷看……
我开心
5楼-- · 2020-02-10 00:58
chandler-00 发表于 2012-6-27 16:58
能进入中断了,仿真的时候我用的是单步连续运行,这样进入不了中断,但是如果我用连续运行的话就可以进入 ...

那以前为什么近不了中断啊1!!!
chandler-00
6楼-- · 2020-02-10 06:48
本帖最后由 chandler-00 于 2012-6-27 17:54 编辑
我开心 发表于 2012-6-27 17:09
那以前为什么近不了中断啊1!!!


最初的程序不行是因为ADCON1寄存器没有配置,我发的第二个程序实际上是可以进入中断的,汗个。就是在线调试时点的单步连续运行的问题,用连续运行的方式就可以了 不知连续运行和单步连续运行有什么区别

新手总是被各种问题困扰啊!

一周热门 更多>