pcwinner 发表于 2019-9-21 08:29:58

STC单片机开内部上拉,外部加上拉电阻应该没什么影响吧?

如题,有个产品,按键部分本来是外部上拉的,因工艺问题有部分上拉电阻虚焊。现在不想一块块板检查了,想直接把内部上拉也开起来,双重保证。
按道理来说除了功耗高那么一点点外应该对电路没什么影响吧。 之前要不开内部上拉,要不就单外接上拉电阻。一直没试过这样用,不太确定。

ackyee 发表于 2019-9-21 08:40:13

没影响 内部的是弱上拉有些情况下 太弱的上拉达不到要求就再加个上拉电阻

SUPER_CRJ 发表于 2019-9-21 08:49:05

没问题!

wkman 发表于 2019-9-21 09:01:19

{:sweat:}stc8/15 的io驱动ULN2803接继电器,有的时候行有的时候不行,全设置成推挽,就没有出现这种现象了。。。

pcwinner 发表于 2019-9-21 09:34:07

wkman 发表于 2019-9-21 09:01
stc8/15 的io驱动ULN2803接继电器,有的时候行有的时候不行,全设置成推挽,就没有出现这种现象 ...

本来你作为输出就应该设为推挽呀。。。。。。我是按键输入

yoursnemo 发表于 2019-9-21 09:41:15

相当于两电阻并联,上拉电阻变小而已,没关系的。

黑夜之狼 发表于 2019-9-21 10:26:13

没毛病,上拉为了保持默认高电平,外接+内接只不过把整体电阻变小了

arm 发表于 2019-9-21 11:12:34

7楼说的有道理

xmm 发表于 2019-9-21 11:21:18

内部上拉对于按键来说已经够用了,可以不用外加

Eric_Xue 发表于 2019-9-23 11:02:22

完全没关系,按键不按的话,是没有电流消耗的。谁没事一直按着按键。

小李非刀 发表于 2019-9-23 22:46:36

没问题,就是多个上拉而已,只要电阻合适就OK。

hodel 发表于 2020-8-13 19:50:21

没有问题的{:lol:}

ax6808 发表于 2022-12-17 00:39:27

我就碰到这个问题

ax6808 发表于 2022-12-17 00:42:00

真有不同效果,就是用内部上拉电阻每次开机总是会误触发中断0启动一次,外部上拉就不会,真暂时百思不得其解,研究中。

ax6808 发表于 2022-12-17 00:46:43

理论上当然是完全一样的。
我中断0就接了个按键到地,按一下累计1次,初始置0,结果用内置4.1KΩ就老是开机就+1,用外置5KΩ差不多阻值就不会。其他一切正常。

jssd 发表于 2022-12-17 08:13:33

本帖最后由 jssd 于 2022-12-17 08:16 编辑

ax6808 发表于 2022-12-17 00:46
理论上当然是完全一样的。
我中断0就接了个按键到地,按一下累计1次,初始置0,结果用内置4.1KΩ就老是开机 ...
(引用自15楼)

我觉得理论上不一样,内部是靠程序打开才来的电阻,外部一上电就存在了。也就是说,中断发生在内部电阻设置之前,所以被检测到了一次。按这个理论,中断触发改成边沿触发,而且是下边沿触发应该就好了

qd118118 发表于 2022-12-17 09:37:35

如果开关是拉线过来的,一般加上拉电阻及对地加104电容

ax6808 发表于 2022-12-17 21:38:24

本帖最后由 ax6808 于 2022-12-17 21:41 编辑

jssd 发表于 2022-12-17 08:13
我觉得理论上不一样,内部是靠程序打开才来的电阻,外部一上电就存在了。也就是说,中断发生在内部电阻设 ...
(引用自16楼)

嗯!确实奇怪,我还在查具体原因.
初始化里,内部上拉电阻设置:已经很前面了,中断允许前已有足够延时...单下跳沿或双边沿都一样问题.
继续查,一查到底...

ax6808 发表于 2022-12-18 00:30:54

本帖最后由 ax6808 于 2022-12-18 00:33 编辑

终于:查到一个解决办法了,只是不知道具体原因,只知道最后3行不能放到 P_SW2 |= 0x80这行的前面!
不然:用内置上拉电阻开机中断0会误触发1次, 编译后代码量会多1B;   还是百思不得其解! 感兴趣的继续一起研究: (好玩么?)
附详细代码及解释:
void BOOT()                                           //总初始化 最简整理221217;      (STC8G1K08)      
{                                                          
    dl_ms(100);                                                  //上电适当延时一下好些;
    P1M1=P5M1=0x00, P1=P5=0xff,      //P1P5口:均设双向置1;         PxM0=0x00默认;   
    P3M1=0x0C;       P3 |=0xf3;             //P3口:P32按键、P33充电检测脚都是双边沿中断,设高阻不置1,其余双向置1;
   
    P_SW2 |= 0x80;                                  //XSRF!访问XSRF先BIT7=1; 统一放前无需归零(有外扩64K扩展RAM时才要);   
    P3IE=0x0C, P1IE=0x00, P5IE=0x20;   //XSRF!输入默认全开1,只留P32、P33、P55(其余全关掉省电); P55控制大灯W(用到if W==1读端口还是读引脚??先不关)!
    P3PU=0x04;                                              //XSRF!按键改高阻+4.1K内部上拉电阻最优(串300Ω保留他用)        ;
   TMOD= 0x01;                                     //T0:模式01;16位不自动重载(默认12T);10ms消抖用查询方式(非中断);
    EX0=EX1=EA =1;                               //开中断; 前4条任1条放最后面多1B;奇怪?
                                                               //以上5行改放最后 每次上电保证int0误触发1次! 但加外接上拉电阻随便几K就不会! ?奇怪?加多少延时或空操作等等都无效!?

    status=Kc= PDc= 0;                        //初值: status工作状态标志 (开机0/待机1/复位2), PDc唤醒次数 计时用;            
                                                            //         Kc短按次数:0                            (之前: 改Kc初值-1: 是因临时解决每次上电后中断误触发1次Kc+1; )
    G=R=b=W=0, dl_ms(1000);             // 开机/复位后: 绿红蓝白灯 全亮1s灭1s;
    G=R=b=W=1, dl_ms(1000);      
}

国学芯用 发表于 2022-12-19 16:46:05

ax6808 发表于 2022-12-18 00:30
终于:查到一个解决办法了,只是不知道具体原因,只知道最后3行不能放到 P_SW2 |= 0x80这行的前面!
不然:...
(引用自19楼)

好好学习 天天向上这里是新手聚集地 欢迎围观指导 https://www.stcaimcu.com/forum.php?mod=viewthread&tid=323

jssd 发表于 2022-12-21 10:08:09

ax6808 发表于 2022-12-18 00:30
终于:查到一个解决办法了,只是不知道具体原因,只知道最后3行不能放到 P_SW2 |= 0x80这行的前面!
不然:...
(引用自19楼)

厉害?……

小李非刀 发表于 2022-12-21 10:46:40

ackyee 发表于 2019-9-21 08:40
没影响 内部的是弱上拉有些情况下 太弱的上拉达不到要求就再加个上拉电阻 ...
(引用自2楼)

STC8系列、STC32G系列,还有一个大约4K的上拉电阻,默认是关闭的。

ax6808 发表于 2023-1-2 14:19:29

小李非刀 发表于 2022-12-21 10:46
STC8系列、STC32G系列,还有一个大约4K的上拉电阻,默认是关闭的。
(引用自22楼)

其实,最后:根本的救命稻草,原来是开中断前清0一下标志位就好!!!!!!如IE0=0, 就很好的解决了这个问题!!!
不过我不清0只调换2段代码也不会出问题倒过来还不理解;

小李非刀 发表于 2023-2-25 22:39:59

ax6808 发表于 2023-1-2 14:19
其实,最后:根本的救命稻草,原来是开中断前清0一下标志位就好!!!!!!如IE0=0, 就很好的解决了这个问题!!! ...
(引用自23楼)

记住一点,在程序中途(不是刚上电时)禁止某个中断,一会又允许,则再允许之前,先清除中断标志。
我项目程序中,即使是上电初始化,允许中断前,都会先清除中断(这个中断标志可以操作的话)。

常见问题是,比如外中断,中断响应是很快的,硬件在每个主频时钟周期都检测一次边沿。
外部中断是由硬件检测边沿出现来触发中断的,如果没有检测到边沿,是不会出现中断信号的。一旦检测到边沿出现,机会置位中断标志,而不管你是否允许中断。
定时器、串口收发、ADC转换等等外设都是类似的,定时器溢出、串口收发完成一个字节、ADC转换结束等等都会将对应的标志置1,而不管是否允许中断。

所以切记:允许中断前,先清中断标志,加3个NOP,允许中断。
页: [1]
查看完整版本: STC单片机开内部上拉,外部加上拉电阻应该没什么影响吧?