极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 27787|回复: 12

如何能让用户随时停止循环或只是随时暂停还能继续循环?

[复制链接]
发表于 2018-4-14 10:58:15 | 显示全部楼层 |阅读模式
本帖最后由 cauwangchao 于 2018-4-23 08:01 编辑

如何能让用户随时停止循环或只是随时暂停还能继续循环?
         各位好!
        我想请教个关于Arduino中程序中断的问题;我的程序在loop中有while(1)大循环,if检测总开关S1是否按下,否则初始化;总开S1打开后,输送带运转,if 检测触发开关T1,T1触发后flag置1,开始for循环;for循环中对6个继电器以一定时间间隔顺序操作,时间间隔用delay()延时函数,第六个继电器执行后相同的间隔时间继续开始for循环回到第一个继电器。
        停止复位好实现,参数标志位初始化,目前就是这样的。        
        现在我想加一个pause暂停功能(随时暂停还能继续循环)的中断,就是外部pause按钮按下后触发中断:(输送带停止,比如第4个继电器动作结束,进入延时函数了,延时函数要暂停,第5和6继电器也不动作),按钮解除中断结束,返回到中断点继续执行(while中的for)循环体(输送带运转,延时函数继续延时完剩余时间,该第5个继电器动作,就是到断点继续执行循环而不是重新开始)。随时暂停随时(继续)循环。我也看了arduino的中断类的资料,不需要再解释基本概念和原理,可我还是不知道怎么写这个中断。想请教一下。谢谢。
回复

使用道具 举报

发表于 2018-4-14 16:40:15 | 显示全部楼层
可否...畫個流程圖或方塊圖來看看?
你的敘述我基本上完全看不明白 ^^"
回复 支持 反对

使用道具 举报

发表于 2018-4-15 10:25:54 | 显示全部楼层
用中斷,然後讓他陷入while迴圈,再用中斷去讀取按鍵狀態,判斷是否需要跳出while迴圈
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-16 15:08:54 | 显示全部楼层
shouzama 发表于 2018-4-14 16:40
可否...畫個流程圖或方塊圖來看看?
你的敘述我基本上完全看不明白 ^^"

现在有了。
就控制6个继电器循环动作,然后随时暂停,随时继续循环,完全看不明白???
回复 支持 反对

使用道具 举报

发表于 2018-4-17 00:42:12 | 显示全部楼层
cauwangchao 发表于 2018-4-16 15:08
现在有了。
就控制6个继电器循环动作,然后随时暂停,随时继续循环,完全看不明白???

您好:我的意思是,以程式設計邏輯來看,用流程圖/方塊圖
可以很清楚您想如何控制(要達到相同控制的程式細節各人
發揮不盡相同),您寫了:
"我的程序在loop中有while(1)大循環,if檢測總開關...
if 檢測觸發開關...flag置1,開始for循環;for循環中...
時間間隔用delay()...相同的間隔時間繼續開始for循環..."
這一堆敘述反而令我看不懂您想表達的真正問題是什麼

簡單來講,您的產線依照控制邏輯的順序、循環在工作,
這沒有問題,但您想在中間加上一個可以隨時 PAUSE 的
開關,將產線全部暫停,待解除 PAUSE 開關後回到原先的
控制邏輯繼續動作,是這樣沒錯吧?

那麼問題AUSE 觸發後,產線是立即暫停所有動作,
還是將階段性的動作做完再暫停?

如果是立即停止所有動作(包含馬達、油/氣壓缸...),
恢復後要接續原來咦
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-19 10:41:28 | 显示全部楼层
shouzama 发表于 2018-4-17 00:42
您好:我的意思是,以程式設計邏輯來看,用流程圖/方塊圖
可以很清楚您想如何控制(要達到相同控制的程式細 ...

因为pause是随机触发的,不知道会在什么时候触发,所以将阶段性的动作做完再暂停好一点,比如在第3个继电器动作的那几十毫秒内,暂停触发,如果是立即暂停,继电器动作还没做完,这个第3个继电器执行不正常。可以把如果在第3个继电器动作的那几十毫秒内,暂停触发,可以把第3个继电器动作完整执行后,暂停所有的(包括输送带的电机和剩余未循环的继电器等等),等到暂停解除,再恢复输送带电机运转和接下来的第4个继电器动作。这样的逻辑。谢谢。
回复 支持 反对

使用道具 举报

发表于 2018-4-19 12:40:59 | 显示全部楼层
本帖最后由 shouzama 于 2018-4-19 12:45 编辑
cauwangchao 發表於 2018-4-19 10:41
因為pause是隨機觸發的,不知道會在什麼時候觸發,所以將階段性的動作做完再暫停好一點,比如在第3個繼電 ...

嗯,可能上次打了系統無法識別的字元,所以文章被腰斬了(不完整)

的確,在階段性工作完成後再暫停,對於恢復工作會是比較好的方式,
那就簡單了,您接一個按壓開關(不必自鎖)到硬體中斷輸入,當開關按下
時讓中斷處理函式去設立或清除一個旗標(ON→OFF,OFF→ON 轉態),
然後主控制程式在每個階段性工作完成後進行旗標判定,如果旗標 ON
(表示有暫停要求),就一直循環判讀直到旗標 OFF 再繼續下一個工作

//1.自行設定中斷服務常式
void wake_ISR()
//設定中斷服務常式
{
//當中斷觸發時,您想進行什麼處理(例如設立/清除旗標)
//因為中斷服務常式不能使用 delay 等指令,接點彈跳消除要改用硬體方式進行
}

//2.在 setup() 宣告中斷服務常式
void setup()
{
//外部中斷服務函式 0 宣告(中斷 0 由 pin 2 腳位觸發)
  attachInterrupt( 0, wake_ISR, FALLING);  //服務常式為wake_ISR,接腳信號下降時觸發(共有 FALLING、RISING、CHANGE、LOW 四種)
}

大致上是這樣囉


回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-20 08:10:38 | 显示全部楼层
shouzama 发表于 2018-4-19 12:40
嗯,可能上次打了系統無法識別的字元,所以文章被腰斬了(不完整)

的確,在階段性工作完成後再暫停,對 ...

您好,我总共写了四个中断,
//注册电源中断服务函数。电源引脚是自锁的。
attachInterrupt( 0 , onPowerOff, RISING );
attachInterrupt( 0 , onPowerOn, FALLING);
//注册暂停中断服务函数。暂停引脚是[自锁]的。
attachInterrupt( 1 , onPause, FALLING );
attachInterrupt( 1 , onResume, RISING );
        可以在同一个中断引脚写两个中断么?两个中断用不同的触发方式触发。 但是接在同一个引脚上,这样可以么?使用中断的引脚需要设置该引脚的PINMode么?pinMode 设置为什么?非常感谢!
回复 支持 反对

使用道具 举报

发表于 2018-4-21 01:09:24 | 显示全部楼层
cauwangchao 发表于 2018-4-20 08:10
您好,我总共写了四个中断,
//注册电源中断服务函数。电源引脚是自锁的。
attachInterrupt( 0 , onPow ...
兩個中斷用不同的觸發方式觸發。 但是接在同一個引腳上,這樣可以麼?
理論上可行,不過我還沒試過 ^^"
用一個中斷(按下)來設旗標,另一個中斷(解除)來清除旗標,
邏輯上並不衝突,可以試試看

不過把電源接到中斷控制的用意我就不明白了,電源斷了
ARDUINO 不就 SHUTDOWN 了? 要怎麼去跑中斷常式呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-21 09:05:17 | 显示全部楼层
shouzama 发表于 2018-4-19 12:40
嗯,可能上次打了系統無法識別的字元,所以文章被腰斬了(不完整)

的確,在階段性工作完成後再暫停,對 ...

你好,还有,中断按键的消抖是在哪里写语句实现的?能不能麻烦帮忙给我一个中断按键的消抖语句?实验中我发现,中断的按钮按下去有时候执行的对,有时候执行的不对,谢谢了。
回复 支持 反对

使用道具 举报

发表于 2018-4-21 09:52:26 | 显示全部楼层
cauwangchao 发表于 2018-4-21 09:05
你好,还有,中断按键的消抖是在哪里写语句实现的?能不能麻烦帮忙给我一个中断按键的消抖语句?实验中我 ...


嗯,關於接點彈跳的問題先前已預料到:
//設定中斷服務常式
{
//當中斷觸發時,您想進行什麼處理(例如設立/清除旗標)
//因為中斷服務常式不能使用 delay 等指令,接點彈跳消除要改用硬體方式進行
}
一般會在收到接點信號後先延遲 20~50 毫秒再進行處理程序,
可以解決接點在開/閉瞬間的彈跳問題,但在中斷常式中不能使用
延遲指令、程式也不能太多(須儘快回到主程式工作),也因此,
接點彈跳的問題必須用硬體電路來改善,下圖是網路上找到的
範例,提供給您參考(有 PUSH LOW 跟 PUSH HIGH 二種):



回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-21 23:21:19 | 显示全部楼层
shouzama 发表于 2018-4-21 09:52
嗯,關於接點彈跳的問題先前已預料到:
一般會在收到接點信號後先延遲 20~50 毫秒再進行處理程序,
可以 ...

你好,您有邮箱地址么?关于arduino的中断使用,我有个问题想请教一下您。我将我的程序发给您您看一下问题出在哪里。谢谢,您可以看懂简体中文吧?我看到您的资料显示您在台湾。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-20 09:41 , Processed in 0.044026 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表