De code is geschreven in assembler, voor een PIC van het type PIC16F876A en is hier te downloaden samen met de include file.
Voor het instellen van het uur via Visual Basic kan gebruik gemaakt worden van deze code.

Om onze werkwijze verstaanbaarder te maken, hebben we hieronder ook een flowchart voorzien:

Initialisaties

  1. poorten PIC in/uitgang
  2. interruptsettings
  3. initialisatie poorten en variabelen
  4. timer1 enablen

Interrupts

Visual Basic interrupt

Deze interrupt wordt aangesproken wanneer men via Visual Basic het uur wil instellen. De nodige variabelen worden overgebracht waardoor de wijzers op de juiste positie komen te staan.

RB0 interrupt

Aan de hand van een optische sensor wordt gedetecteerd wanneer de leds een toer hebben afgelegd. Op dat moment wordt er aan de RB0 pin (ingesteld als ingang) een signaal gegeven waardoor er een interrupt wordt gegenereerd. Deze interrupt houdt de tijd bij en zorgt voor het starten van het maken van het beeld.

Tijd nagaan

Door het enablen van Timer 1 wordt de tijd bijgehouden in het TMR1L/H register. Timer 1 verspringt elke 8 μs. Dit register zal bijhouden hoelang de laatste toer van de leds duurde. Telkens er een RBO-interrupt plaatsvindt, wordt deze tijd geplaatst in het toer_l/h register en toegevoegd aan het tijd_l/h register en gereset. Op die manier bevat Timer 1 een getal dat het aantal keer 8 μs in 1 toer van de leds weergeeft.

Het toer_l/h register zal de timing van de aansturing van de leds bepalen aan de hand van de snelheid van deze. Dit register bevat de omlooptijd van de laatste toer van de leds.

Het tijd_l/h register dient voor het bijhouden van de tijd. Dit register wordt gerealiseerd door elke toer het TMR1L/H register erbij op te tellen. Opdat dit register niet oneindig groot zou moeten zijn, wordt er elke 0.25s de subroutine ‘KwartSecTellen’ opgeroepen. Deze subroutine houdt het aantal kwartseconden die voorbijgegaan zijn bij en telt deze tijd van het tijd_l/h register af. Aangezien 0.25s bestaat uit 31250 keer 8 microseconden (of binair 01111010 00010010) trekken we deze waarde af van het tijdl/h register. Bovendien weten we dat wanneer de hoogste bit van het tijdl/h register is geset, we zeker 0.25s verder zijn.

Het aantal kwartseconden wordt bijgehouden in kwart_sec en door telkens op het gepaste ogenblik andere subroutines op te roepen worden  zo de seconden, minuten en uren bijgehouden.

LEDS op 120 posities aansturen of niet

Voor het realiseren van het beeld hebben we de cirkel die de leds beschrijven opgedeeld in 120 hoeken, die elk een nummer krijgen (hoek_nummer). Het programma bestaat uit een opeenvolging van het maken van deze hoeken. Het maken van 1 hoek begint met het wachten tot er een hoek is voorbijgegaan (een 120ste van de omlooptijd). Daarna begint het aansturen van de juiste leds voor het maken van de cijfers die zich op de klok bevinden. Vervolgens wordt getest of er op die positie een wijzer moet komen. Voor het maken van de wijzers wordt er gewerkt met de nummering van de hoeken (hoek_nummer). Aan de hand van het tijdl/h register (waar de tijd in wordt bijgehouden) weten we waar de wijzers zich zouden moeten bevinden. Deze positie wordt bijgehouden door een nummer (hoek_second, hoek_minuut en hoek_uur). Wanneer dit nummer gelijk wordt aan het hoek_nummer, roept het programma het maken van de gepaste wijzer (grote wijzer, kleine wijzer of secondepinker) op. Vervolgens wordt WachtPijl opgeroepen (om de leds een tijdje te laten branden) waarna de poorten worden uitgezet. Daarna wordt met het maken van de volgende hoek begonnen.

Voor het bepalen van de volledige tijd die 1 hoek mag duren, wordt de omlooptijd door 120 gedeeld en opgeslaan in tijd_houd. Nadat de nodige leds voor het vormen van de pijlen en cijfers zijn aangegaan, wordt TMR1L (die de tijd bijhoudt gedurende dewelke de leds aan de laatste toer bezig zijn) constant vergeleken met de omlooptijd gedeeld door 120. Wanneer deze gelijk zijn, wordt het maken van de volgende hoek gestart. Voor de tweede hoek wordt TMR1L vergeleken met 2 maal de omlooptijd gedeeld door 120, enzovoort.

Tijdsinstellingen via Visual Basic overbrengen

De code in Visual Basic zorgt voor het overbrengen van drie bytes. De eerste byte geeft de positie van de uurwijzer weer, de tweede deze van de minutenwijzer en de derde is een controlebyte. De waarden worden achtereenvolgens in de variabelen hoek_uur en hoek_minuut geschreven. Op deze wijze komen de wijzers in de juiste positie te staan wanneer men het uur ingeeft via Visual Basic. Voor verdere uitleg wordt verwezen naar de Visual Basic code.

Einde interrupt

Hier worden de nodige variabelen weer gereset en de interrupt terug ge-enabled.

 

Problemen

Comparatorprobleem

Doordat we vergeten waren een weerstand vanuit de uitgang naar de voeding te plaatsen, werkte deze niet zoals het hoorde.

Instellen van de poorten

Men kan best niet vergeten de juiste poorten als in-/uitgang te configureren.

Delen door 120

Gezien men bits makkelijk door 128 kan delen, kan men dit best gebruiken, mits de nodige voorzieningen te treffen om de fout te compenseren.

Versnellen

Doordat de motor af en toe versnelt, moet men voldoende tijd voorzien tussen het einde van de interrupt voor het maken van de hoeken, en het moment waarop het plaatje voorbij de sensor komt. Anders wordt er geen interrupt gegenereerd en komt de dubbele omlooptijd in het TMR1 register terecht, waardoor alle hoek verdubbelen.