[技术问答]

关于N76E003中断例程问题,大神吧、帮忙解释一下

[复制链接]
5682|14
手机看帖
扫描二维码
随时随地手机跟帖
安稳如此沉重|  楼主 | 2017-5-25 18:01 | 显示全部楼层 |阅读模式
帮忙解释一下下面这个中断例程运行过程,为什么我感觉例程的一些配置有点乱,好像有些配置没有用啊。谢谢好人……

#include "N76E003.h"
#include "SFR_Macro.h"
#include "Function_define.h"
#include "Common.h"
#include "Delay.h"
void EXT_INT0(void) interrupt 0
{
                                clr_GPIO1;
                        Timer0_Delay1ms(100);
                        set_GPIO1;
                        Timer0_Delay1ms(100);
                        clr_GPIO1;
                        Timer0_Delay1ms(100);
                        set_GPIO1;
                        Timer0_Delay1ms(100);   
                        clr_GPIO1;
                        Timer0_Delay1ms(100);
                        set_GPIO1;
                        Timer0_Delay1ms(100);
                        clr_GPIO1;
                        Timer0_Delay1ms(100);
                        set_GPIO1;
                        Timer0_Delay1ms(100);  
                                clr_GPIO1;
                        Timer0_Delay1ms(100);
                        set_GPIO1;
                        Timer0_Delay1ms(100);
                        clr_GPIO1;
                        Timer0_Delay1ms(100);
                        set_GPIO1;
                        Timer0_Delay1ms(100);   
                        clr_GPIO1;
                        Timer0_Delay1ms(100);
                        set_GPIO1;
                        Timer0_Delay1ms(100);
                        clr_GPIO1;
                        Timer0_Delay1ms(100);
                        set_GPIO1;
                        Timer0_Delay1ms(100);  
                }

void PinInterrupt_ISR (void) interrupt 7
{
        if(PIF == 0x01)
        {
    PIF = 0x00;                             //clear interrupt flag
                        clr_GPIO1;
                        Timer1_Delay10ms(10);
                        set_GPIO1;
                        Timer1_Delay10ms(10);
                        clr_GPIO1;
                        Timer1_Delay10ms(10);
                        set_GPIO1;
                        Timer1_Delay10ms(10);   
               
        }
        else if (PIF == 0x80)
        {
                        clr_GPIO1;
                        Timer1_Delay10ms(10);
                        set_GPIO1;
                        Timer1_Delay10ms(10);
                        clr_GPIO1;
                        Timer1_Delay10ms(10);
                        set_GPIO1;
                        Timer1_Delay10ms(10);   
                        clr_GPIO1;
                        Timer1_Delay10ms(10);
                        set_GPIO1;
                        Timer1_Delay10ms(10);
                        clr_GPIO1;
                        Timer1_Delay10ms(10);
                        set_GPIO1;
                        Timer1_Delay10ms(10);   
        }
}
/******************************************************************************
The main C function.  Program execution starts
here after stack initialization.
******************************************************************************/
void main (void)
{

    P07_Input_Mode;                 //ÅäÖÃP07ΪÊäÈëģʽ
                set_P0S_7;                                                                                        //ÅäÖÃΪʩÃÜÌØ´¥·¢ÊäÈë
                P00_Input_Mode;                                                                  //ÅäÖÃP00ΪÊäÈëģʽ
                P01_Input_Mode;                                                                        //ÅäÖÃP01ΪÊäÈëģʽ
                set_P0S_1;                                                                                        //ÅäÖÃΪʩÃÜÌسö·¢ÊäÈë
                P12_PushPull_Mode;                                                        //ÅäÖÃΪÍÆÍìÊä³öģʽ
                P30_PushPull_Mode;                                                        //ÅäÖÃΪÍÆÍìÊä³öģʽ
                P05_PushPull_Mode;                                                        //ÅäÖÃΪÍÆÍìÊä³öģʽ
       
               
//----------------------------------------------------
//        P0.5 set as highlevel trig pin interrupt function
//  Keep P0.5 connect to VDD LED will tickle
//  otherwise, MCU into power down mode.
//----------------------------------------------------
                Enable_INT_Port0;                     //¹Ü½ÅÖжÏ0µçƽ´¥·¢
                Enable_BIT7_LowLevel_Trig;                                                //¹Ü½ÅÖжÏ6¼°7µçƽ´¥·¢£¬¹Ü½ÅÖжϷ´ÏòÌØÐÔʹÄÜ£¬ÕýÏòÌØÐԹرա£
                Enable_BIT0_LowLevel_Trig;                                                //¹Ü½ÅÖжÏ0µçƽ´¥·¢£¬¹Ü½ÅÖжϷ´ÏòÌØÐÔʹÄÜ£¬ÕýÏòÌØÐԹرա£

                P30 =1;
                P05 = 0;

    set_EPI;                                                        // Enable pin interrupt ʹÄÜÒý½ÅÖжÏ
                set_EX0;                                                        //ʹÄÜÓÉP3.0²úÉúÖжÏ
    set_EA;                                                                // global enable bit ʹÄÜËùÓÐÖжÏ
   
    while(1)
                {
                        P01=0;
                        P30=0;
                        P01=1;
                        P30=1;
                }

}
安稳如此沉重|  楼主 | 2017-5-25 18:05 | 显示全部楼层
QQ截图20170525180256.png

使用特权

评论回复
xixi2017| | 2017-5-25 21:25 | 显示全部楼层
分为外部中断和IO中断啊,。

使用特权

评论回复
gejigeji521| | 2017-5-25 22:34 | 显示全部楼层
不要疑问,这个例子包含了两种的IO中断,一个是传统的中断,就是一个中断向量对应一个中断入口的那种。INT0那个
还有一种就是后来扩充的GPIO中断,这个的多个IO端口对应一个中断向量。

使用特权

评论回复
安稳如此沉重|  楼主 | 2017-5-26 09:06 | 显示全部楼层
xixi2017 发表于 2017-5-25 21:25
分为外部中断和IO中断啊,。

运行过程是怎么样的?

使用特权

评论回复
安稳如此沉重|  楼主 | 2017-5-26 09:08 | 显示全部楼层
gejigeji521 发表于 2017-5-25 22:34
不要疑问,这个例子包含了两种的IO中断,一个是传统的中断,就是一个中断向量对应一个中断入口的那种。INT0 ...

一个外部中断,一个管脚中断,但是外部中断没有配置说明是电平触发还是边沿触发,那是怎么样触发?

使用特权

评论回复
捉虫天师| | 2017-5-26 09:11 | 显示全部楼层
那不是说0电平触发了吗?就是下降沿。。。

使用特权

评论回复
捉虫天师| | 2017-5-26 09:12 | 显示全部楼层
楼主新手吗?那不是写着低电平触发,意思就是从高电平跳变到低电平后就触发一次。。。也就是下降沿。

使用特权

评论回复
安稳如此沉重|  楼主 | 2017-5-26 10:41 | 显示全部楼层
捉虫天师 发表于 2017-5-26 09:12
楼主新手吗?那不是写着低电平触发,意思就是从高电平跳变到低电平后就触发一次。。。也就是下降沿。 ...

是新手,那里的低电平触发是管脚中断的配置,这样的意思是不是可以说外部中断也是管脚中断的一种?芯片的手册说外部中断根据IT0 (TCON.0) 和 IT1 (TCON.2)选择边沿触发,还是电平触发中断。

使用特权

评论回复
捉虫天师| | 2017-5-26 10:55 | 显示全部楼层
安稳如此沉重 发表于 2017-5-26 10:41
是新手,那里的低电平触发是管脚中断的配置,这样的意思是不是可以说外部中断也是管脚中断的一种?芯片的 ...

对,这个是为了继承传统的8051的中断。传统的只能这两个管脚中断,其他的PIN不行。后来出现了这种增强版本的,比如新唐自己为了让功能更强大,把普通的IO也改造成了具备中断的功能,不过这些IO共用了一个中断入口。进去后要判断具体是哪个管脚中断,而传统的那两个中断管脚具备独立的入口,因此响应会更快,进去后,不需要判断。

使用特权

评论回复
安稳如此沉重|  楼主 | 2017-5-26 11:52 | 显示全部楼层
捉虫天师 发表于 2017-5-26 10:55
对,这个是为了继承传统的8051的中断。传统的只能这两个管脚中断,其他的PIN不行。后来出现了这种增强版 ...

谢谢你的回答,占用你的时间了。
你看下这图,外部中断引脚是P3.0和P1.7都在下面,你说两个中断管脚具备独立的入口,也就是这两个外部中断引脚能配置成外部中断和引脚中断两种方式吗?
那程序那里是属于管脚中断还是外部中断,如果是外部中断的话不是应该配置IT0 (TCON.0) 和 IT1 (TCON.2)选择边沿触发,还是电平触发中断吗?
还是说,不管是配置IT0 (TCON.0) 和 IT1 (TCON.2)还是配置下图的管脚中断一些寄存器,他都属于外部中断?
外部中断引脚是输入还是输出?程序上面配置了P3.0为输出模式。
QQ截图20170526113130.png

使用特权

评论回复
捉虫天师| | 2017-5-26 14:33 | 显示全部楼层
你贴的这个图就是后来扩展的中断,属于PIN中断,这些都是好几个腿共用一个入口。具体看手册和例程吧。。

使用特权

评论回复
安稳如此沉重|  楼主 | 2017-5-27 09:07 | 显示全部楼层
捉虫天师 发表于 2017-5-26 14:33
你贴的这个图就是后来扩展的中断,属于PIN中断,这些都是好几个腿共用一个入口。具体看手册和例程吧。。 ...

谢谢

使用特权

评论回复
wahahaheihei| | 2017-5-27 16:00 | 显示全部楼层
嗯,上面讲的很有道理。

使用特权

评论回复
huahuagg| | 2018-1-18 17:24 | 显示全部楼层
中断这么复杂。

使用特权

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

本版积分规则

3

主题

14

帖子

0

粉丝