2016-11-18 107 views
0

我寫了使LED閃爍並將伺服器移動到幾個不同方向的代碼。這裏的基本結構:我怎樣才能同時運行兩個循環?

while(true){ 
    //led on 
    //wait 
    //led off 
    //wait 
    } 
    while(true){ 
    //servo to 45 
    //servo to 90 
    //servo to 270 
    } 

我希望兩者同時運行。上面的代碼只會打開LED,並且因爲它在循環中而無限制。伺服從不工作。我在這裏查看了其他問題,但我找不到任何相關的問題。

如何讓LED和伺服器同時工作?

+1

有一個循環,表現爲一個狀態機。它會跟蹤下一個LED事件何時發生,以及何時發生下一個伺服事件。 – paddy

+0

如何使用不同的線程? – active92

+1

@ active92這是一個arduino微控制器。該處理器上沒有真正的線程支持。你必須推出自己的。 – paddy

回答

0

一般來說,你不能使用兩個無限循環。那是因爲它是一個臨時程序,所以當第一個完成時它不能運行。所以如果第一個循環是無限的,第二個永遠不會運行。

做某種「多線程」的,在最簡單的方法是使用定時器和中斷。

在你的情況下,你想運行兩個不同的任務。閃爍的led和轉向舵機。當你使用wait()/ sleep()/ delay()時,uC只是簡單地停止(除了處理諸如interupts之類的其他事情)。所以你可以設置定時器,並在中斷閃爍指示下。或者在中斷時更好地設置一些標誌,並在你的主要檢查標誌是否改變。不只是處理眨眼。所以一般你會在你的主要某事像這樣:

volatile uint8_t nowBlink = 0 

ISR(TIMER1_OVF_vect) 
{ 
    // some timer handling and then: 
    nowBlink = 1 
} 

loop(){ 
if(nowBlink){ 
    toggleLed(); 
    nowBlink = 0; 
} 
setServo(123123); 

} 

設置intterupt到1秒,將閃爍你的領導與1赫茲的頻率,然後程序的其他部分將完成。

Here你有計時器解釋,並Here你有一些庫。剛剛閱讀,你應該是arduino的主人。

此致敬禮voodoo16。

0

不要使用像delay_ms(),wait()等函數嘗試中斷。

這樣使用struture:

int flag = 0; 
void func_delay_50ms() interrupt 
{ 
    // set initial condition 
    flag ++; 
} 

void main 
{ 
    while (1) 
    { 
     if (flag == 4) // per 200ms 
     { 
      led = -led; 
      flag = 0; 
     } 

     if (!(flag % 2)) // per 100ms 
     {  
      servo(); 
     } 
    } 
} 

注:)伺服(不應該阻止了很長一段時間。

有沒有真的conturrent線程,你應該創建一個錯覺去實現它。

(:з」∠)我的英文不好。對不起。

0

我寫了Arduino的支持,以便同時運行多個循環多線程操作系統。請注意伺服的範圍從0-180。你不能轉動270度。你可以在這裏找到來源和進一步的文檔https://github.com/DrBubble/ArduinoOS

這個示例代碼應該在ArduinoOS下運行時所需要的。

#include "KernelInitializer.h" 
#include "Servo.h" 
#include "Led.h" 

void setup() 
{ 
    KernelInitializer::InitializeKernel(mainThread); 
} 

void mainThread() 
{ 
    InitTask(secondThread); 
    while (true) 
    { 
     Led led(2); // replace 2 with the pin of your led 
     while (true) 
     { 
      led.TurnOn(); 
      sleep(1000); 
      led.TurnOff(); 
      sleep(1000); 
     } 
    } 
} 

void secondThread() 
{ 
    Servo servo(9); // replace 9 with the pin of your servo 
    while (true) 
    { 
     servo.SetValue(45); 
     sleep(1000); 
     servo.SetValue(90); 
     sleep(1000); 
     servo.SetValue(180); 
     sleep(1000); 
    } 
} 
相關問題