Beginners mini-cursus (deel 1)

Om met PIC-Basic te kunnen werken heb je al enige basiskennis van elektronica nodig, programmeer ervaring is niet vereist, dat wordt nu net in deze minicursus uitgelegd.
Deze mini-cursus is er alleen om je op weg te helpen zodat je kunt gaan experimenteren met de Proton PIC Basic probeer compiler, deze is volledig bruikbaar, alleen het aantal PIC types is beperkt en het heeft een limiet van 50 programmaregels, genoeg voor deze mini-cursus.
De gekochte versie kan vrijwel alle PIC types programmeren.
De mogelijkheden zijn zo groot, dat het hier onmogelijk is alles uit te leggen, maar als je hiermee eenmaal op gang bent, komt de rest vanzelf en kun je naar de programma's van anderen, zoals de projecten van deze site kijken om verder te komen.
Gebruik een PIC16F628A met achtervoegsel I / P of E / P.
Als programmer raad ik de Wisp648 programmer van Voti aan, deze is niet duur (minder dan € 30,-) of bouw de veilige Galva Wisp PIC programmer van deze site!
 

Cursuspakket
Alle benodigde onderdelen om de cursus te kunnen volgen staan in de componentenlijst.
Vrijwel alle elektronica-componenten voor de cursus zitten ook in een speciaal samengesteld pakket voor de cursus van webshop Voti.

 

Download hier de LITE 1 versie van Proton PIC Basic en installeer deze op je computer.
Met deze LITE versie kun je de hele cursus doen, als de compiler je bevalt kun je hem aanschaffen en kun je onbeperkt, vrijwel alle PIC types programmeren in Proton PIC Basic.

We beginnen snel met als voorbeeld, een LED laten knipperen, gaandeweg gaan we het uitbreiden.


Eerst de PIC aansluiten
Belangrijk is dat de PIC wordt aangesloten op een mooie afgevlakte en gestabiliseerde spanning van 5V.
Als je al geen aandacht aan de spanning besteedt is de rest ook zinloos, de PIC kan rare dingen doen op een slordige 5V spanning.
Pin 5 van de PIC16F628A I/P (of E/P) is GND (= ground), die aansluiten op de 0V.
Pin 14 is de Vcc, die moet worden verbonden met +5V.
Direct over pin 5 en pin 14 moet een condensator van 100n worden aangesloten, deze zo kort mogelijk bij de PIC plaatsen.
Het best kun je voor de condensator een multilayer type gebruiken (zie foto).
Sluit nu een LED in serie met een weerstand van 1k aan tussen de +5V en poort A.1, dat is op een 16F628A pin 18.
Sommigen denken dat het zonder weerstand kan, vergeet dat maar, altijd een weerstand in serie met de LED's in deze cursus.
Zie ook schema hieronder:


Eerst instellen!!!
Ik krijg vaak e-mail "dat ie het niet doet".
Vrijwel altijd blijkt dat ze de compiler niet hebben ingesteld, omdat ze te graag willen beginnen met de cursus en dan dit gedeelte overslaan.
Toch maar even doen dus, vooral punt 1.

1. Lange mapnamen geven problemen bij het compileren, daarom is het belangrijk dat de compiler eerst goed wordt ingesteld!
2. Gebruikers van een Wisp648 programmer of de zelf te bouwen Galva-Wisp PIC programmer kunnen deze koppelen aan PIC Basic IDE.
3. Om te kunnen programmeren moet de programmer natuurlijk (tijdelijk) worden verbonden met de te programmeren PIC (= de doel PIC).

 

Programmeren
Tik nu onderstaand programma in:

DEVICE 16F628A                ;We gebruiken een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE              ;Alle ingangen digitaal

Opnieuw:                      ;Label met zelf te verzinnen naam
TOGGLE PORTA.1                ;Aan moet uit, uit moet aan
DELAYMS 500                   ;500 milliseconden = 0,5 seconde
GOTO Opnieuw                  ;Spring naar 'Opnieuw' en ga zo steeds door 

END                           ;Einde programma

Eerst een paar regels die steeds terug komen en die je ergens bovenaan elk programma zet.

DEVICE zet je standaard helemaal bovenaan met daarachter het type PIC waar je gebruik van wilt maken.
Als Crownhill Proton PIC Basic het PIC-type ondersteunt, wordt het vet op het beeldscherm, dit geldt ook voor alle functies en commando's.
In dit programma wordt dat dus: DEVICE 16F628A.

Daaronder CONFIG met daarachter INTRC_OSC_NOCLKOUT (= interne rc oscillator), we gebruiken de eerste tijd namelijk de ingebouwde oscillator, een kristal is niet nodig bij dit simpele programma.
Over noclkout later meer.
Met CONFIG kunnen we de configuratiebits (de "fuses") van de PIC instellen, ook hierover later meer.

Dan ALL_DIGITAL TRUE, wat de PIC vertelt dat er niet met analoge signalen wordt gewerkt, alles logisch 1 of 0, alleen +5V of 0V, alleen aan of uit, alles digitaal dus.
ALL_DIGITAL TRUE zet de Analoog naar Digitaal Converters (ADC) en comparators (als die in het desbetreffende PIC-type aanwezig zijn) op non-actief (= disabled).

Nu een label intikken, dat is een zelf te kiezen naam bijv. 'Opnieuw'.
Een label moet aan het begin van de regel geplaatst worden, eindigen met een dubbele punt (:) en moet beginnen met een letter.
In ons voorbeeld dus: 'Opnieuw:'

De LED is aangesloten op poort A.1, deze moet knipperen, hiervoor bestaat het commando TOGGLE.
Eerst definieert TOGGLE de poort automatisch als uitgang.
TOGGLE PORTA.1 draait de toestand van poort A.1 om, dus is hij aan dan wordt hij uitgezet en is hij uit dan wordt hij aangezet, dat heet togglen.

Dan moet er nog een vertraging ingebouwd worden, want anders knippert de LED zo snel, dat het lijkt alsof hij gedimd brandt.
Daar zijn de vertragingscommando's DELAYMS en DELAYUS voor.
DELAY (= vertragen) en MS staat voor milliseconde en US staat voor µseconde (microseconde).
Eén seconde = 1000 milliseconden, voor een halve seconde schrijven wij dus DELAYMS 500.
Let op dat de waarde maximaal 65535 mag zijn, dik 65,5 seconden.
Wil je een langere tijd dan moet je dit commando er een paar keer neerzetten.
Voor extreem lange tijden (uren, dagen) zijn er andere oplossingen.

De LED moet blijven knipperen, door middel van GOTO laat je hem opnieuw beginnen, vandaar de logische naam 'Opnieuw' verzonnen.
'GOTO Opnieuw' dus.


Thats all!
Je eerste PIC-Basic programma is klaar!

Het bovenste gedeelte vertelt de Proton PIC Basic compiler voor welk type PIC het programma omgezet moet worden en dat er geen kristal wordt gebruikt.

Het werkelijke programma is de lus tussen 'Opnieuw' en 'GOTO Opnieuw'.
Een programma loopt de volgorde die je opschrijft of springt naar waar het naar toe wordt gestuurd.
In het bovenstaande programma staat dus TOGGLE PORTA.1, hier zet hij de LED aan (of uit, als hij al aan was).
Dan komt hij de vertraging DELAYMS 500 tegen, vertraag 500 milliseconden, dus een halve seconde daar blijven wachten.
Als de tijd voorbij is, loopt hij verder en komt hij GOTO (= ga naar) tegen en daarachter heb je het woord 'Opnieuw' gezet, ga naar Opnieuw dus.
Nu springt hij terug naar het label 'Opnieuw:' en begint alles weer van voren af aan, alleen gaat bij TOGGLE nu de LED niet aan, maar juist uit en de keer daarna weer aan, enzovoort.


Nu moet je programma eerst worden vertaald naar een voor de PIC begrijpelijk programma, een .HEX bestand.
Met 1 druk op de knop (F9 toets) wordt het Basic programma omgezet (= gecompileerd) in assembler (.ASM) en wordt er tevens gelijk een .HEX bestand aangemaakt voor de PIC programmer, die het bestand weer in de PIC kan programmeren.
Om het omgezette programma in de PIC te kunnen programmeren is dus een PIC programmer nodig.
Als je een Wisp628, Wisp648 of Galva-Wisp PIC programmer hebt is hier een beschrijving hoe dat gaat met het programma BumbleBee, dat draait onder Windows:



Het is zeer belangrijk dat je achter vrijwel elke regel informatie zet, wat die regel doet, dat kan met behulp van een remark (= markeren, toelichten), het commando REM is hiervoor:

DELAYMS 500                   REM = 0,5 seconde 
DELAYMS 500                   ' = 0,5 seconde
DELAYMS 500                   ; = 0,5 seconde

Bovenstaande 3 regels zijn alle drie hetzelfde.
Mijn voorkeur gaat naar de ';' omdat assembler alleen met de puntkomma werkt, als je later ooit assembler (met ASM - ENDASM) toevoegt hoef je niet meer om te schakelen omdat je het zo al gewend bent.

 
Pas op met GOTO

Hierboven in het eerste voorbeeld wordt GOTO gebruikt.
Meteen is hier het advies om uit te kijken dat het geen wirwar van GOTO's wordt omdat bij veelvuldig gebruik het overzicht snel verloren gaat.
Het onderstaand programma laat de LED ook knipperen zonder GOTO maar met het commando WHILE - WEND.


Wijzig het vorige programma in onderstaand programma:

DEVICE 16F628A                ;We gebruiken een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE              ;Alle ingangen digitaal

WHILE 1 = 1                   ;Zolang 1 gelijk is aan 1...
  TOGGLE PORTA.1              ;Aan moet uit, uit moet aan
  DELAYMS 500                 ;500 milliseconden = 0,5 seconde
WEND                          ;...deze lus uitvoeren

END                           ;Einde programma

Het label 'Opnieuw:' en GOTO zijn vervangen door WHILE en WEND.
Dit commando voert het programma uit dat staat tussen de woorden WHILE en WEND, hier het aan- en uitzetten van een LED.
Dus WHILE (= zolang) 1 gelijk is aan 1, WEND (= terug keren, wenden), altijd blijven knipperen dus.
WHILE kan dus niet functioneren zonder het woord WEND en horen dus altijd beide in een programma te staan, anders krijg je een foutmelding.

 
Variabele

Om de functie van WHILE - WEND duidelijker te maken laten we de LED 4x knipperen als de spanning van de PIC wordt ingeschakeld.
Hiervoor moet er eerst een variabele worden aangemaakt.
Een variabele is een naam die een waarde kan onthouden, in dit geval dus de tellerstand die het aantal keer dat de LED heeft geknipperd bijhoudt.
Hiervoor bestaat het commando DIM.
Met DIM maak je een variabele aan (dimensioneren of declareren genoemd) met een zelf te verzinnen naam, die ook weer logisch moet klinken, in het onderstaand programma dus 'DIM LedTeller AS BYTE'.

Wat is nu weer AS BYTE (= als byte)?
Omdat een PIC maar een beperkt geheugenruimte heeft, moet je opgeven tot hoever je denkt dat de teller kan lopen en een byte bestaat uit 8 bits (= 8 geheugenplaatsen) waaruit 256 verschillende combinaties zijn te maken, de teller kan dus tellen van 0 t/m 255 (niet 256, namelijk 1 t/m 255 en de 256e is de waarde 0).
Je kunt ook zetten DIM LedTeller AS BIT (= als bit), dit neemt maar 1 geheugenplaats in, maar dan kun je maar 2 toestanden bedenken, namelijk 0 of 1, uit of aan, en moet de LED meer dan 256x knipperen dan moet je schrijven DIM LedTeller AS WORD, een word is 16 bits, hierdoor kun je doortellen tot maarliefst 65535, maar dat neemt dan ook 2x zoveel geheugen in dan een byte.
Dan bestaat er in PIC-Basic ook nog DWORD, (Double word) die telt van -2147483648 t/m +2147483647, maar neemt dan ook 32 geheugenplaatsen in (32 bits).
Ook is er nog DIM LedTeller AS FLOAT, deze werkt met cijfers achter de komma (float = drijvend, drijvende komma), die neemt ook 32 bits in (-2147483647,999 t/m 2147483646,999).
Aanbevolen wordt om DWORD en FLOAT zo weinig mogelijk te gebruiken omdat berekeningen hiermee veel programmageheugen van de PIC vragen, met BIT, BYTE en WORD is vrijwel alles te doen.
Tot slot is er ook nog AS STRING, voor teksten op displays, maar daarover later meer.

Zo, dat was even doorbijten maar variabelen heb je vrijwel altijd nodig.


Wijzig het vorige programma in onderstaand programma:

DEVICE 16F628A                ;We gebruiken een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE              ;Alle ingangen digitaal

DIM LedTeller AS BYTE         ;Maak variabele met de naam 'LedTeller' aan 

CLEAR                         ;Wis alle RAM geheugen

;Hoofdprogramma
WHILE LedTeller < 8           ;Zolang teller kleiner is dan 8 ...
  TOGGLE PORTA.1              ;Aan moet uit, uit moet aan (knipper)
  DELAYMS 500                 ;500 milliseconden = 0,5 seconde
  LedTeller = LedTeller + 1   ;Teller met 1 verhogen
WEND                          ;...deze lus uitvoeren

HIGH PORTA.1                  ;LED uitzetten

END                           ;Einde programma

Aangezien de tellerwaarde hooguit 8 wordt, want 4x de LED aan / uit betekent 4x de LED aan- en 4x de LED uitzetten, om en om weliswaar, kun je een byte gebruiken, dus: DIM LedTeller AS BYTE.

Dan een nieuw commando is CLEAR.
Clear (= vrij maken, wissen) zonder een variabele naam erachter, wist de inhoud van alle variabelen, niet de variabelen zelf maar de inhoud van elke variabele wordt dus 0 gemaakt, terwijl 'CLEAR LedTeller' alleen de inhoud van de variabele 'LedTeller' wist (op 0 zet).
Een goede gewoonte is om bovenin elk programma alle RAM geheugen te wissen door het commando CLEAR er neer te zetten, zodoende begin je met alle waarden op 0.

Dan het hoofdprogramma, zoals de REM regel vermeldt.
WHILE LedTeller < 8, wat zoiets betekent als: zolang (= while) de LedTeller kleiner is dan (<) 8, moet het programmablok tot aan WEND worden herhaald.
In het blok wordt ervoor gezorgd dat de LedTeller steeds met 1 wordt verhoogt, omdat anders de LedTeller altijd op 0 zou blijven staan en daardoor de LED nog steeds oneindig blijft knipperen.
Verhogen gaat alsvolgt: LedTeller = LedTeller + 1, dat houdt dus in dat tel bij de waarde die de variabele LedTeller heeft er 1 bij en geef de uitkomst (terug) aan de variabele LedTeller, zo wordt LedTeller steeds 1 hoger nadat de LED aan of uit is gezet.
Je kunt elke waarde er bij optellen (zolang de uitkomst maar nooit hoger wordt dan 255, omdat je LedTeller als byte variabele hebt gedimd.
Steeds als je de spanning op de PIC zet begint het programma bovenaan en blinkt de LED 4 keer, daarna stopt het programma bij END.

Het komt heel vaak voor dat tellers met 1 verhoogt of verlaagt moeten worden, daarvoor bestaan speciale commando's:
INC  LedTeller, doet hetzelfde als LedTeller = LedTeller + 1 (increment (= verhogen)).
DEC LedTeller, doet hetzelfde als LedTeller = LedTeller - 1 (decrement (= verlagen)).
Dit werkt dus alleen als een teller steeds maar met 1 verhoogt of verlaagt hoeft te worden.

Is de LedTeller 8 keer met 1 verhoogt dan is LedTeller niet meer kleiner dan 8 en wordt dus niet meer aan de WHILE - WEND voorwaarde voldaan, het programma gaat nu verder met het eerste commando dat na WEND komt.

En dat is HIGH PORTA.1, weer iets nieuws.
HIGH PORTA.1 betekent: maak van poort A.1 (pin 18 van een PIC16F628A) een uitgang en maak die uitgang HIGH (= hoog) (= +5V).
En aangezien de LED is aangesloten tussen PORTA.1 en +5V, gaat de LED uit. Als de LED was aangesloten tussen PORTA.1 en GND dan was de LED juist aangegaan.

Logisch dat er dus ook LOW (= laag) bestaat, die maakt de opgegeven poort een uitgang en maakt deze laag (= 0V).

Dan nog aandacht voor de instructie END.
Als je deze vergeet dan zou de PIC verder kunnen lopen door zijn (meest lege) geheugen dat na HIGH PORTA.1 komt, met onverwachte gebeurtenissen!
Vaak is END niet nodig, zoals in het allereerste voorbeeld van deze cursus (die met GOTO), de PIC zal altijd in de GOTO lus blijven en de instructie END is daar dus overbodig geplaatst.
Toch wordt aanbevolen om END altijd te plaatsen, ook al is het vaak overbodig.
END stopt het PIC programma door hem in een oneindige loop te brengen.
De poorten blijven in dezelfde stand (in- of uitgang, hoog of laag) en de PIC wordt in low power mode gezet.


We vervangen TOGGLE door HIGH en LOW en laten hiermee de LED 5x kort blinken:

DEVICE 16F628A                ;We gebruiken een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE              ;Alle ingangen digitaal

SYMBOL AantalKnip = 5         ;Het aantal keer dat LED knippert
SYMBOL LedTijd    = 150       ;mSec, Knipper snelheid LED

SYMBOL LED        = PORTA.1   ;Op poort A.1 zit de LED aangesloten

DIM LedTeller     AS BYTE     ;Maak variabele LedTeller aan

CLEAR                         ;Wis alle RAM geheugen

;Hoofdprogramma
WHILE LedTeller < AantalKnip  ;Zolang teller nog niet de eindstand heeft... 
  LOW  LED                    ;Low = LED aanzetten
  DELAYMS LedTijd             ;Tijd dat LED aan is
  HIGH LED                    ;High = LED uitzetten
  DELAYMS LedTijd * 4         ;Tijd dat LED uit is, 4x langer dan aan
  INC LedTeller               ;Teller met 1 verhogen
WEND                          ;...deze lus uitvoeren

END                           ;Einde programma

Vergeet niet ook de remark regels steeds aan te passen.
Het meeste is wel duidelijk nu, op SYMBOL na.
Allereerst kun je met SYMBOL een constante waarde een naam geven.
Je had ook achter DELAYMS rechtstreeks 150 in kunnen vullen, maar als in een groter programma vaak DELAYMS staat, wordt het zoeken welke bij een wijziging allemaal verandert moeten worden, daarom ook de namen logisch kiezen zodat je meteen weet wat die constante of variabele doet.
Het toekennen van namen neemt geen extra geheugen in van de PIC.
Het is de PIC-Basic compiler die tijdens het compileren de namen weer verandert in de originele waarden, vóórdat het in een PIC wordt geprogrammeerd, dus ook een lange naam neemt niet meer geheugen in dan een korte, geef de dingen dus zoveel mogelijk een duidelijk herkenbare naam.

Ook kun je met SYMBOL een poort een naam geven en het is dan logisch dat de poort een naam krijgt met datgene dat erop aangesloten is, dus namen als Lamp, UitgangA, UitgangB, Ventilator, Motor, Relais of zoals nu gewoon LED.
En straks bij ingangen namen als DrukToets, Schakelaar, Sensor, Temperatuur, enz., zolang de naam maar begint met een letter, daarna mogen ook cijfers in de naam worden gebruikt zoals Lamp1, Lamp2, LED1Rd, LED8Grn, IC1, IC2_Pin18 en IC3_Pin5.

Het heeft meerdere voordelen:

In het programma zelf is meteen te zien met welk component (hier dus LED) je aan het programmeren bent, als je de namen tenminste logisch kiest.
Stel dat de LED tijdens het printje ontwerpen niet uitkomt op PORTA.1 maar op PORTA.0 (pin 17), dan zou je alle PORTA.1 in het programma moeten veranderen in PORTA.0.
Nu hoef je alleen bovenin het programma:
SYMBOL LED = PORTA.1
te wijzigen in:
SYMBOL LED = PORTA.0
en het hele programma is meteen aangepast.

Wen jezelf dit meteen aan.

In bovenstaande programma zie je dat de LED 150 mSec aan is (LedTijd = 150).
De LED is echter 600 mSec uit omdat na HIGH LED een DELAYMS komt met daarachter de berekening LedTijd * 4, dus 150mSec × 4 = 600mSec.
Een asterisk ( * ) betekent vermenigvuldigen, hierdoor is de LED altijd 4× langer uit dan aan, ook als je de constante 'LedTijd' verandert in een andere tijd.


Naast WHILE - WEND is er ook REPEAT - UNTIL (= herhaal - totdat).

DEVICE 16F628A                ;We gebruiken een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE              ;Alle ingangen digitaal

SYMBOL AantalKnip = 5         ;Het aantal keer dat LED knippert
SYMBOL LedTijd    = 500       ;mSec, Knipper snelheid LED

SYMBOL LED        = PORTA.1   ;Op poort A.1 zit de LED aangesloten

DIM LedTeller     AS BYTE     ;Maak variabele LedTeller aan

CLEAR                         ;Wis alle RAM geheugen

;Hoofdprogramma
LedTeller = AantalKnip        ;Stel eerst de teller in
REPEAT                        ;Herhaal onderstaande lus...
  LOW  LED                    ;Low = LED aanzetten
  DELAYMS LedTijd             ;Tijd dat LED aan is
  HIGH LED                    ;High = LED uitzetten
  DELAYMS LedTijd / 2         ;Tijd dat LED uit is, 2x korter dan aan 
  DEC LedTeller               ;Teller met 1 verlagen
UNTIL LedTeller = 0           ;...totdat LedTeller op 0 staat

END                           ;Einde programma

Het verschil tussen WHILE - WEND en REPEAT - UNTIL is dat WHILE voordat het de lus inloopt de conditie al bekijkt, is meteen al niet aan de voorwaarde voldaan, dan wordt de lus nooit uitgevoerd en wordt met de eerste opdracht na WEND verder gegaan.
REPEAT - UNTIL loopt eerst door de lus en daarna wordt pas bekeken of de lus nog eens moet worden uitgevoerd, een REPEAT - UNTIL lus wordt dus altijd minimaal 1 keer uitgevoerd.
Een WHILE - WEND lus wordt steeds opnieuw uitgevoerd zolang aan de voorwaarde is voldaan.
Een REPEAT - UNTIL lus wordt steeds opnieuw uitgevoerd zolang niet aan de voorwaarde is voldaan.

Dit keer wordt er niet opgeteld met INC maar naar beneden geteld met DEC, dat houdt in dat aan variabele 'LedTeller' eerst een waarde moet worden gegeven, voordat een lus (REPEAT - UNTIL of WHILE - WEND) wordt binnengegaan.
Het programma blok blijft zich herhalen (REPEAT) totdat (UNTIL) LedTeller = 0.

In bovenstaande programma zie je dat de LED 500 mSec aan is (LedTijd = 500).
De LED is echter maar 250 mSec uit omdat na HIGH LED een DELAYMS komt met daarachter de berekening LedTijd / 2,
dus 500mSec ÷ 2 = 250mSec.
Een slash-forward ( / ) betekent delen, hierdoor is de LED altijd 2× korter uit dan aan, ook als je de constante 'LedTijd' verandert in een andere tijd.


Een paar dingen die je je meteen moet aanwennen:

Blokken instructies die bij elkaar horen, zoals hierboven het gedeelte tussen REPEAT en UNTIL, met 1 of 2 spaties laten inspringen (TAB toets).
Hierdoor is veel duidelijker te zien waar een REPEAT ... UNTIL blok begint en eindigt.
Regelmatig regels overslaan, het is veel overzichtelijker als instructieblokken die bij elkaar horen bij elkaar staan.
Zet declaraties bovenaan het programma zoals toewijzingen met DIM en SYMBOL, op alfabetische volgorde.
Nu is het nog te overzien, later bij grotere programma's niet meer.
Gebruik GOTO zo vaak je wilt, maar houdt het overzichtelijk, met GOTO is makkelijk een warboel te maken.
Zet zoweinig mogelijk constante waarden rechtstreeks in een programma maar geef het zoveel mogelijk d.m.v. SYMBOL een naam zoals hierboven met 'AantalKnip' en 'LedTijd' is gedaan.
Geef variabelen altijd de kleinst mogelijke geheugenruimte, maar let op; als bijv. met een BYTE variabele toch verder wordt geteld dan 255, dan begint hij weer vanaf 0 te tellen.
Geef constanten, variabelen en poorten logisch klinkende namen.
Het geven van commentaar in REM regels is echt belangrijk. Het moet wel nuttig commentaar zijn, om achter DELAYMS 200 te gaan zetten ';Wacht 200mSec' heeft weinig nut, dat kun je zonder REM ook wel zien, nuttiger is om daar bijv. achter te zetten ';Afremtijd motor nr.3'.

Je ziet, PIC's programmeren met PIC Basic gaat vrij eenvoudig.
In deel 2, worden uitgangen afhankelijk van ingangssignalen gemaakt.