Posts tonen met het label how to. Alle posts tonen
Posts tonen met het label how to. Alle posts tonen

05 oktober 2015

Achtergrond: resolutie of oplossend vermogen.

Resolutie van A/D converter

In de eerste entry over analoge invoer werd in het programma het volgende commentaar gemaakt:
; LDR is documented to read values between 120 and 70; mine works with 190/140. ; of course, 127 should be the tripping point
Hoezo, moet het tripping point "natuurlijk 127 zijn"?
Dat heeft alles te maken met het gebruikte commando. In het programma werd de volgende opdracht gebruikt:
readadc LDR,b0 ; read ADC1 into variable b0
In de documentatie (handboek 2, sectie 2, pagina 170) wordt al gemeld, dat readadc een 8 bits nauwkeurige waarde aflevert in een variabele. Dat deze variabele ook nog eens als BYTE (b0-b27) gedefinieerd is, zegt genoeg. Meer dan 256 mogelijkheden (2 tot de achtste) zijn er niet.


Dat is niet genoeg!

De configuratie van het experimenteerbord is zodanig van opzet, dat de maximale waarde, die door de ADC ingelezen kan worden, gelijkstaat aan de voedingsspanning (zeg: 5 Volt). Dat betekent een resolutie van 5/256 = 0,01953 Volt.
Maar het kan beter! In de PICAXE-08M2 is namelijk een 10 bits ADC aanwezig. Het commando, dat gebruikt oet worden is dan:
readadc10 LDR,w0 ; read ADC1 into variable w0
De gelezen waarde wordt opgeslagen in een WORD type variabele van 16 bits; de waarde kan dan tussen 0 en 65536 liggen, een betekent dan een resolutie van 0,0000763 Volt (afgerond).


Meer van dat

Er zijn meer commando's, die een "hi-res" broertje hebben:
readdac - readdac10 readtemp - readtemp12 ; readtemp = readtemp12, omgezet naar hele graden Celcius. touch - touch16 ; touch = touch16, omgezet naar 8 bits

Achtergrond: Input en output (PICAXE-08M2)

Input en output definiëren

Bij opstarten configureert de PICAXE-08M2 alle pins als input (met uitzondering van pin0/C.0, dat is altijd output). Pas als een commando gegeven wordt, kan de functie wijzigen naar output. In de vorige post werd gesteld:
C0 gaat als output werken, en bestuurt de groene LED (groene draad)
C1 gaat als input werken, en vraagt de LDR uit (gele draad)

Maar hoe regel je dat nu? Het blijkt, dat er drie manieren zijn om dat te voor elkaar te krijgen:
  1. Het juiste type commando gebruiken
  2. Het input of output commando gebruiken
  3. Het let dirs commando gebruiken
Let op: Pins C.0 en C.3 kunnen niet worden gewijzigd, deze zijn altijd output, respectievelijk input.


Het juiste type commando

Zodra er een "input-type" commando gebruikt wordt, configureert de microcontroller de desbetreffende pin als input. Voorbeelden van "input-type" commando's zijn:
  • count C.2, 100, b0
  • pulsin C.5, 1, w1
  • serin C.0, N2400, b3
  • readadc C.1, b0
De PICAXE chips configureren de correcte pin automatisch als input, en dat blijven ze dan ook.

Het zelfde geldt voor "output-type" commando's. Als zo'n commando gebruikt wordt voor een pin, dan wordt deze pin tot output verklaard, en blijft dat ook (als die pin dat aankan, natuurlijk).
Voorbeelden van output commando's zijn
  • high C.4
  • low C.4
  • toggle C.4
  • serout C.2,N2400,("Hello World")
  • sound C.1,(1,40)

Het input/output commando

Gebruik van het input commando definieert een pin expliciet als input. Voorbeeld:
Input C.0
Een beetje overbodig, want direct bij power-up zijn alle pins immers als input geschakeld. Het output commando wordt dan ook vaker gebruikt.


Het let dirs commando

Het "let dirs" commando is bedoeld om alle pins ineens te configureren. Daarvoor wordt een binair masker gebruikt, waarin een 0 een INPUT voorstelt, en een 1 een OUTPUT. Zoals gebruikelijk wordt er van rechts naar links gewerkt (het Most Significant Bit, of MSB, staat links, of "vooraan", het LSB of Least Significant Bit, rechts).
De pins toewijzing voor de PICAXE-08M2 is:
- - - C5 C4 - C2 C1 -
De eerste drie van de 8 bits, C.3 en C.0 zijn nietszeggend, want de 08M2 heeft maar zes I/O pins. En, nogmaals: Pins C.0 en C.3 kunnen niet worden gewijzigd; C.0 is altijd OUT, C.3 is altijd IN
Het commando
let dirsC = %00000110
maakt C.2 en C.1 tot OUTPUTS, en de overige pins tot INPUT. Het procent symbool ("%") aan het begin van de cijferreeks geeft aan dat de volgende cijfers binair moet worden gezien, en niet decimaal.

Het pins commando

In aanvulling op het dirs commando, en om zaken onoverzichtelijker te maken, hier het bit masker voor het pins commqando:
- - - C5 C4 C3 C2 C1 -
Dit omdat pins gebruikt kan worden om samen met een leesmasker te gebruiken in een if...then commando; alle pins zijn dan inputs en C.3 is immers *altijd* input.

03 oktober 2015

Tutorial 2 - Analoge inputs


Analoge inputs

Op het AXE091 bordje zijn een drietal analoge gevers te vinden; een licht afhankelijke weerstand (LDR, van het engelse Light Dependent Resistor) , een regelbare weerstand of potentiometer, en een temperatuurvoeler. Hier zitten ze:

De LDR

Ik moest de LDR nog zelf solderen; hij zat er los bij.

Wat er dient te gebeuren is:
  • Lees de analoge waarde van de LDR digitaal in (readadc commando)
  • Als de waarde boven een gegeven waarde ligt, switch dan de rode LED aan.
  • Als de waarde beneden een gegeven waarde ligt, switch dan de groene LED aan.
  • En zo niet, doe dan beide LEDs uit
Om dat voor elkaar te krijgen, moeten de volgende verbindingen worden gemaakt:
  • C4 gaat als output werken, en bestuurt de rode LED (rode draad)
  • C0 gaat als output werken, en bestuurt de groene LED (groene draad)
  • C1 gaat als input werken, en vraagt de LDR uit (gele draad)
Ziehier de PICAXE-08M2 kant:
De rode draad zit aan pennetje 3, de groene aan pennetje 7 en de gele aan pen 6.
Aan de invoer/uitvoer terminal kant ziet het er zo uit:
De rode draad zit in de L3 connector, de groene in de L1, en de gele in de LDR connector.


Programma

Onderstaand het programma in knip-en-plak mode:
; connect C.4 (physical pin 3) to L1 (red) ; connect C.0 (physical pin 7) to L2 (green) ; connect C.1 (physical pin 6) to LDR ; LDR is documented to read values between 120 and 70; mine works with 190/140. ; of course, 127 should be the tripping point symbol RED = C.4 ; define pin 3 with the name "RED" symbol GREEN = C.0 ; define pin 7 with the name "GREEN" symbol LDR = C.1 ; define pin 6 with the name "LDR" ; set picaxe type #picaxe 08m2 main: readadc LDR,b0 ; read ADC1 into variable b0 ; if you want a real time feedback of the actual vaules, use ; debug b0 if b0 > 157 then RedOn ; if b0 > 157 then do RedOn if b0 < 127 then GreenOn ; if b0 < 127 then do GreenOn low RED ; else switch off RED low GREEN ; and switch off GREEN goto main ; jump back to the start RedOn: ; make a label high RED ; switch on Red LED low GREEN ; switch off Green LED goto main ; jump back to start GreenOn: ; make a label high GREEN ; switch on C.0 low RED ; switch off C.4 goto main ; jump back to start

Let op de introductie van een nieuw element, de subroutine.
Zowel RedOn, als GreenOn zijn subroutines, die vanuit het hoofdprogramma worden opgeroepen. Beide routines keren na aanroep terug naar de hoofdroutine "main" middels het goto main commando.
Er mag maar een main routine zijn (hoewel... de PICs zijn in staat meer dan een taak tegelijk te vervullen: parallel tasking).

Het resultaat: als de LDR wordt afgedekt, daalt de ingelezen waarde onder 127 en wordt de groene LED ontstoken. Onafgedekt valt zoveel licht op de LDR, dat de waarde boven de 157 komt, en de rode LED oplicht:

29 september 2015

Tutorial 1 - Conventies, programmeren en het gebruik van inputs.

Conventies


Conventies; afspraken met betrekking tot de code. Eentje is er al genoemd: het aangeven van het type PIC dat gebruikt wordt. De Programming Editor doet het (ook) zelf, als niets opgegeven is; hij gaat uit van de aangesloten PIC.


Naamgeving

Aangezien de laatste versie Microchip/PICAXE PICs nogal wat mogelijkheden hebben per pootje (zie het referentie plaatje), is het een goede gewoonte om de commando's te gebruiken met een PORT.PIN notatie. In geval van de 08M2 lijkt dat (en is het) een tikkie overdreven, maar de PICAXE-40X2 heeft maar liefst vier poorten (A, B C en D), dus dan is het zo gek niet.
Kortom, het eerste programma wordt dus:
; connect physical pin 3 to L1, L2, or L3 ; set picaxe type #picaxe 08m2 main: high C.4 ; switch pin 3 high pause 1000 ; wait for 1 second low C.4 ; switch pin 3 low pause 1000 ; wait for 1 second goto main


Programmeren

Aan de hand van voorbeelden staan hieronder een paar programmeer principes uitgewerkt. Hopelijk wordt het potentieel van de PICAXE PICs duidelijk. De referentie staat natuurlijk online.


Symbols

Bij het gebruik van PICs met veel pootjes wordt het steeds lastiger om te onthouden welk in- of uitvoer apparaat gekoppeld is aan welk pootje. Dan is het gebruik van symbols makkelijk. Zo kun je de output C.4 in bovenstaand test programma vervangen door het symbol "LED", of "rode_LED", of "lampje".
; connect physical pin 3 to L1, L2, or L3 ; set picaxe type #picaxe 08m2 symbol LED = C.4 ; define LED connected to C.4 main: high LED ; switch on LED wait 1 ; wait for 1 second low LED ; switch LED off wait 1 ; wait for 1 second goto main ; loop forever

In plaats van pause gebruik ik hier wait. Pause telt in milliseconden, wait in hele seconden. Pause accepteert waarden tussen 1 en 65535, wait verwacht input tussen 1 en 65.


Loops

Loops, of lussen, zijn herhalende stukjes programma. Bovenstaand voorbeeld is een programma, dat altijd maar doorgaat, dankzij het "goto main" als laatste commando. Hordes programmeurs zijn tegen goto-commando's, bovendien wordt "goto" niet door alle programmeertalen herkend. Bovendien is een "goto" altijd op te vangen met een andere constructie.
In bovenstaand voorbeeld is het een loop. Daarnaast ga ik een teller gebruiken - nog een toepassing van SYMBOL, maar nu om een variabele te definiëren (LED was een constante):
; connect physical pin 3 to L1, L2, or L3 symbol counter = b1 ; define the variable b1 as "counter" symbol LED = C.4 ; define pin 3 with the name "LED" ; set picaxe type #picaxe 08m2 main: for counter = 1 to 5 ; start a for...next loop high LED ; switch pin 3 high pause 500 ; wait for 0.5 second low LED ; switch pin 3 low pause 500 ; wait for 0.5 second next counter ; end of for...next loop end ‘ end program
Dit programma zal dus de LED vijf keer laten "flashen" en is dan beëindigd. Dat is niet erg spectaculair... als je wilt laten zien wat je kan met zo'n PIC en iemand reageert niet snel genoeg, dan is het alweer voorbij. Je moet de PIC dan opnieuw opstarten, en bij een PICAXE-08M2 betekent dat: spanning eraf en weer opnieuw aansluiten.
Dat kan anders!


Input


Er zitten een aantal schakelaar op het AXE091 prototype bord. Ik ga ervoor zorgen, dat de PIC de LED vijf keer laat flashen nadat de schakelaar ingedrukt is. Om dit voor elkaar te krijgen, sluit ik ingang C.1 (pootje 6) aan op schakelaar SW3. Ingang C.3 (pootje 6) - groene draad. De gele draad is (nog steeds) uitgang C.4 (pootje 3).
Groene draad gaat aan connector met opschrift SW3; de gele is (nog steeds) verbonden met L1:
Het programma wordt vervolgens:
; connect physical pin 3 to L1, L2, or L3 ; connect physical pin 6 to SW1, SW2, or SW3 symbol counter = b1 ; define the variable b1 as "counter" symbol LED = C.4 ; define pin 3 with the name "LED" symbol KEY = pinC.1 ; define pin 6 with the name "KEY" ; set picaxe type #picaxe 08m2 main: ; main loop if KEY = 1 then flash ; 1 means high (Vcc) goto main flash: for counter = 1 to 5 ; start a for...next loop high LED ; switch pin 4 high pause 500 ; wait for 0.5 second low LED ; switch pin 4 low pause 500 ; wait for 0.5 second next counter ; end of for...next loop goto main ; done - wait for next key

En dit is het resltaat:

Wordt vervolgd met analoge input.