找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 283|回复: 23
打印 上一主题 下一主题
收起左侧

单片机外部中断问题

[复制链接]
跳转到指定楼层
楼主

void init(){
        IT0=1;
        EX0=1;
        EA=1;
}


就是每中断一次从数组abc中取一个值给t
for循环是读xu的值,值是多少led闪几下,
发现LED闪的不对呀,按理来说,中断一次led多闪一次,但实际不是,

用的P32的外部中断0,这个需要上拉或下拉吗????
P3PU |= 0x04;
这个内部上拉,用和不用,都没作用。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1109793 发表于 2024-5-10 08:25 | 只看该作者
中断触发方式呢?
回复

使用道具 举报

板凳
ID:619259 发表于 2024-5-10 09:28 | 只看该作者
EA放在中断函数里不科学吧!
回复

使用道具 举报

地板
ID:607298 发表于 2024-5-10 09:35 | 只看该作者
中断程序加延时是大忌,完全偏离中断的意义。
可以在中断里改变闪烁次数变量,然后在主程序里实现闪烁。
回复

使用道具 举报

5#
ID:275826 发表于 2024-5-10 09:38 | 只看该作者
编译没通过吧
回复

使用道具 举报

6#
ID:77589 发表于 2024-5-10 09:57 | 只看该作者
编程技巧先不说,延时短了,眼睛根本看不到闪
回复

使用道具 举报

7#
ID:1109793 发表于 2024-5-10 10:29 | 只看该作者
cy009 发表于 2024-5-10 09:28
EA放在中断函数里不科学吧!

有啥不科学的?
回复

使用道具 举报

8#
ID:1109793 发表于 2024-5-10 10:30 | 只看该作者
lightday 发表于 2024-5-10 09:35
中断程序加延时是大忌,完全偏离中断的意义。
可以在中断里改变闪烁次数变量,然后在主程序里实现闪烁。

楼主的中断只是用来接收开关信号的,又不是定时器中断,加点延时咋了?
回复

使用道具 举报

9#
ID:161164 发表于 2024-5-10 13:06 | 只看该作者
没电路图盲猜按键接中断
你没加按键消抖,并在中断里延时了
于是中断在延时期间收到抖动信号,误判了
反复进入中断
回复

使用道具 举报

10#
ID:161164 发表于 2024-5-10 13:26 | 只看该作者

回复

使用道具 举报

11#
ID:299872 发表于 2024-5-10 14:28 | 只看该作者
lkc8210 发表于 2024-5-10 13:06
没电路图盲猜按键接中断
你没加按键消抖,并在中断里延时了
于是中断在延时期间收到抖动信号,误判了

你说对了。
我觉得是抖动的问题,所以在中断是把EA关了呀。
在中断里延时也是怕抖动的问题。

重点是有一个逻辑我没弄明白。比如中断里的程序还没处理为又发生中断,这时单片机怎么处理,是直接无视,还是排对处理呀???
回复

使用道具 举报

12#
ID:299872 发表于 2024-5-10 14:29 | 只看该作者
Longan.Wang 发表于 2024-5-10 09:57
编程技巧先不说,延时短了,眼睛根本看不到闪

一次是10ms,20次是200ms
回复

使用道具 举报

13#
ID:299872 发表于 2024-5-10 14:36 | 只看该作者

应该就是这个问题,
所以我关EA,开EA,加延时。
看样子加延时是没用的。
开关EA也不行,那应该怎么处理呀??

drrteet.JPG (57.07 KB, 下载次数: 3)

drrteet.JPG
回复

使用道具 举报

14#
ID:161164 发表于 2024-5-10 14:43 | 只看该作者
xjtong 发表于 2024-5-10 14:28
你说对了。
我觉得是抖动的问题,所以在中断是把EA关了呀。
在中断里延时也是怕抖动的问题。

"中断里的程序还没处理完又发生中断"
单片机会继续运行中断函数
直到运行完毕跳出中断函数
单片机会立刻再次运行中断函数
回复

使用道具 举报

15#
ID:275826 发表于 2024-5-10 15:30 | 只看该作者
都说了编译通不过呀
回复

使用道具 举报

16#
ID:57657 发表于 2024-5-10 15:39 | 只看该作者
外部中断接的是什么? 如果是按键需要消抖处理。
回复

使用道具 举报

17#
ID:299872 发表于 2024-5-10 17:29 | 只看该作者
问题解决了。
void int0() interrupt 0
{
        u8 i;
        if(!P32){
        for(i=0;i<xu;i++){
                led=1;dd(20);
                led=0;dd(20);
        }
        t=abc[xu++];
        xu &=0x07;
        }
}


这样就好了。
回复

使用道具 举报

18#
ID:299872 发表于 2024-5-10 17:33 | 只看该作者
tyrl800 发表于 2024-5-10 15:30
都说了编译通不过呀

编译一直没问题,就是中断是乱的。应该是中断重入的问题。
回复

使用道具 举报

19#
ID:299872 发表于 2024-5-10 17:34 | 只看该作者
npn 发表于 2024-5-10 15:39
外部中断接的是什么? 如果是按键需要消抖处理。

恩,直接用杜邦线点GND,按键都省了。
回复

使用道具 举报

20#
ID:1109793 发表于 2024-5-10 17:37 | 只看该作者
不关是不是重复中断,这样延时的闪烁都应该正常才对啊,先软件模拟一下看看那些变量都是多少
回复

使用道具 举报

21#
ID:883242 发表于 2024-5-10 17:39 | 只看该作者
xjtong 发表于 2024-5-10 14:28
你说对了。
我觉得是抖动的问题,所以在中断是把EA关了呀。
在中断里延时也是怕抖动的问题。

再发生中断会挂起pending,退出中断处理程序后会再次进入中断处理程序。
回复

使用道具 举报

22#
ID:299872 发表于 2024-5-10 17:49 | 只看该作者
就是用单片机操作续电器,续电器控制风扇。

有一个2。4G雷达,有运动就开风扇,开的时间用延时控制。
中断的作用是改变延时的时候,从而改变风扇运行的时候。

#include <STC8G.h>
#include <intrins.h>
#define u16 unsigned int
#define u8 unsigned char
       
sbit leda = P5^5;
sbit led = P5^4;
sbit fan = P3^3;

const unsigned int data abc[8]={0xea60,0xa410,0x8ca0,0x7530,0x4650,0x1770,0x0bb80,0x05dc};
u16 t;
u8 xu;

void Delay10ms(void)        //@11.0592MHz
{
        unsigned char data i, j;
        _nop_();_nop_();
        i = 144;
        j = 157;
        do
        {
                while (--j);
        } while (--i);
}

void dd(unsigned int tttt){
        while(tttt--)Delay10ms();
}

void init(){
        IT0=1;
        EX0=1;
        EA=1;
}

void int0() interrupt 0
{
        u8 i;
        if(!P32){
        for(i=0;i<xu;i++){
                led=1;dd(20);
                led=0;dd(20);
        }
        t=abc[xu++];
        xu &=0x07;
        }
}

void main(){
        u16 tt;
        P5M0 &= ~0x30; //P54双向口,P55高阻
        P5M1 = (P5M1 & ~0x10) | 0x20;
        P3M0 = (P3M0 & ~0x04) | 0x08; //P33 推挽
        P3M1 &= ~0x0c;
        P3PU |= 0x04; //P3.2上拉开打
        init();
        led=0;
        while(1){
                if(leda)tt=t;   //5min
                led=leda;
                if(tt){tt--;fan=1;Delay10ms();} else {fan=0;}
        }
}


这样基本就没问题的。就是中断重入的问题。开始LED闪烁明显不对。现在一切正常了。
回复

使用道具 举报

23#
ID:275826 发表于 2024-5-10 19:42 | 只看该作者
xjtong 发表于 2024-5-10 17:33
编译一直没问题,就是中断是乱的。应该是中断重入的问题。

我用KEIL 4编译你程序不过,修改下int0 通过,程序一切正常,没有乱入问题
回复

使用道具 举报

24#
ID:1120208 发表于 2024-5-11 14:38 | 只看该作者
xiaobendan001 发表于 2024-5-10 10:30
楼主的中断只是用来接收开关信号的,又不是定时器中断,加点延时咋了?

只要是中断,都是不建议有延时的,反正linux内核的中断是这样的思想
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表