STC单片机开内部上拉,外部加上拉电阻应该没什么影响吧?
如题,有个产品,按键部分本来是外部上拉的,因工艺问题有部分上拉电阻虚焊。现在不想一块块板检查了,想直接把内部上拉也开起来,双重保证。按道理来说除了功耗高那么一点点外应该对电路没什么影响吧。 之前要不开内部上拉,要不就单外接上拉电阻。一直没试过这样用,不太确定。 没影响 内部的是弱上拉有些情况下 太弱的上拉达不到要求就再加个上拉电阻 没问题! {:sweat:}stc8/15 的io驱动ULN2803接继电器,有的时候行有的时候不行,全设置成推挽,就没有出现这种现象了。。。 wkman 发表于 2019-9-21 09:01
stc8/15 的io驱动ULN2803接继电器,有的时候行有的时候不行,全设置成推挽,就没有出现这种现象 ...
本来你作为输出就应该设为推挽呀。。。。。。我是按键输入
相当于两电阻并联,上拉电阻变小而已,没关系的。 没毛病,上拉为了保持默认高电平,外接+内接只不过把整体电阻变小了 7楼说的有道理 内部上拉对于按键来说已经够用了,可以不用外加 完全没关系,按键不按的话,是没有电流消耗的。谁没事一直按着按键。 没问题,就是多个上拉而已,只要电阻合适就OK。 没有问题的{:lol:} 我就碰到这个问题 真有不同效果,就是用内部上拉电阻每次开机总是会误触发中断0启动一次,外部上拉就不会,真暂时百思不得其解,研究中。 理论上当然是完全一样的。
我中断0就接了个按键到地,按一下累计1次,初始置0,结果用内置4.1KΩ就老是开机就+1,用外置5KΩ差不多阻值就不会。其他一切正常。 本帖最后由 jssd 于 2022-12-17 08:16 编辑
ax6808 发表于 2022-12-17 00:46
理论上当然是完全一样的。
我中断0就接了个按键到地,按一下累计1次,初始置0,结果用内置4.1KΩ就老是开机 ...
(引用自15楼)
我觉得理论上不一样,内部是靠程序打开才来的电阻,外部一上电就存在了。也就是说,中断发生在内部电阻设置之前,所以被检测到了一次。按这个理论,中断触发改成边沿触发,而且是下边沿触发应该就好了 如果开关是拉线过来的,一般加上拉电阻及对地加104电容 本帖最后由 ax6808 于 2022-12-17 21:41 编辑
jssd 发表于 2022-12-17 08:13
我觉得理论上不一样,内部是靠程序打开才来的电阻,外部一上电就存在了。也就是说,中断发生在内部电阻设 ...
(引用自16楼)
嗯!确实奇怪,我还在查具体原因.
初始化里,内部上拉电阻设置:已经很前面了,中断允许前已有足够延时...单下跳沿或双边沿都一样问题.
继续查,一查到底... 本帖最后由 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);
} ax6808 发表于 2022-12-18 00:30
终于:查到一个解决办法了,只是不知道具体原因,只知道最后3行不能放到 P_SW2 |= 0x80这行的前面!
不然:...
(引用自19楼)
好好学习 天天向上这里是新手聚集地 欢迎围观指导 https://www.stcaimcu.com/forum.php?mod=viewthread&tid=323 ax6808 发表于 2022-12-18 00:30
终于:查到一个解决办法了,只是不知道具体原因,只知道最后3行不能放到 P_SW2 |= 0x80这行的前面!
不然:...
(引用自19楼)
厉害?…… ackyee 发表于 2019-9-21 08:40
没影响 内部的是弱上拉有些情况下 太弱的上拉达不到要求就再加个上拉电阻 ...
(引用自2楼)
STC8系列、STC32G系列,还有一个大约4K的上拉电阻,默认是关闭的。 小李非刀 发表于 2022-12-21 10:46
STC8系列、STC32G系列,还有一个大约4K的上拉电阻,默认是关闭的。
(引用自22楼)
其实,最后:根本的救命稻草,原来是开中断前清0一下标志位就好!!!!!!如IE0=0, 就很好的解决了这个问题!!!
不过我不清0只调换2段代码也不会出问题倒过来还不理解; ax6808 发表于 2023-1-2 14:19
其实,最后:根本的救命稻草,原来是开中断前清0一下标志位就好!!!!!!如IE0=0, 就很好的解决了这个问题!!! ...
(引用自23楼)
记住一点,在程序中途(不是刚上电时)禁止某个中断,一会又允许,则再允许之前,先清除中断标志。
我项目程序中,即使是上电初始化,允许中断前,都会先清除中断(这个中断标志可以操作的话)。
常见问题是,比如外中断,中断响应是很快的,硬件在每个主频时钟周期都检测一次边沿。
外部中断是由硬件检测边沿出现来触发中断的,如果没有检测到边沿,是不会出现中断信号的。一旦检测到边沿出现,机会置位中断标志,而不管你是否允许中断。
定时器、串口收发、ADC转换等等外设都是类似的,定时器溢出、串口收发完成一个字节、ADC转换结束等等都会将对应的标志置1,而不管是否允许中断。
所以切记:允许中断前,先清中断标志,加3个NOP,允许中断。
页:
[1]