Go Down

Topic: multitasking (Read 69 times) previous topic - next topic

luc_de_smedt

Jul 29, 2016, 09:57 pm Last Edit: Jul 30, 2016, 07:48 am by luc_de_smedt
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

MAS3

#1
Jul 30, 2016, 01:02 am Last Edit: Jul 30, 2016, 12:18 pm by MAS3 Reason: Extra toelichting
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.

Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

luc_de_smedt

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.

nicoverduin

#3
Jul 30, 2016, 08:52 am Last Edit: Jul 30, 2016, 08:52 am by nicoverduin
Als we het toch complex maken kun je net zo goed naar freeRtos voor Arduino gaan. En het werkt ook nog :)
https://github.com/greiman/FreeRTOS-Arduino
Met vriendelijke groet / kindest regards
Nico Verduin
www.verelec.nl
Do not PM me for personal consultancy unless you are willing to pay for it.

shooter

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)

paul deelen
shooter@home.nl
making controls with codesys PLC and arduino

luc_de_smedt

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)

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy