2013-06-26 56 views
1

我有一個程序有許多不同的長時間運行的部分(一次可以15分鐘),它使用「IF」語句來決定要執行的部分。按下按鈕跳轉到草圖的開頭

我的問題是,我希望能夠按下一個按鈕,並立即移動到另一個部分,而無需等待當前部分完成。

我以爲我可以使用和外部中斷,但我看到中斷只是導致程序停止執行中斷代碼,並繼續從中斷被調用之前的相同位置運行。

然後我認爲我可以使用「goto」語句,但這不起作用,因爲編譯器會抱怨你的標籤是否在使用「goto」語句的函數之外。

我已經在下面發佈了我的代碼我基本上希望能夠按下按鈕並讓代碼移動到下一個「IF」語句,而不管按下按鈕時的操作如何。

延遲只是他們模擬程序會做什麼。該程序實際上是針對具有多種不同模式的機器人。 在模式1中進行導航。 在模式2中,它可以由控制器控制。 在模式3下,它將一直坐到PIR傳感器看到一些東西然後開始漫遊。

所以你看到機器人可以在任何時間做任何事情的任何狀態。我想推動一個按鈕,讓它停止並改變模式。

實施例代碼

volatile int state = LOW; 
int mode = 0; 

void setup() 
{ 
    Serial.begin(9600); 
    attachInterrupt(0, blink, RISING); 
} 

void loop() 
{ 
    Serial.println(); 
    Serial.print("##########################"); 
    Serial.println(); 
    Serial.print("Start it again"); 
    Serial.println(); 
    Serial.print("##########################"); 

if(mode==0) 
    {Serial.println(); 
    Serial.print("0"); 
    Serial.println(); 
    delay(30000);} 

if(mode==1) 
    {Serial.println(); 
    Serial.print("1"); 
    Serial.println(); 
    delay(30000);} 

if(mode==2) 
    {Serial.println(); 
    Serial.print("2"); 
    Serial.println(); 
    delay(30000);} 

if(mode==3) 
    {Serial.println(); 
    Serial.print("3"); 
    Serial.println(); 
    delay(30000);} 

if(mode==4) 
    {Serial.println(); 
    Serial.print("4"); 
    Serial.println(); 
    delay(30000);} 

} 

void blink() 
{ delay(800); // This is just a delay to allow for the button press 
    if(mode >= 4) 
    {mode = 0;} 
    else{mode = ++mode ;} 
} 

回答

0

用新的功能,其執行以下操作30次更換的delay(3000);所有出現:如果按鈕被按下時,返回,否則,延遲100

+0

延遲只是他們模擬程序會做什麼。該程序實際上是針對具有多種不同模式的機器人。 在模式1中進行導航。 在模式2中,它可以由控制器控制。 在模式3下,它將一直坐到PIR傳感器看到一些東西然後開始漫遊。 所以你看到機器人可以在任何時間做任何事情的任何狀態。我想推動一個按鈕,讓它停止並改變模式。 – justinf

+0

同樣的事情 - 適用於每種模式的功能,檢查按鈕是否被按下,如果是,則返回。如果存在需要很長時間的子功能,則同樣的情況適用,只要按下按鈕就可以使它們返回。 –

1

您應該構建代碼,以便子例程不需要很長時間。

while(1){ 
    switch(mode){ 
     case 0: //one cycle of case 0 
     break; 
     case 1: //one cycle of case 1 
     break; 
    } 
} 

然後,在你的中斷服務程序中,你可以設置模式。