找回密码
 立即注册
查看: 1487|回复: 8

关于STC8改用内部上拉电阻后,上电按键INT0误触发1次

[复制链接]

该用户从未签到

552

主题

9497

回帖

1万

积分

管理员

积分
14069
发表于 2022-12-27 15:07:51 | 显示全部楼层 |阅读模式
刚在地球上飘,在某个角落看到1个1周无人回答到位的问题:
关于STC8单片机改用内部上拉电阻后每次上电按键INT0误触发1次原因探讨


一、问题
近日碰到个奇怪的问题:STC8单片机按键接P32脚INT0(边沿或下降沿),用外部上拉电阻本来很正常的,后来改用内部上拉4.1K电阻后,每次上电INT0误触发+1次!理应等同,已验证内部上拉电阻设置成功,已排除其他干扰,百思不得其解!决定必须一查到底!
二、之前代码
  • void BOOT()                     //总初始化 最简整理221215;      (STC8G1K08)
  • {
  •     dl_ms(100);                 //上电适当延时一下好些;
  •     P1M1=P5M1=0x00, P1=P5=0xff, //P1P5口:均设双向置1;    其他默认;
  •     P3M1=0x0C;       P3 |=0xf3; //P3  口:P32按键、P33脚都是边沿中断设高阻不置1,其余双向置1;
  •     status=Kc= 0;               //初值: status工作状态标志 (开机0/待机1/复位2), Kc短按次数);
  •     G=R=b=W=0, dl_ms(1000);     //开机/复位后: 绿红蓝白灯 全亮1s灭1s;
  •     G=R=b=W=1, dl_ms(1000);     //               问题发现: 以上3行放最后面编译代码少1B;奇怪?
  •     P_SW2 |= 0x80;              //访问XSRF先BIT7=1; 统一放前无需归零(有外扩64K扩展RAM时才要);
  •     P3IE=0x0C, P1IE=0x00, P5IE=0x20; //输入只留P32、P33、P55(其余全关);
  •                                 //P55控制大灯W(用到if W==1读端口还是读引脚?先不关);
  •     P3PU=0x04;                  //使能内部上拉电阻;
  •     TMOD= 0x01;                 //T0:模式01;16位不自动重载(默认12T);消抖用的查询方式;
  •     EX0=EX1=EA =1;              //开中断;
  • }

[color=rgb(51, 102, 153) !important]复制代码

[color=rgb(51, 102, 153) !important]
三、措施对策
1、 先暂时软件处理-1次。可以解决。但还得追究根本原因;
2、先后试了开中断前后加空操作或足够的延时等办法,均无效;
3、最后,调整段落,发现将第3段代码(最后5行)改到第2段代码(中间3行)的前面后,居然就正常了(终于用内部上拉或外部上拉都完全一样了)!代码附后;
4、但还是百思不得其解! 后面有空再继续研究,走过路过感兴趣的朋友不妨一起查查具体原因。
      理论上:  上拉电阻用外接或内置完全等同, 只需注意先设置好后再开中断;
      问题是:后2段代码前后调换,究竟哪里不同了?  注意到编译后代码量还会差1B; 为什么?        
四、目前代码
  • void BOOT()                         //总初始化 最简整理221217改;      (STC8G1K08)
  • {
  •     dl_ms(100);                      //不变;
  •     P1M1=P5M1=0x00, P1=P5=0xff,      //不变;
  •     P3M1=0x0C;       P3 |=0xf3;      //不变;
  •     P_SW2 |= 0x80;                   //;
  •     P3IE=0x0C, P1IE=0x00, P5IE=0x20; //;
  •     P3PU=0x04;                       //;
  •     TMOD= 0x01;                      //;
  •     EX0=EX1=EA =1;                   //开中断; 前4行任1条放最后面多1B;奇怪?
  •   //以上5行改放最后每次上电int0误触发1次! 但加外接上拉电阻随便几K就不会!奇怪?
  •     status=Kc= 0;                    //;
  •     G=R=b=W=0, dl_ms(1000);          //;
  •     G=R=b=W=1, dl_ms(1000);
  • }

复制代码

csdn上面也有此文,均为本人所发,暂未有人答复。







回复 送花

使用道具 举报

该用户从未签到

552

主题

9497

回帖

1万

积分

管理员

积分
14069
 楼主| 发表于 2022-12-27 15:11:14 | 显示全部楼层
答:不是误触发,是 MCU 太快
这种小问题,看下 I/O 部分,不就懂了, 现在的MCU 太快  !
外部上拉,是MCU 正式开跑之前,外部已被拉高;
外部无上拉,程序开跑时,你才打开内部上拉,你要等一段时间,外部才会被拉高到2V以上,
===你程序要加延时!!!
STC8/STC32G系列是高速MCU 时代

大致估计等待 时间 R*C, 这个C 是 芯片和PCB上的分布电容,总要等个 0.7 R*C 的时间, 才大约到 2V 以上

不知道如何算这个等待时间,你就反复读这个 I/O变高,维持 200uS ~ 1mS 的高就行,
刚开始的浮空,读出是不确定的

该用户从未签到

552

主题

9497

回帖

1万

积分

管理员

积分
14069
 楼主| 发表于 2022-12-27 15:18:46 | 显示全部楼层
关键时刻,必须到官方 8051纯技术交流社区 www.STCAIMCU.com 报道,才有正确答案, 这样效率也高
  • TA的每日心情
    奋斗
    昨天 08:59
  • 签到天数: 143 天

    [LV.7]常住居民III

    27

    主题

    1343

    回帖

    4187

    积分

    论坛元老

    积分
    4187
    发表于 2022-12-27 16:52:47 | 显示全部楼层
    开启外部中断前,先清一下中断标志试试:

    1.png

    该用户从未签到

    552

    主题

    9497

    回帖

    1万

    积分

    管理员

    积分
    14069
     楼主| 发表于 2022-12-27 17:53:16 | 显示全部楼层
    1.png

    STC官方实验箱 INT0/INT1 这2个 PIN 都加了外部上拉,
    如没加外部上拉,打开内部上拉后,立即去读外部状态,
    这时 很多时候读到的是低电平,所以 MCU 认为有下降沿来了很正常

    该用户从未签到

    552

    主题

    9497

    回帖

    1万

    积分

    管理员

    积分
    14069
     楼主| 发表于 2022-12-27 18:08:45 | 显示全部楼层
    看到一 网友在 另外一个 地方 对他这个问题的指点

    1.png

    我再讲下,IC/PCB都有分布电容效应,相当于I/O外部对地还有个接地的电容如:
    100pF ~ 500pF 到地

    大约 R*C 时间之后,I/O 被准确的拉高

    该用户从未签到

    552

    主题

    9497

    回帖

    1万

    积分

    管理员

    积分
    14069
     楼主| 发表于 2022-12-28 08:18:45 | 显示全部楼层
    套用下面的这个延时电路,讲下,大家就明白了

    1.png
    这个10K*10uF是个延时电路,上电延时 R*C个时间为低电平后被准确拉高
    你将这个10uF 想象成每个 I/O在内部和外部走线引起的分布电容,如 100pF ~ 500pF以上
    ===外部 PCB  I/O 走线越长越粗,则分布电容越大
    那个10K上拉是你内部打开的4K 上拉,那你要读到高的等待时间可能是
    R*C = 4K * 300pF,  STC8/STC32G 可能已经跑了几万条指令,
    0.7R*C 是比较合理的,3.3V 工作, 2V 以上就肯定是高了
    系统初始化程序,简易直接先判断I/O变高 100uS ~ 1mS后,再 打开这个I/O口的中断
    2.png
    想想,外部实际有个分布电容已将I/O拉低,你打开内部上拉,
    他总得有个充电时间才能拉高吧, 所有的问题回到基本的 R*C原理上来

  • TA的每日心情
    开心
    2024-5-10 16:29
  • 签到天数: 1 天

    [LV.1]初来乍到

    11

    主题

    68

    回帖

    283

    积分

    中级会员

    积分
    283
    发表于 2023-2-1 22:04:17 来自手机 | 显示全部楼层
    加吧!上电复位前的状态不可控!程序控制也只是程序运行后。特别是终端初始化再一些按键初始化前

    该用户从未签到

    46

    主题

    3042

    回帖

    6857

    积分

    超级版主

    积分
    6857
    发表于 2023-2-1 23:15:59 | 显示全部楼层
    本帖最后由 梁工 于 2023-2-1 23:17 编辑

    INT0~INT4内部有硬件边沿(上升沿、下降沿)检测电路,上电时,IO是高阻,IO有0到1或1到0的变化,所以标志为1。

    我一直养成一个好习惯:
    开中断前,先清除中断标志!
    开中断前,先清除中断标志!
    开中断前,先清除中断标志!

    重要的事说3遍。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-18 21:16 , Processed in 0.070609 second(s), 63 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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