阿甲 发表于 2023-2-6 22:10

dqp05 发表于 2023-2-6 21:57
查询可以放在主程序里,只要 相关寄存器专用,就不需要保存变量;
举个例子,需要判断3个事情, A B C;



这个是有执行中插入的,比如按键选择了显示前摄像头,但是用途左转向,这时候需要立刻切换到左摄像头,转向完成电平消失后要能够自动返回原来的前摄像头,轮询没办法返回,所以才学习中断

L555T_007 发表于 2023-2-6 22:18

主循环做状态机逻辑处理,按键去抖,只开一个定时器中断。

这种慢速系统,不需要中断,更不需要那么多中断。

dqp05 发表于 2023-2-6 22:26

本帖最后由 dqp05 于 2023-2-6 22:28 编辑

阿甲 发表于 2023-2-6 22:10
这个是有执行中插入的,比如按键选择了显示前摄像头,但是用途左转向,这时候需要立刻切换到左摄像头,转 ...
楼上说的对;

这几件事情,放在主循环里,不断循环查询相关事件的标志位,就可以搞定了;

你可以画 一个循环的 时序图,把要处理的事情,合理顺序安排时间处理就行了;

像你这种电路,很少需要同时处理的事情,只要没有同时处理的事情,就可以不用中断,按时间和逻辑顺序处理就行了

举个例子:按键 10ms判断一次,你可以定时10ms(注意:可以根据需要,改为20ms或者30ms....等等)作为一个主循环

阿甲 发表于 2023-2-6 22:50

L555T_007 发表于 2023-2-6 22:18
主循环做状态机逻辑处理,按键去抖,只开一个定时器中断。

这种慢速系统,不需要中断,更不需要那么多中断 ...

这个定时器中断是用来做什么的?然后如果做轮询的话,几个事件后放在一个while里面吗?

阿甲 发表于 2023-2-6 22:55

dqp05 发表于 2023-2-6 22:26
楼上说的对;

这几件事情,放在主循环里,不断循环查询相关事件的标志位,就可以搞定了;


有点点明白几个事件根据重要程度顺序放在一个轮询了,但是原来我这个按键检测好像没定时间,这里的(10ms)或者(20ms)是什么意思?轮询周期还是不同的按键用不同检测周期?如何写呢?
真是新手,有点啰嗦,勿笑

dqp05 发表于 2023-2-6 23:05

本帖最后由 dqp05 于 2023-2-6 23:12 编辑

阿甲 发表于 2023-2-6 22:55
有点点明白几个事件根据重要程度顺序放在一个轮询了,但是原来我这个按键检测好像没定时间,这里的(10ms ...
按键会抖动,为了防止抖动误判,一般10ms判断一次按键,连续几次有按键,才判断按键有效,这个就是10ms的由来;

10ms可以用定时器,使用查询模式就行了,没必要用中断;

使用10ms或者整数倍周期,是从方便按键判断考虑的,况且,10ms可以执行非常多的代码,足够你主循环使用了;

建议你先在纸上写下 程序流程,纸上流程正确了,再用 程序 按照纸上流程写出来就行了,只要你能把纸上流程搞明白,软件就是翻译而已,思想就不会乱了;


建议: 可以在按键上增加RC滤波来防止抖动误判,这样软件可以一次判断有无按键,软件简单多了;   这样也就不用使用定时器了;
         判断周期也可以根据需要改变,但不能太长,因为按键一次持续时间有限制;

阿甲 发表于 2023-2-6 23:25

dqp05 发表于 2023-2-6 23:05
按键会抖动,为了防止抖动误判,一般10ms判断一次按键,连续几次有按键,才判断按键有效,这个就是10ms的 ...

谢谢您,大晚上还在解惑。明白这个按键检测了。
现在轮询还有个疑问:比如key这个按键是选择一个数组循环的,比如从0x01,0x03,0x03,0x04这样循环,按一次增加一个,选择好后平时是没有按下去的。
比如key按键转折到数组输出了0x03,这时候L按键按下,定义成为输出0x02,延时1秒后关闭输出0x02,还要返回0x03,但是这时候端口输出已经改变了,key这时候是没有按下的,执行L按键前也没有保存原来key按键数组输出的状态,如何实现呢?这个即使轮询到key按键也不是原来状态。
就是在这里一直搞不定才想到中断有个入栈功能才想用它

海盗杰克 发表于 2023-2-7 08:29

barla 发表于 2023-2-6 18:38
思路是这样的,中断服务程序里尽量简单,只做一个清中断标识位和flag设置的动作。主程序根据flag的值再进行 ...

你头像挺提神啊!

barla 发表于 2023-2-7 08:56

海盗杰克 发表于 2023-2-7 08:29
你头像挺提神啊!

大半夜要写代码,当然要提神拉{:5_625:}

barla 发表于 2023-2-7 08:59

是不是理解成main程序的流程是老早固化调试好了,使用没问题,所以主程序不用在修改了,只是最近中断这里有问题了?

dqp05 发表于 2023-2-7 10:26

阿甲 发表于 2023-2-6 23:25
谢谢您,大晚上还在解惑。明白这个按键检测了。
现在轮询还有个疑问:比如key这个按键是选择一个数组循环 ...


1、主轮循周期,是由完整过程周期决定的,比如你这里的1s或者更大;

2、内部还可以有多个小循环,比如按键检测,几ms周期;

3、多个按键状态,可以先保存,后续就可以慢慢判断;


阿甲 发表于 2023-2-7 10:38

barla 发表于 2023-2-7 08:59
是不是理解成main程序的流程是老早固化调试好了,使用没问题,所以主程序不用在修改了,只是最近中断这里有 ...

用了您这段代码,开始报错,后开去掉两个冒号编译通过,但是问题依旧是原来的样子。会不会真是中断延时引起的?但是这几个中断执行都有延时要求,有没有大家说的只把中断作为一个开关来打开主程序中一个功能的方法?





其实我要求简单,就是在一个按键(数组)有输出的情况下,有个优先的按键进来,输出是同一数组的某一个端口,然后这个优先按键延时一秒后又返回原来的数组输出。现在问题是在同一PD端口,优先按键执行时改变了原来的数组输出状态,没有办法返回原来装状态

barla 发表于 2023-2-7 10:55

是的,把“:”去掉。我没有进行环境编译,是个语法错。
你的要求是默认模式是A,进入PB4或者PB5中断,完成中断处理再返回A状态?
现在的情况是进入PB4或者PB5中断了,完成后无法回到A去?

阿甲 发表于 2023-2-7 11:06

barla 发表于 2023-2-7 10:55
是的,把“:”去掉。我没有进行环境编译,是个语法错。
你的要求是默认模式是A,进入PB4或者PB5中断,完成 ...

是的,初始化后可能按键选择了0xc0(也可能是没有按这时候数组输出是0x00);这时候如果转向就是PD4或者PD5触发,然后输出0x90或者0xa0(是跟主程序中key按键选择的同一端口组中的一个引脚),中断延时后,这时候就不能返回原来的状态。
所以疑问是不是没有保存原来的状态导致回不去还是没有退出中断

barla 发表于 2023-2-7 11:20

本帖最后由 barla 于 2023-2-7 11:23 编辑

主程序中的KEY(PD3)是做什么用的,是什么按键
还有就是你原先的老程序中的while(1)循环的代码你是修改了?

阿甲 发表于 2023-2-7 11:29

本帖最后由 阿甲 于 2023-2-7 11:30 编辑

barla 发表于 2023-2-7 11:20
主程序中的KEY(PD3)是做什么用的,是什么按键
这个是真正的按键,用芯片弱上拉为高电平,按下为低电平,已经有延时毛刺检测的,这个按键目前运行良好,PB4,PB5是转向灯12V大概一秒钟也脉冲,到时候用光耦隔离,也是5V,转向时有个下降沿然后1秒钟左右持续低电平,原来设置为下降沿和低电平触发,已经改成下降沿触发。PA3这个倒车信号实际中也是持续的低电平,也是光耦隔离,这个没有延时,必须只要有这个信号就必须输出倒车通道0x00,所以用低电平触发。实际中这3个按键都有可能重复触发(实际模式下有一直转向和倒车可能)。以上三个按键目前都用按键模拟

方便价格微信QQ单独交流不?怕为了我的低级问题占用论坛资源

barla 发表于 2023-2-7 11:45

如此说来,仅仅是PD3是用微动开关做的key,
其他三个中断源实际就是一个电平输入或者是1HZ的脉冲做的外部触发,
一直以为这4个中断都是微动做的{:5_627:}

阿甲 发表于 2023-2-7 12:17

barla 发表于 2023-2-7 11:45
如此说来,仅仅是PD3是用微动开关做的key,
其他三个中断源实际就是一个电平输入或者是1HZ的脉冲做的外部触 ...

是的,PD3是微动开关,PA3是持续的低电平触发,PB4,PB5是大约一秒的脉冲触发(这个高低都行,电路都可以处理)

barla 发表于 2023-2-7 13:56

本帖最后由 barla 于 2023-2-7 14:00 编辑

while(1)
      {
                OUT=a;      //初始a=0
                if(KEY==0)                //检查微动PD3
                {
                        delay(10);
                        if(KEY==0)
                        {
                              OUT=table[ i] ;
                              i++;
                              if(i>=5)
                              {i=0;}
                              while(!KEY); //如果有中断,OUT被中断函数修改
                              //
                        }
                }
                a=OUT;      //out为中断函数中的值,所以不能恢复到table的原值
      }

中断函数里在执行完相应功能后再把恢复原始值。用全局变量存储主函数的OUT值,中断函数执行的最后,通过全局变量恢复OUT
我有私信你

L555T_007 发表于 2023-2-7 23:44

其实功能要求就是

上电先各通道和关窗输出自检然后关闭

通道按键,每次按下,
按顺序切换右,左,前,录像,关,
作为后台输出状态。


左右转向低电平脉冲输入,则切换到左右输入,信号消失延时1秒返回后台输出状态

倒车低电平输入,则切换到倒车输入,最高优先级,信号消失后返回后台输出状态

关窗低电平触发单次4秒的关窗输出。



前后台状态机处理这个是简单合理,
就是你得搞清楚状态机切换,理解逻辑。


页: 1 [2] 3
查看完整版本: 请教各位老师,STM8中断执行后不能返回