打印

新手小白,问一下按键控制灯的问题

[复制链接]
4958|36
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
曾小白|  楼主 | 2024-9-27 08:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我写了一段按键程序控制一颗灯,芯片IO口已经设置弱上拉,VCC输出5V,我用仿真器调试的时候都是正常。但是烧录芯片后焊接到器具上,出现了一上电灯就被点亮的问题,控制依旧能控制,但是上电就有概率自动被点亮,且点亮的次数更多。请问有可能是什么原因出现的这个BUG?

使用特权

评论回复
评论
曾小白 2024-9-27 18:22 回复TA
@xch :没有,只在芯片两端接了一个104电容,目前听从建议,用了一颗100uf电解电容并在芯片两端,故障在300多次时出现。后续我又把104换成了106,故障出现的概率再次降低,在100-300次左右可能出现一次。现在能否确认是存在干扰导致LED上电自己点亮??? 
xch 2024-9-27 17:45 回复TA
是不是按键两端并联了个电容? 

相关帖子

沙发
曾小白|  楼主 | 2024-9-27 08:58 | 只看该作者

新手小白,问一下按键控制灯的问题

后续发现用镊子触碰一下控制灯的芯片引脚就能实现灯的亮灭,引脚电压为3.4伏左右

使用特权

评论回复
板凳
LcwSwust| | 2024-9-27 09:28 | 只看该作者
上代码

使用特权

评论回复
地板
曾小白|  楼主 | 2024-9-27 11:06 | 只看该作者

#include <sc.h>//芯片头文件,会根据工程选项自动寻找对应型号头文件

#define uint8_t  unsigned char
#define uint16_t unsigned int
#define uint32_t unsigned long int

#defineLED1RA0//白
#define LED2RA2//白
#define LED3RB4//橙
#define LED4RB0    //橙

#define led     RA1

#define KEY      RB6
#define KEY2  RB7

//#define PTC_EN1  RB5

#define PTC_EN  RB5

#define     FST       RA3

volatile  bit  Start_flat;
volatile  bit  biaozhi1;
volatile  bit  PTC_Level_flat;
volatile  bit  PTC_GPIO_flat;
volatile  uint8_t  KEYMode_flat;
//volatile  uint8_t   KEYMode=0;
volatile  uint8_t   Long_PressKEY=0;
volatile  uint8_t   Short_PressKEY=0;
volatile  uint16_t  tt=0;
volatile  uint16_t  aa=0;
volatile  uint16_t  Timer=0;
volatile  uint8_t   count=0;
volatile  uint8_t   Ptc_DingShi_flat=0;
volatile  uint8_t   led_flat=0;
volatile  uint16_t   count1=0;
volatile  uint16_t   count2=0;
volatile  uint16_t   count3=0;
volatile  uint16_t   count4=0;

#define  FinshDingShi_8H              959  //定时8小时
#define  FinshDingShi_12H            1439  //定时12小时
#define  DLU_FinshDingShi            2879  //定时24小时

#define  PWM_COUNT_MAX             65530
#define  PWM_COUNT                 20000


void Delay(uint16_t x)
{
   uint8_t i,j;
   for(i=x;i>0;i--)
      for(j=9;j>0;j--);
}

void   KEY_Ptc_DingShi_Scan(void)
{
   if(KEY)
   {
if(count1>200)
      {
Ptc_DingShi_flat++;
            if(Ptc_DingShi_flat>2)Ptc_DingShi_flat=0;
            aa=0;Timer=0;
         count1=0;
      }
      biaozhi1=0;count1=0;   
   }
   else if(biaozhi1==0)
   {
      if(KEY==0)
      {
         count1++;
         if(count1==20000)
         {
KEYMode_flat=1;
if(Ptc_DingShi_flat>0)
{
KEYMode_flat=1;
Long_PressKEY++;
if(Long_PressKEY>1)
{
Long_PressKEY=0;//Ptc_DingShi_flat=0;
}
}
else if(Ptc_DingShi_flat==0)
{
Ptc_DingShi_flat=1;Long_PressKEY=1;
KEYMode_flat++;
if(KEYMode_flat>1)
{
KEYMode_flat=0;
}
}
//Ptc_DingShi_flat=0;
   count1=0;biaozhi1=1;
         }
      }
   }
if(KEY2==0)
{
//Delay(200);
while(KEY2==0);
//Delay(200);
led=~led;
}
}
void main(void)
{
asm("nop");
asm("clrwdt");

OPTION_REG =0X00;//预分频给TMR0  
OSCCON = 0x50;//内部振荡器16M   0x27

WPUA = 0B00001000;
WPDA = 0B00000000;            

WPUB = 0B11000000;
WPDB = 0B00000000;              

ODCONB = 0B00000000;//配置开漏输出情况
IOCB = 0B00000000;

TRISA = 0x08;
TRISB = 0xC0;

TMR0 = 6;//设定Timer初始值,计时时间为(256-6)*4*2/16M=125uS
T0IF = 0;
T0IE = 1;//使能Timer0溢出中断

GIE = 1;//开启总中断
if(!FST)
{
Delay(1);
if(!FST)
{
if(Start_flat==1)
{
aa++;
if(aa>=1500)
{
aa=0;
Timer++;
}  
}
count++;
if(count>2)
{
count=0;
}
while(!FST);
}
}
}
}
void interrupt Timer0_Isr(void)
{
if(T0IF)
{
TMR0 += 6;
T0IF = 0;

//PORTB ^= 0XFF;
}
}
大部分代码已上传,控制部分只上传了点亮led,不知道跟哪里BUG,导致器具一上电就会自动开led

使用特权

评论回复
评论
xch 2024-9-27 16:52 回复TA
没看见初始化LED 驱动端口 RA 的代码。 
5
曾小白|  楼主 | 2024-9-27 11:07 | 只看该作者
曾小白 发表于 2024-9-27 11:06
#include //芯片头文件,会根据工程选项自动寻找对应型号头文件

#define uint8_t  unsigned char

主要就是KEY2  RB7这个,引脚单片机内部已经设置弱上拉

使用特权

评论回复
6
LcwSwust| | 2024-9-27 11:47 | 只看该作者
曾小白 发表于 2024-9-27 11:06
#include //芯片头文件,会根据工程选项自动寻找对应型号头文件

#define uint8_t  unsigned char

问题:
1.main里没见到while(1);
2.KEY_Ptc_DingShi_Scan不知在哪里调用;

建议:
1.即然上电容易出问题,那就在程序开始之处加延时,比如1秒,之后再去检测按键;
2.输入脚易受干扰,可以程序中判断KEY2低电平持续100ms才认为是低电平,不要判断一次低电平就执行取反;
也可从硬件上解决,比如加个0.1uf的电容。

使用特权

评论回复
7
chenczyaa| | 2024-9-27 14:47 | 只看该作者
没看代码,初步了解,是不是你一开始没有设置IO输出状态?如果亮灯是高,那IO要设成低,不是则反过来。

使用特权

评论回复
8
曾小白|  楼主 | 2024-9-27 16:00 | 只看该作者
LcwSwust 发表于 2024-9-27 11:47
问题:
1.main里没见到while(1);
2.KEY_Ptc_DingShi_Scan不知在哪里调用;

非常感谢,程序上请教了原代码工程师,让他帮重新写了一段控制灯的代码。目前问题仍然存在,只不过上电后点亮的概率变低了很多,我试了三十多次之后自己亮起来了。问一下大佬,还有可能存在什么问题吗?

使用特权

评论回复
9
曾小白|  楼主 | 2024-9-27 16:03 | 只看该作者
chenczyaa 发表于 2024-9-27 14:47
没看代码,初步了解,是不是你一开始没有设置IO输出状态?如果亮灯是高,那IO要设成低,不是则反过来。 ...

我设置了IO输出状态,开漏输出,IO口也设置了弱上拉,甚至我试了硬件上接了一颗上拉电阻,仍然存在问题。我的亮灯是低电平,但是亮灯时IO口电压为3.19V,正常应该仍然是5V,目前还没有搞明白哪里出了问题

使用特权

评论回复
10
曾小白|  楼主 | 2024-9-27 16:15 | 只看该作者
曾小白 发表于 2024-9-27 16:03
我设置了IO输出状态,开漏输出,IO口也设置了弱上拉,甚至我试了硬件上接了一颗上拉电阻,仍然存在问题。 ...

这里说错了,IO口设置了输入,有弱上拉

使用特权

评论回复
11
LcwSwust| | 2024-9-27 16:40 | 只看该作者
曾小白 发表于 2024-9-27 16:00
非常感谢,程序上请教了原代码工程师,让他帮重新写了一段控制灯的代码。目前问题仍然存在,只不过上电后 ...

可能有BUG,比如程序中让KEY2输出了低电平。
建议用示波器监测KEY2脚。

使用特权

评论回复
12
AProgrammer| | 2024-9-27 16:47 | 只看该作者
一个麻烦的办法是2分法注释掉代码,排查出哪行出的问题

使用特权

评论回复
13
曾小白|  楼主 | 2024-9-27 17:08 | 只看该作者
AProgrammer 发表于 2024-9-27 16:47
一个麻烦的办法是2分法注释掉代码,排查出哪行出的问题

关键是仿真器上使用是正常的,我如果注释代码只能是仿真器来验证,不然每注释一次烧录验证的话芯片消耗太大,板子也收不了一直焊接。我尝试用直流直接驱动芯片,现象正常

使用特权

评论回复
14
曾小白|  楼主 | 2024-9-27 18:23 | 只看该作者
LcwSwust 发表于 2024-9-27 16:40
可能有BUG,比如程序中让KEY2输出了低电平。
建议用示波器监测KEY2脚。

目前听从建议,用了一颗100uf电解电容并在芯片两端,故障在300多次时出现。后续我又把104换成了106,故障出现的概率再次降低,在100-300次左右可能出现一次。现在能否确认是存在干扰导致LED上电自己点亮?

使用特权

评论回复
15
LcwSwust| | 2024-9-27 18:30 | 只看该作者
曾小白 发表于 2024-9-27 18:23
目前听从建议,用了一颗100uf电解电容并在芯片两端,故障在300多次时出现。后续我又把104换成了106,故障 ...

一般画PCB时都要在靠近芯片的电源加滤波电容,防止电源受干扰导致芯片工作不正常。
https://zhuanlan.zhihu.com/p/687138203

使用特权

评论回复
16
曾小白|  楼主 | 2024-9-27 18:37 | 只看该作者
LcwSwust 发表于 2024-9-27 18:30
一般画PCB时都要在靠近芯片的电源加滤波电容,防止电源受干扰导致芯片工作不正常。
https://zhuanlan.zhi ...

是的,我加了104。就是说目前我把104换成106之后现象又有改善,目前这样的情况是否能确认是干扰的问题?

使用特权

评论回复
17
曾小白|  楼主 | 2024-9-27 18:37 | 只看该作者
LcwSwust 发表于 2024-9-27 18:30
一般画PCB时都要在靠近芯片的电源加滤波电容,防止电源受干扰导致芯片工作不正常。
https://zhuanlan.zhi ...

我画板时,靠近芯片的地方加了104

使用特权

评论回复
18
LcwSwust| | 2024-9-28 08:29 | 只看该作者
曾小白 发表于 2024-9-27 18:37
是的,我加了104。就是说目前我把104换成106之后现象又有改善,目前这样的情况是否能确认是干扰的问题?
...

是的,很大可能是干扰,考虑加滤波、加屏蔽、加隔离等。

使用特权

评论回复
19
xionghaoyun| | 2024-9-28 08:53 | 只看该作者
你用8050加个下拉电阻控制灯 单片机刚上电I/O是悬空状态(会输出电压)

使用特权

评论回复
20
曾小白|  楼主 | 2024-9-28 13:19 | 只看该作者
xionghaoyun 发表于 2024-9-28 08:53
你用8050加个下拉电阻控制灯 单片机刚上电I/O是悬空状态(会输出电压)

不加你说的这些,上电后RB7这个口是5.04V,高电平,按下后,灯被打开,电压是3.19V,空载状态下是5.04V

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

20

帖子

0

粉丝