4.4.3 Programmeren van een timer

Veel microcontrollers werken op basis van polling. Dat betekent dat de microcontroller om de zo veel tijd meet welke waarden de aangesloten sensoren aangeven.
Voor meer achtergrondinformatie hierover, zie: https://www.microbit.co.uk/device/reactive.
Belangrijk daarbij is dat het programma dat je maakt de boel niet onnodig ophoudt. Daarom is het belangrijk om geen pauzes op te nemen in je programma. Bij een pauze doet het systeem niets en kan dus ook niet reageren op input vanuit de omgeving. Stel je een een zelfrijdende auto die te laat reageert op de bewegingssensor aan de voorkant van de auto…
De volgende opdrachten laten zien hoe je met behulp van een timer kunt voorkomen dat je pauzes moet inbouwen. Een timer is een soort kookwekker: je start een timer met een bepaalde duur; als de timer afloopt, voer je een uitgestelde actie uit. Een timer kan ook periodiek zijn, om met een vaste regelmaat een actie uit te voeren.
Een timer heeft de volgende onderdelen:

  • timerStart – een variabele met het begintijdstip van de timer
  • timerPeriode – een variabele met de periode van de timer, deze variabele geeft aan na hoeveel tijd de timer moet aflopen.
  • controle of de timer is verlopen:
    • huidigeTijd – timerStart >= timerPeriode
  • herstarten van de timer kan met:
    • timerStart = huidigeTijd

Een voorbeeld: het onderstaande toestandsdiagram werken we in pseudo-code uit:

Kijk of je de onderstaande pseudocode kunt relateren aan het toestandsdiagram en de informatie over de timer hierboven.


toestand wordt 1

timerPeriode wordt 5000 // dit is het aantal milliseconden

REPEAT:

    IF (toestand is gelijk aan 1 AND signaal is HIGH)

        zet lamp aan

        timerStart = huidigeTijd

        toestand wordt 2

    IF (toestand is gelijk aan 2 AND signaal is HIGH)

        timerStart = huidigeTijd

    IF (toestand is gelijk aan 2 AND (huidigeTijd - timerStart >= timerPeriode) )

        zet lamp uit

        toestand wordt 1