[技术支持] sq013l一次电平变化进两次中断,求解!

[复制链接]
452|11
 楼主 | 2018-8-28 14:56 | 显示全部楼层 |阅读模式
本帖最后由 yueguang3048 于 2018-8-28 15:08 编辑

//PORTB1 上拉输出 高电平  
//PORTB0 上拉输入 高电平(KEY)

一个简单的应用, PORTB0电平发生一次变化,则PORTB1输出一个2S的低电平,其余时刻休眠。
但是发现一个问题:
PORTB0由高然后直接接GND(接触良好),有一定概率触发两次中断,即PORTB1输出4S的低电平。
PORTB0由低然后高,没有问题,即PORTB1输出2S的低电平。


1.现在的方案是中断中增加1S延时,DelayMs(100);//1S @1Mhz        4T ,能够保证两次触发的最小间隔变成1S。但是还是存在一次电平变化,进两次中断的问题,只不过中间会加1S的延时。
2.尝试过进中断关总中断,也不好用。
void Intr(void) __interrupt 0
{        
        GIE=0;               
        if(PBIF)                                       
        {        
                PBIF=0;                                                                                                   
                PORTB1=0;
                DelayMs(200);//2S @1Mhz 4T
                PORTB1=1;               
                DelayMs(100);//1S @1Mhz        4T
                GIE=1;                                
        }        
        

}
3.PORTB0使能了施密特触发器。

OTP型单片机不方便实际验证,求大神指教指教,谢谢。

以下是程序:
#include <sq013l.h>
#include "holychip_define.h"
#include "inital.h"
#include "subroutine.h"
//15mA@3.3V  32mA@5V仿真的板子
//PORTB1 上拉输出 高电平  
//PORTB0 上拉输入 高电平(KEY)
void inital(void)
{
        PORTB=0X03;                                //PORT口输出高低电平设置  1=高电平,0=低电平
        TRISB=0X01;                                //输入输出设置  1=输入,0=输出

        PHCON =0XFC;                        //上拉设置 1=DISABLED PULL-UP    ;0=PULL-UP        
        PDCON =0XFF;                        //下拉设置 1=DISABLED PULL-DOWN  ;0=PULL-DOWN        
        ODCON =0X00;                        //开漏设置 0=DISABLED OD                   ;1=OD
        
}
void sysinitial(void)
{
        INTECON=0x00;                          //关闭所有中断
         OPTION=0X80;                        //Ftimer0 1/2
        PCON=0X00;                        //关闭WD 外部中断
}
void PORTB_interrupt_inital()
{
        IOCB=0X01;                //使能PORTB0端口为电平变化中断        
        PBIF=0;                        // PROTB中断请求标志清零,PBIF:端口电平变化中断使能位
        PBIE=1;                        //使能PROTB中断,PBIE:端口电平变化中断使能位        
        GIE=1;                        //使能总中断
}        
void main()
{
        inital();                        //端口初始化
        DelayMs(10);                //延时等待系统稳定
        sysinitial();                //系统初始化
        PORTB_interrupt_inital();
        while(1)
        {        
                asm(sleep)
        }
}
//*****************************PORTB中断服务程序*****************************
void Intr(void) __interrupt 0
{                DelayMs(10);        //发现加了这句后,好用了,是不是因从休眠到中断唤醒,系统不稳定???求官方指导,有关SQ013L休眠方面的资料很少。
        PBIE=0;
        if(PBIF)                             //PBIF只要有电平变化中断就会变成1,只不过只有PBIE=1的时候才能进中断。           
        {        
                PBIF=0;                                                                                                
                PORTB1=0;
                DelayMs(200);//2S @1Mhz 4T
                PORTB1=1;               
                DelayMs(100);//1S @1Mhz        4T//此句可以去掉了。
                PBIE=1;                        
        }               
}



| 2018-8-28 23:29 | 显示全部楼层
跳入中断函数时,先把中断标志清0,然后延时10ms去抖动,再次判断是否为低电平,如果为低电平则认为有效
 楼主 | 2018-8-29 09:32 | 显示全部楼层
ICCCCC 发表于 2018-8-28 23:29
跳入中断函数时,先把中断标志清0,然后延时10ms去抖动,再次判断是否为低电平,如果为低电平则认为有效 ...

感谢支持
| 2018-9-7 11:42 | 显示全部楼层
sleep前后加几句NOP指令,唤醒后做一个几us的延时。
 楼主 | 2018-9-10 09:42 | 显示全部楼层
雨后梧桐 发表于 2018-9-7 11:42
sleep前后加几句NOP指令,唤醒后做一个几us的延时。

十分感谢
| 2018-9-20 09:09 | 显示全部楼层
楼主的问题解决了吗???
 楼主 | 2018-10-9 10:47 | 显示全部楼层
cbx_xx 发表于 2018-9-20 09:09
楼主的问题解决了吗???

看一下红色的字   还有这个单片机的定时器只要上电其实是一直在跑...
| 2018-10-10 20:27 | 显示全部楼层
上电机就跑?那如果加个电源呢?
| 2018-10-10 21:19 | 显示全部楼层
问题解决了吗?
| 2018-10-12 14:59 | 显示全部楼层
我不知道是什么问题         但我系供应商    要拿货SQ013/2711/003 可以找我
  

肿么联系我呢     QQ 1449251178 微信18126448445
| 2018-10-17 20:27 | 显示全部楼层
楼主解决了之后发个贴哦。
| 2018-10-17 20:27 | 显示全部楼层
谢谢楼主
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

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