multitasking

De delay functie gebruiken is uit den boze want je arduino kan tijdens deze instructie niets anders doen…

Bij deze een transparante manier om verschillende delen van uw programma met verschillende frequenties te doorlopen.

Uiteraard geen delay functies gebruiken in de subroutines en ervoor zorgen dat de doorlooptijd van je subprogramma’s korter is dan zijn oproepintervaltijd.

Principe van programmeren in bijlage

multitasking_2016_07_29.ino (1.21 KB)

Hoi luc_de_smedt.

Als dit bedoeld is als tutorial, dan valt het me een beetje tegen.
Er zit wel commentaar bij, maar erg duidelijk word het niet wat er precies gebeurt, wat dat betreft moet ik bijna aan een site denken waar ik de naam niet van uit wil spreken.
Daar word je verteld hoe je een doel zou moeten behalen, maar niet hoe en waarom dat werkt.
Daardoor is het voor mensen die hier naar op zoek zijn maar er dan net iets anders mee willen doen, in grote problemen komen.

[edit]
Helemaal multitasking is dit niet, maar dat is ook niet mogelijk met deze controllers.
Je kunt het wel een benadering van multitasking noemen.
[/edit]

Je gebruikt hier commando's en functies die niet uit de Arduino documentatie komt, maar wat wel een deel is van C++ en van de registers in de (meeste van) door Arduinos gebruikte processorfamilie.
Er staat niet bij vermeld voor welke varianten dit niet geschikt is, er zijn Arduinos [edit, dit stukje is schijnbaar weggevallen]waar dit niet voor zal werken[/edit].

Als je dit helemaal zelf hebt uitgezocht dan chapeau.

Als je het ergens anders vandaan hebt dan mag je dat ook vermelden, is wel zo eerlijk in dat geval.

Beste MAS3

Voor een deel kan ik je gelijk geven. Langs de andere kant zijn er gebruikers die op zoek zijn naar oplossingen voor een probleem waar ze niet direct een oplossing voor hebben. Zij bekommeren zich niet over de onderliggende werking van de oplossing.

In dit geval is de oplossing voorgesteld voor een Arduino MEGA. Voor andere Arduino's zul je de datasheet moeten consulteren wat betreft de timer registers.

Waarom ik dit heb gepost is vrij eenvoudig, In de wereld van de PLC's is het gebruikelijk om cyclisch gestuurde delen van een programma uit te voeren. De gebruiker van deze PLC stelt zich niet de vraag hoe de firmware van de PLC dit realiseert.

Enig nadeel van dit kleine voorbeeld : als je een subroutine X gestart hebt die bv. 100ms in beslag neemt dan zal een andere subroutine Y die je om de 10ms wilt oproepen niet uitgevoerd worden zolang subroutine X niet is uitgevoerd.

Wil je dit toch dan dien je dit met de andere nog beschikbare interrupt timers te realiseren of dien je dit te verwerken in de interrupt die je al benut.

Het is niet mijn bedoeling om het C++ deel van dit voorbeeld voor alle Arduino,s uit te spitten. Ik zal het commentaar van de bijlage wat verder uitwerken.

Als we het toch complex maken kun je net zo goed naar freeRtos voor Arduino gaan. En het werkt ook nog :slight_smile:

dankjewel luc, wat meer commentaar vooral als je met registers aan de gang gaat, want dat is voor de meesten toch nog schrikken is wel handig.

Een PLC heeft nou eenmaal een andere structuur en doet juist alles achter elkaar, mooi he soms wel met dezelfde processor (een ATMega of zo)

Heb nog een en ander opgezocht. Sommige functies en libraries gebruiken timers. Oppassen dus voor dubbel gebruik van deze timers zonder het te weten.

Niet alle libraries melden met welke timers zij werken. Oppassen dus.

Onder meer van toepassing voor een Arduino MEGA bord

Timer1,3,4 en 5 zijn 16 bit timers

Timer0 en 2 zijn 8 bit timers
Timer0 wordt gebruikt voor de functies delay(), millis() and micros()
Timer2 voor de functie tone()

Timer5 voor Servo library on Arduino Mega

PWM (analoge) outputs in relatie met timers
Pins 4 and 13: controlled by timer0
Pins 11 and 12: controlled by timer1
Pins 9 and10: controlled by timer2
Pin 2, 3 and 5: controlled by timer 3
Pin 6, 7 and 8: controlled by timer 4
Pin 46, 45 and 44:: controlled by timer 5 (zo zie je maar, Servo commando is dus niet verenigbaar met een PWM commando naar pinnen 44,45 en 46 en omgekeerd)