För enklare projekt är det inga problem att göra en sak åt gången och vänta på att den är färdig innan man gör nästa, men för lite mer avancerade projekt behöver man ibland göra flera saker samtidigt, s.k. multitasking. T.ex. vill man kanske läsa in data från en radiomottagare, driva runt en stegmotor, blinka med en lysdiod och visa statustext på en skärm samtidigt. Det finns flera sätt att åstadkomma detta, men den metod vi ska visa här är väldigt populär eftersom den är förhållandevis enkel att förstå och programmera och ger bra resultat. Metoden är faktiskt inspirerad av hur professionella industriella kontrollsystem arbetar och därmed välbeprövad. Grundidén bygger på att man ser till att alla uppgifter som Arduino-kortet ska utföra hålls väldigt små så att de går väldigt snabbt att utföra och att man aldrig någonsin aktivt väntar på något. Det innebär att man absolut inte får använda funktionen delay() i sin kod eftersom detta kommer helt att blockera alla andra uppgifter som annars skulle köras samtidigt. Istället så låter man processorn hela tiden jämföra timer-värden och utföra de olika uppgifterna när lagom mycket tid har förflutit.

Hur går det till?

Enkelt förklarat så har man en serie med if-satser som jämför timer-värden som man låter processorn kör igenom om och om igen så snabbt som möjligt. När ett timern överstiger ett inställt tröskelvärde så anropar man den funktion som är kopplad till det tröskelvärdet. Funktionen körs och hoppar sedan tillbaka till huvudprogrammet med if-satser. Tröskelvärdet ställs om till nästa tidpunkt man vill köra funktionen och sedan fortsätter huvudprogrammet att köra runt.

Kopplingen

I vårt exempel ska vi få tre lysdioder att blinka i olika takt. Detta kan kanske verka enkelt först, men vill vi att de ska blinka helt oberoende av varandra behöver vi använda multitasking av någon form. Börja med att bygg upp kopplingen i bilden nedan. Skriv sedan in koden längst ner på sidan i Arduinos utvecklingsmiljö och ladda upp den till Arduino-kortet.

Arduino-projekt 007 – Multitasking

Beskrivning av koden

I koden sätter vi upp tre separata funktioner, blinka_1()blinka_2() och blinka_3() som vi kommer att köra parallellt. Du kan självklart använda den här koden som grund till andra projekt och byta ut funktionerna mot dina egna eller lägga till fler. Vi sätter även upp ett antal variabler för att hålla reda på hur ofta varje funktion ska köra och för att hålla reda på i vilket tillstånd varje lysdiod befinner sig i (tänd eller släckt). Huvudprogrammet ligger i vanlig ordning i loop() och denna kod kommer att köras många tusen gånger i sekunden, så snabbt som det bara är möjligt. Loopen börjar med att vi läser ut aktuell tid med funktionen millis(). Denna funktion lämnar ifrån sig antalet millisekunder sedan Arduino-kortet fick ström, eller sedan senaste resetten. Sedan följer ett tre separata if-satser där vi jämför aktuell tid med de olika timer-värdena för blink-funktionerna. Allra första gången som koden körs kommer dessa att vara 0 och därmed kommer alla tre if-satserna att vara sanna och alla tre blink-funktionerna kommer att köras. När varje blink-funktion körts ställer vi om timer-värdena till att vara aktuell tid plus så många millisekunder som vi vill vänta innan vi kör funktionen igen. Nästa gång loopen körs igenom så kommer aktuell_tid att ha ökat lite, exakt hur mycket beror på hur lång tid det tog att köra igenom de tre funktionerna, men inte så mycket att aktuell_tid är större än någon av timer-variablerna. Därmed kommer alla if-satser att vara falska och inte köras. Detta upprepas nu om och om igen tills aktuell_tid har ökat så mycket att den är större än något av timer-värdena och den associerade funktionen körs och dess timer-värde ställs om på nytt. Detta kommer sedan upprepas i oändligheten. Större delen av tiden så kommer processorn inte att göra något annat än snurra runt i huvudloopen och jämföra värden, men lite då och då kommer den att köra en av blink-funktionerna och sedan hoppa tillbaka och fortsätta snurra runt. Det är viktigt att komma ihåg att även om den här metoden får det att verka som att processorn gör flera gånger samtidigt så kan den aldrig göra mer en en enda sak i taget. Det är bara att den är så väldigt snabb att det verkar som att saker sker parallellt. Det är detta som gör att det är så viktigt att alla funktionerna är snabba och att man aldrig använder delay() för då kommer processorn att bli uppbunden och kommer inte att kunna köra övriga funktioner.

Koden

 

Pin It on Pinterest

Share This