读到低电平后再读到高电平就计数减一,软真调试没问题,为什么硬件就出错呢?

2019-10-15 06:15发布

功能:
外部给PE4高低电平,读取PE4,读到低电平后再读到高电平就计数减一
代码:
u8 a=5;   //计数初始值为5

int main(void)
{
     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
     uart_init(115200);   
     delay_init();
     LED_Init();
     LCD_Init();
     LCD_ShowString(30,40,210,24,24,"rest:");
     LCD_ShowNum(0,80,a,24,24);   
     while(1)
        {
            if(a==0)        //当a=0时亮DS1提示,按下KEY1则灭灯
            {
                GPIO_ResetBits(GPIOE,GPIO_Pin_5);
                if(!GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3))
                {
                    GPIO_SetBits(GPIOE,GPIO_Pin_5);
                    break;
                }
            }
            else
            {
                if(!GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4))        //读取到低电平
                {
                    GPIO_ResetBits(GPIOB,GPIO_Pin_5);                  //亮灯DS0
                    if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4))    //读取到高电平
                    {
                        a=a-1;                                                      //计数减一
                        LCD_ShowNum(0,80,a,24,24);                       //LCD屏上显示此时的数值
                        GPIO_SetBits(GPIOB,GPIO_Pin_5);                 //灭灯DS0
                    }
                }
                else
                {
                    GPIO_SetBits(GPIOB,GPIO_Pin_5);
                }
            }
        }
}
问题:
烧到开发板上给PE4高低电平,LCD屏上有时候会减一,减一规律不定。
第一次:成功 LCD:4            第二次:成功 LCD:4               第三次:......
            成功 LCD:3                        失败 LCD:4
            失败 LCD:3                        成功 LCD:3
            成功 LCD:2                        成功 LCD:2
            失败 LCD:2                        失败 LCD:2
            成功 LCD:1                        成功 LCD:1
            成功 LCD:0                        成功 LCD:0

但是在软件仿真中还是准确计数的。

求助。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
正正杨
1楼-- · 2019-10-15 08:31
在我问了这个问题的第三天,我的领导给了我一个方法,在循环里每一句话加上较大的延时,然后发现可以结果正常了,接着就把那些延时一步一步的减少直到发现具体是哪需要延时以及延时多少。
原因不是很清楚,大概理解为软件和硬件上的差时。
东北小辉辉
2楼-- · 2019-10-15 14:12
 精彩回答 2  元偷偷看……
正正杨
3楼-- · 2019-10-15 14:43
东北小辉辉 发表于 2016-12-29 16:37
你外部给PE4的电平是怎么来的,是传感器给的还是自己用手模拟的?
if(!GPIO_ReadInputDataBit(GPIOE,GPIO_ ...

外部接的是光电开关。检测到有挡光后会持续低电平,无挡光是高电平。
我是要获取到有下降沿然后又有上升沿就计数减一。
本来打算用pwm但是不要知道低电平持续时间就放弃了。
break是因为计数到0后要求断另一个设备的电,我还不会就暂时先这样模拟了。
abdfgh
4楼-- · 2019-10-15 20:18
正正杨 发表于 2016-12-29 17:16
外部接的是光电开关。检测到有挡光后会持续低电平,无挡光是高电平。
我是要获取到有下降沿然后又有上升 ...

小建议,参考按键消抖的形式,按键松开才算数,尽量把这种函数放在定时器当中做,不要放在主函数,判断类的函数最好不要一直占着CPU,中断中判断成功了置位一个标志给主程序知道就行了
东北小辉辉
5楼-- · 2019-10-15 21:58
本帖最后由 东北小辉辉 于 2016-12-29 17:48 编辑
正正杨 发表于 2016-12-29 17:16
外部接的是光电开关。检测到有挡光后会持续低电平,无挡光是高电平。
我是要获取到有下降沿然后又有上升 ...

低电平时间不知道的话,能否考虑用中断来做呢?中断资源够用吗?
我刚才的理解可能有点问题,尝试使用先下降沿,再上升沿这种中断的方式来尝试一下吧。
其实我感觉直接配置成下降沿中断也行,看看其他人有什么好办法。
正正杨
6楼-- · 2019-10-16 02:42
abdfgh 发表于 2016-12-29 17:37
小建议,参考按键消抖的形式,按键松开才算数,尽量把这种函数放在定时器当中做,不要放在主函数,判断类的函 ...

有这么写,只是为了方便问问题就用了原始写法。
谢谢建议。

一周热门 更多>