Posts tonen met het label PIC. Alle posts tonen
Posts tonen met het label PIC. 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.

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.

28 september 2015

Layout en interfacing

Het bord

Het bord kaal ziet er zo uit:
Wat ik slecht vind is het gebruik van een 9V batterij snap-on, terwijl deze spanning veel te hoog is. Bye-bye board! Niet doen, dus.
Je moet de batterijhouder gebruiken. En dan nog: niet verkeerd aansluiten, dus eerst goed kijken of de connectoren op elkaar passen, en dan pas contact laten maken. Voor zover ik weet zit er geen beveiliging tegen ompolen op!

Details


Voor de vaarregelaar (ook wel: Electronic Speed Controller, of ESC) moet een 08M2 volstaan. Deze werd ook door Alan gebruikt, en ik heb er twee mee laten komen met het bordje.
Hier zit hij op het bord:
Ik ga dus voorlopig alleen deze gebruiken. Om dit duidelijk te maken zal ik in de source code duidelijk maken om welk type microcontroller het gaat. Dat is sowieso een goede gewoonte.
Dit gaat als volgt:
; set picaxe type #picaxe 08m2
Regels, die beginnen met een puntkomma (semi colon, ";") zijn commentaarregels. Je mag ook een apostrof ("'") gebruiken:
'dit is ook commentaar maar dit niet meer!
Een apostrof is, net als een puntkomma, een aanduiding voor één regel commentaar.
Als je meer regels commentaar wilt gebruiken kun je de #rem opdracht gebruiken, samen met #endrem:
#rem dit wordt door de PICAXE Programmer/Editor gezien als een blok commentaar dat doorgaat totdat het endrem directive bereikt wordt: #endrem

Regels, die voorafgegaan worden met zo'n nummer teken (hash, "#"), zijn 'directives', dit zijn geen programmaregels, maar aanwijzingen voor de compiler. Het "#rem" directive, hierboven was dus een aanwijzing voor de compiler, om de volgende regels niet te beschouwen als programmacode, maar te negeren.
Het #picaxe directive is er ook zo een, en deze vertelt de compiler expliciet welke chip er geprogrammeerd gaat worden. Zie handboek 2, pagina 7, Directives.


Input en output


Er zitten nogal wat componenten op het AXE091 bordje. Hier in detail de IO aansluitingen:
Van links naar rechts zitten er de volgende connectoren op:
  • V+ (+ Spanning, Vcc) 
  • 0V (- Spanning, Gnd) 
  • KD Keyboard Data 
  • KC Keyboard Clock 
  • IRR Infra-rood ontvanger [=receiver] 
  • IRL Infra-rood LED
  • L3 LED L3 (rood)
  • L2 LED L2 (geel)
  • L1 LED L1 (groen)
  • SVO Servo
  • LDR Lichtgevoelige weerstand
  • TMP DS18B20 temperatuur sensor
  • SW3 Schakelaar 3
  • SW2 Schakelaar 2
  • SW1 Schakelaar 1
  • POT Potentiometer (regelbare weerstand)
  • V+ (+ Spanning, Vcc)
  • V+ (+ Spanning, Vcc)
  • 0V (- Spanning, Gnd)
  • 0V (- Spanning, Gnd)
Aan de onderkant zitten er nog een aantal, zie de beschrijving van het AXE091 bord.


Troubleshooting het eerste programma


Ik gebruik onderstaand altijd als refentie:
Voor het eerste experiment moeten uitgang C.4, fysieke pin 3, van de PICAXE-08M2 worden verbonden met een van de LED connectoren L1, L2 of L3. Naar gelang of je rood, geel of groen leuk vindt.
Vervolgens sluit je de batterijen en de interface kabel aan. Je hebt de driver natuurlijk al geïnstalleerd. Je opent de Programming Editor, en geeft je eerste programma in (zie ook de eerste kennismaking)
Vervolgens laat je de syntax controleren:
En dan programmeren maar! Oeps:
Deze fout komt nogal eens voor, en stelt weinig voor. Open het Options item in je Programming Editor, en je zult zien dat de USB interface niet op COM1, maar op COM5 zit.
Doodeenvoudig de juiste COM-poort selecteren en nogmaals proberen:
En dit is dan het resultaat:

27 september 2015

Het begin

Intro

Door omstandigheden ben ik (weer) met modelbouw begonnen. Waar ik vroeger snelheidsregelaars bouwde met een NE544 (toen heb ik prototype samples aangevraagd; inmiddels is het IC uit de handel!), kom je er tegenwoordig geen enkele meer tegen, die zonder een PIC werkt.
Ook de eindtrap; die van mij gebruikte de TIP140 en TIP145 complementaire power darlingtons. Tegenwoordig gebruik je een IRF6648, een BUZ11 of iets wat er op lijkt. In elk geval iets, dat bij de 10A, die de TIP140 kon verstouwen geen 30 Watt (VCE(SAT)=3,0V bij ICE=10A, P=U*I) verstookte, maar iets van 3 Watt (RDS(ON)=0,032Ω en P=I^2*R)

Doel: met behulp van een PIC zelf een vaarregelaar bouwen.

Welke chip?

Iets dat ik tegenkwam, waren de pagina's van Alan Bond met een geweldige geluiden generator. Alan gebruikt PIC's afkomstig van een firma PICAXE. Feitelijk zijn het micro controllers van Microchip.
Ze zijn goedkoop (variërend van UKP 1,80 tot UKP 5,90), makkelijk te programmeren, en -last but no least- alle programmatuur is gratis!
En dus vallen Arduino's, ATMega's en Raspberries af - te veel van het goede.

Hard- en Software

Een ogenblik nagedacht over de kit, die ik zou gaan kopen. Besloten om voor de universele AXE091 te gaan - daar kun je elke controller mee programmeren, en je kunt ermee experimenteren.

Features:
  • USB programmeerkabel.
  • PICAXE-18M2 Microcontroller.
  • Ondersteunt alle 8/14/18/20/2840 pin PICAXE chips.
  • Computer download schakeling is on-board.
  • Groot breadboard.
  • Voeding middels batterijen (houder inlcuded) of externe voeding (niet meegeleverd).
  • LED power indicator.
  • 3 LEDs als outputs.
  • 3 schakelaars als input.
  • LDR en potmeter als analoge inputs.
  • DS18B20 digitale temperatuur sensor.
  • Infra rood ontvanger en zender (LED).
  • Keyboard connector.
  • Seriële (MAX202 buffered) RS232 connector (inverted en non-inverted).
  • IC houders voor I2C en SPI geheugen modules (niet meegeleverd).
  • Socket en batterij connector voor een DS1307 Real Time Clock (niet meegeleverd).

De software zou op CD worden geleverd, maar de meest recente versies staan toch online - de CD zat er (dus) ook niet bij.

Eerste controle

Nadat je de driver hebt geïnstalleerd, en je computer ervan overtuigd hebt dat er iets is aangesloten, volgt het eerste programma!
main: high 4 pause 1000 low 4 pause 1000 goto main