作者HiJimmy (嗨 吉米)
看板Electronics
标题[问题] Arduino 执行逻辑的问题
时间Thu Oct 14 00:40:49 2021
下面是我得主程式
if (key_status_down == 5) { //0.25秒
digitalWrite(EN_PIN, LOW );
digitalWrite(X_STEP_PIN, LOW);
pluse_counter = 0;
while (pluse_counter < 6400) {
if (timer > 0) {
digitalWrite(X_STEP_PIN, digitalRead(X_STEP_PIN) ^ 1);
pluse_counter++;
timer = 0;
delay(1); <=========想不透得这一行
}
}
digitalWrite(EN_PIN, HIGH );
digitalWrite(X_STEP_PIN, LOW);
用内建的timerone函式库
每50ms中断一次,中断负责扫描按键,更新timer值
让我想不透的,不加delay,程式完全不能跑
一开始这行是丢串序列,Serial.print() 有丢值就能正常
後来想说,都能跑了就把Serial.print()删掉
就变成步进马达抖一下,就不会动了
正常来说,if (timer > 0) 这个回圈内有归零timer
得等中断产生,才能在进入一次
但测起来的结果是一直进入,变成换相速度由delay控制
是编译器的问题还是我的写法有问题?
我在holtek跟stm32上面,都用了不少这种方式
时间差不重要的都是计时器负责算时间,流程由主程式控制
须要精准的才会在中断里面执行,没遇过这个问题
是被编译器优化掉了吗?IF函式整个都失效
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.165.4.186 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Electronics/M.1634143251.A.05B.html
1F:推 mmonkeyboyy: 你只是写值 没有读入 要最少1 clk才进去 10/14 01:44
写值没有读入是指?
是指timer=0; 没有执行完马上就跳下一行? 所以要延迟?
2F:推 god145145: timer的型态? 换个名称试试 10/14 07:59
好这个我再试试,不过得等明天了,我到是没想到会有保留字元的可能性
※ 编辑: HiJimmy (1.165.4.186 台湾), 10/14/2021 18:10:09
3F:推 mmonkeyboyy: 对啊 你有些动作在t=i你只是改了 reg的值 t=i+1时 10/14 22:23
4F:→ mmonkeyboyy: 这个reg的值才会被真正执行 (到不是跳下一行就是) 10/14 22:23
确定是编译器优化的问题,中断里面和主程式共用的变数
须加上volatile
这个案列就是
volatile int timer
※ 编辑: HiJimmy (1.165.28.132 台湾), 10/19/2021 18:18:51
5F:推 Schottky: 推真相大白 10/19 18:41
6F:推 mmonkeyboyy: 这算是workaround不算是解法 你可以把timer dely 10/19 21:03
7F:→ mmonkeyboyy: volatile等字丢去喂狗就会出来了 10/19 21:03
8F:→ mmonkeyboyy: 这个不只是arduino C/C++的库上就很多人问过这问题 10/19 21:04
9F:→ mmonkeyboyy: 解释下去很长 简单说 timer 是用了独立单元 你拿 10/19 21:04
10F:→ mmonkeyboyy: 来玩了它.... 如果用 volatile 你会强迫它变一般变 10/19 21:05
11F:→ mmonkeyboyy: 数 然後你看binary就多一块东西出来了XD 10/19 21:06
12F:→ mmonkeyboyy: 狗上有一篇在讲C++/C的库 就有很长的解释了 10/19 21:08