Istruzioni PicAXE High Low Inc Dec High Portc Low Portc Input Nap

Transcript

Istruzioni PicAXE High Low Inc Dec High Portc Low Portc Input Nap
Istruzioni PicAXE
Tabella riassuntiva
Microcontrollori
-1-
High
HIGH pin {,pin,pin...}
08M,14M,20M,18A,18X,28A,28X,28X1,28X2
Manda a 1 l’output indicato con pin (0-7). Nei microcontrollori programmabili questo comando svolge anche la
‘ 1 in output 1
funzione di configurare automaticamente il pin come output. ES. high 1
Low
LOW pin {,pin,pin...}
08M,14M,20M,18A,18X,28A,28X,28X1,28X2
Manda a 0 l’output indicato con pin (0-7). Nei microcontrollori programmabili questo comando svolge anche la
funzione di configurare automaticamente il pin come output. ES. low 1
‘ 0 in output 1
Inc
INC var
Incrementa (aggiunge 1) al valore della variabile.
Dec
DEC var
Decrementa (toglie 1) al valore della variabile.
08M,14M,20M,18A,18X,28A,28X,28X1,28X2
ES. inc b2
‘ aggiunge 1 al valore di b2
08M,14M,20M,18A,18X,28A,28X,28X1,28X2
ES. dec b2
‘ toglie 1 al valore di b2
High Portc
HIGH PORTC pin {,pin,pin...}
Manda a 1 gli output selezionati (0-7) del portc.
14M,28X,28X1
ES. high portc 2
‘ manda a 1 l’output 2
ES. low portc 2
‘ manda a 0 l’output 2
Low Portc
HIGH PORTC pin {,pin,pin...}
Manda a 0 gli output selezionati (0-7) del portc.
14M,28X,28X1
Input
INPUT pin
08M,28X2
Configura come input i pin(0-7) selezionati. Questo comando serve solo per i microcontrollori con I/O
programmabili. All’avvio del programma tutti gli I/O sono configurati come input (tranne l’out0 del PicAXE-08 e
08M che rimane sempre un output).
ES. input 2
‘ pin 2 configurato come input
Output
OUTPUT pin
08M,28X2
Configura come output i pin(0-7) selezionati. Questo comando serve solo per i microcontrollori con I/O
programmabili. All’avvio del programma tutti gli I/O sono configurati come input (tranne l’out0 del PicAXE-08 e
08M che rimane sempre un output).
ES. output 2
‘ pin 2 configurato come output
Reverse
REVERSE pin
08M
Configura come output i pin(0-7) che ora sono input e viceversa. Questo comando serve solo per i
microcontrollori con I/O programmabili. All’avvio del programma tutti gli I/O sono configurati come input (tranne
l’out0 del PicAXE-08 e 08M che rimane sempre un output).
ES. input 1
‘ pin 1 input
reverse 1
‘ pin 1 output
reverse 1
‘ pin 1 input
Toggle
TOGGLE pin
08M,14M,20M,18A,18X,28A,28X,28X1,28X2
Configura automaticamente come output (nel caso di microcontrollori con I/O programmabili) i pin(0-7)
selezionati (mandando 0 in uscita) e,se gia attivi come output, ne inverte il valore (manda 1 in uscita se prima
era 0 e viceversa).
ES. high 2
‘ 1 sul pin 2
toggle 2
‘ 0 sul pin 2
toggle 2
‘ 1 sul pin 2
Pause
PAUSE millisecondi
08M,14M,20M,18A,18X,28A,28X,28X1,28X2
millisecondi è una variabile/costante (0-65535) che indica la durata del delay (max 65 sec) a 4 MHz. Il software
rimane impegnato nell’esecuzione di questa istruzione fino all’esaurimento del tempo richiesto e poi passa alla
riga successiva. Durante una pause l’unico modo di reagire è un interrupt. Quando si usano delay maggiori di 5
secondi potrebbe essere necessario eseguire un hard-reset (vedi hard-reset) per scaricare un nuovo
programma nel microcontrollore (il problema si può
ES. for b1 = 1 to 5
‘ 5 loop
evitare spezzando in più pause).
pause 60000
‘ aspetta 60 secondi
next b1
‘ delay totale di 5 min
Nap
NAP periodo
08M,14M,20M,18A,18X,28A,28X,28X1,28X2
Manda in modalità a basso consumo il microcontrollore per un breve periodo (0-7) spegnendo tutti i timer (i
comandi pwmout e servo cessano di funzionare) e riducendo il consumo. Il periodo nominale è dato dalla
tabella e ha tolleranza di -50+100% dipendente dalla temperatura.
ES. nap 4
‘nap 288ms
Periodo
Delay
10 / 2 0 0 8
0
18ms
1
32ms
2
72ms
3
144ms
4
288ms
5
576ms
6
1.152s
7
2.304s
Istruzioni PicAXE
Tabella riassuntiva
Microcontrollori
-2-
Goto
GOTO indirizzo
08M,14M,20M,18A,18X,28A,28X,28X1,28X2
Il comando goto è un salto permanente in un’altra sezione del programma (dove l’indirizzo della riga dove
goto pippo
‘ salta a pippo
saltare è indicato dall’etichetta posta all’inizio di essa). ES.
...
pippo high 1
Branch
BRANCH offset,(address0,address1...addressN)
08M,14M,20M,18A,18X,28A,28X,28X1,28X2
Manda all’indirizzo specificato dall’offset cioè fa continuare lo svolgimento del programma alla riga
contrassegnata dall’indirizzo dipendente dalla variabile offset; se il valore dell’offset è 0 salterà all’indirizzo 0,se
è 1 salterà all’indirizzo 1, ecc… se l’offset è più grande del numero di indirizzi il comando è ignorato e il
programma continua alla linea successiva. ES. reset: let b1 = 0
btn0: high 0
low 0
goto main
low 1
btn1: high 1
low 2
goto main
low 3
btn2: high 2
main: if b1 > 2 then reset
goto main
branch b1,(btn0,btn1,btn2)
Let
{LET} variable = {-} value ?? value ...
08M,14M,20M,18A,18X,28A,28X,28X1,28X2
Questo comando permette di modificare le variabili ed eseguire operazioni matematiche tra variabili/costanti.
La parola chiave ‘let’ è opzionale e i calcoli matematici sono eseguiti da sinistra verso destra (senza priorità di *
e / su + e - ). Nei calcoli si possono usare valori a 8 (0-255) e 16 bit (0-65535) e non sono supportate frazioni e
numeri negativi; comunque spesso si possono riscrivere equazioni usando interi invece che frazioni:
es.
let w1 = w2 / 5.7 non è valido ma let w1 = w2 * 10 / 57 è matematicamente uguale e valido.
Le funzioni matematiche supportate sono le seguenti:
+
;somma
;sottrazione
;
Esempio di moltiplicazione
$aabb x $ccdd = $eeffgghh
*
;moltiplicazione (da la parte bassa del risultato) $aabb * $ccdd = $gghh
**
;moltiplicazione (da la parte alta del risultato)
$aabb ** $ccdd = $eeff
/
;divisione
(da il quoziente)
//
oppure %
;divisione
(da il resto)
MAX
;limita il valore ad un valore massimo
es. let b1 = b2 * 10 MAX 40
;
se b2= 3 b1= 30, se b2= 4 b1= 40, se b2= 5 b1= 40
MIN
;limita il valore ad un valore minimo (funziona allo stesso modo di MAX)
AND
oppure &
;esegue l’AND tra I bit di due variabili/costanti
A And B
OR
oppure |
;esegue l’OR tra I bit di due variabili/costanti
A Or B
XOR
oppure ^
;esegue lo XOR tra I bit di due variabili/costanti
A Xor B
NAND
;esegue il NAND tra I bit di due variabili/costanti
Not (A And B)
NOR
;esegue il NOR tra I bit di due variabili/costanti
Not (A or B)
XNOR oppure ^/
;esegue lo XOR tra I bit di due variabili/costanti
A Not (Xor B)
ANDNOT oppure &/
;esegue l’ANDNOT tra I bit di due variabili/costanti
A And (Not B)
ORNOT oppure |/
;esegue l’ORNOT tra I bit di due variabili/costanti
A Or (Not B)
ES. let b0 = b0 + 1
‘ incrementa b0
ES. let b0 = b0 min 8 ‘ limita b0 a min 8
ES. let w1 = w2 / w1
‘ divide w2 per w1
ES. let b1 = 0
‘ azzera b1
ES. let b1 = pins & %00000110 ‘ and di pin1 e pin2 in b1
Let Dirs {LET} dirs = valore
Let Dirsc {LET} dirsc = valore
08M
08M,14M,18A,18X,28X,28X1
Questi due comandi configurano con una sola istruzione tutti gli Input/Output. Come valore si mette un valore
binario rappresentante i pin I/O (partendo dal pin0 a destra). Assegnare 1 ad un bit lo configura come output
mentre 0 lo configura come input. Nota che il PicAXE 8 e 8M ha 2 pin preconfigurati (pin0 output e pin3 input) e
non ha gli I/O 5,6,7 perciò il comando ha effetto solo nei bit 1,2,4 del valore binario assegnato
ES. let dirs = %00000110 ‘ pin 1 e 2 configurati output
Let Pins {LET} pins = valore
Let Pinsc {LET} pinsc = valore
08M,14M,18,18A,18X,28X,28X1
14M,18,18A,18X,28X,28X1
Questi due comandi servono a settare il valore di più output contemporaneamente (con la differenza che il
primo setta quelli dell’output port principale mentre il secondo quelli del portc; il port degli ingressi e quello degli
output sono separati in tutti i picaxe tranne che nell’ 8 pin. Inoltre il comando funziona solo sui pin configurati
come output. ES. let pins = %00000011 ‘ manda il pin0 e il pin1 a 1
ES. let pins = pins ‘ valore dell’input port nell’output port
10 / 2 0 0 8
Istruzioni PicAXE
Count
Tabella riassuntiva
Microcontrollori
-3-
COUNT pin, periodo, wordvariabile
08M,14M,20M,18X,28X,28X1,28X2
Conta gli impulsi (transizioni da stato basso a stato alto) applicati ad un pin (che può essere indicato da un
valore o da una variabile che vanno da 0-7) in un periodo fissato (1-65535ms a 4MHz) e ne mette il numero in
una wordvariabile (16 bit). A 4MHz il pin è controllato ogni 20us perciò la massima frequenza a cui si possono
contare impulsi è 25KHz (con DC supposto del 50%). ES. count 1, 5000, w1 ‘ conta imp in 5 sec
Do…loop
DO
08M,14M,20M,18A,18,18X,28A,28X,28X1,28X2
{code}
LOOP UNTIL/WHILE VAR ?? COND {AND/OR VAR ?? COND... }
DO UNTIL/WHILE VAR ?? COND {AND/OR VAR ?? COND... }
{code}
LOOP
Questo comando crea una struttura che permette di svolgere una serie qualsiasi di istruzioni mentre (while), o
fino a che (until), si verifica una certa condizione (cond) che può essere controllata prima di eseguirle quindi
nella linea del ‘Do’ (2° caso) o dopo, nella linea del ‘Loop’ (1° caso). Si possono anche porre più condizioni allo
stesso momento congiungendole con ‘AND’ (si devono verificare tutte quante) o con ‘OR’ (si deve verificare
almeno una delle condizioni). Per uscire prematuramente dal loop si può usare l’istruzione ’exit’.
Le condizioni che si possono usare sono:
ES. do
= oppure is
(uguale a)
high 1
!= oppure <>
(diverso da)
inc b1
<
(minore)
pause 1000
>
(maggiore)
loop while b1 < 5
‘ esci se b1<5
<=
(minore o uguale)
>=
(maggiore o uguale)
For…next
FOR variable = start TO end {STEP {-}increment} 08M,14M,20M,18A,18,18X,28A,28X,28X1,28X2
{code}
NEXT {variable}
Questo comando è usato per ripetere una sezione di programma un numero fissato di volte (0-255). Ogni volta
che il programma esegue la riga ‘next’ la variabile viene incrementata di +1 (di default il valore è +1 ma
inserendo un valore dopo lo step si può aumentare il passo o anche sottrarre se si mette il segno - )
ES. for b0 = 1 to 20 ‘ definisci loop di 20 volte
if pin1 = 1 then exit ‘ esci se pin1 al livello alto
high 1
pause 500
next b0 ‘ fine loop
ES. for b0 = 120 to 1 step -1 ‘ conta all’indietro
Exit
EXIT
08M,14M,20M,18A,18X,28A,28X,28X1,28X2
È un comando usato per uscire immediatamente da un do…loop o da un for…next e continuare lo svolgimento
del programma dalla prima linea dopo la fine del loop.
ES. do ‘ inizio loop
if b1 = 1 then exit ‘ esci
end if
loop ‘ loop
Gosub
GOSUB indirizzo
08M,14M,20M,18A,18X,28A,28X,28X1,28X2
Questo comando manda il programma ad eseguire un sottoprogramma che inizia alla riga dell’indirizzo
specificato nell’etichetta e, dopo aver eseguito le istruzioni del sottoprogramma, ritorna, per mezzo
dell’istruzione ‘return’ alla riga successiva a questa istruzione. Il comando è usato per dare più ordine al
programma (spezzandolo così in vari blocchi) o, più spesso, per scrivere una sola volta una parte di programma
che viene poi chiamata più volte; questo comando è quindi un salto ‘temporaneo’ in una sezione separata del
programma al contrario del ‘goto’ che è invece un salto permanente. In tabella sono riportate il numero massimo
di ‘gosub’ usabili in un programma da ogni microcontrollore. Si possono anche fare gosub all’interno di altre
‘gosub’ ma solo fino a 4/8 livelli di profondità (vedi tabella) perché altrimenti non si riuscirebbe più a tornare
indietro (l’area stack dove viene messo in memoria l’indirizzo a cui ritornare verrebbe sovrascritta).
Microcontrollori
Gosub
Interrupts
Stack
PICAXE 08 - 18
16
0
4
PICAXE 08M - 14M - 20M - 18A - 28A
15
1
4
PICAXE 18X - 28X - 40X
255
1
4
ES. main:
flsh:
let b2 = 15 ‘ setta valore b2
for b0 = 1 to b2 ‘ loop di b2 volte
gosub flsh ‘ chiama sottoprog
toggle 1
‘ inverti valore uscita
let b2 = 5 ‘ setta valore b2
pause 500 ‘ aspetta 0.5 secondi
gosub flsh ‘ chiama sottoprog
next b0
‘ fine loop
goto main
‘ ritorna all’inizio
return
‘ ritorna dal sottoprog
10/2008
Istruzioni PicAXE
Tabella riassuntiva
If...then\elseif...then\else\endif
Microcontrollori
-4-
08M,14M,20M,18A,18,18X,28A,28X,28X1,28X2
IF variabile ?? valore {AND/OR variabile ?? valore ...} THEN
{code}
ELSEIF variabile ?? valore {AND/OR variabile ?? valore ...} THEN
{code}
ELSE
{code}
ENDIF
Il comando letteralmente significa ‘se…allora’ ed è usato per eseguire una sezione di programma quando una
condizione (come per il ‘’do…loop’ le condizioni testabili, sulla variabile, sono: =, !=, <, >, <=, >= ) è verificata
(comando if…then). Se la prima condizione non è verificata allora si può testare, se occorre, una seconda
opzione (elseif…then) ed eseguire un’altra sezione di programma; nel caso nessuna condizione sia verificata si
può eseguire un’altra sezione di programma. Quando si testano condizioni su pin di ingresso si scrive ‘if pin1 =
1 then…’ invece di ‘if 1 = 1 then…’
if b0 > 1 then
ES. if pin1 =1 or pin2 =1 then gosub etichetta
ES.
high 1
else
low 1
endif
Questo comando si può anche abbinare ad altri comandi quali ‘goto’, ‘exit’ e ‘gosub’ a creare strutture più
complesse.
IF…AND/OR...THEN {goto} indirizzo
Esempio di salto con condizione (la parola goto si può omettere):
main:
if pin0 = 1 then flsh ‘ salta a flsh se il pin0 è a 1
goto main ‘ torna all inizio
flsh: toggle 1 ‘ cambia stato all’output1
pause 5000 ‘ delay 5 secondi
goto main ‘ torna all inizio
Esempio di condizione per uscire:
IF…AND/OR...THEN exit
do
if pin0 = 1 and pin2 = 1 then exit ‘ esci dal loop se pin0 e pin2 sono a 1
loop
Esempio di condizione per chiamare un sottoprogramma:
IF…AND/OR...THEN GOSUB indirizzo
main:
if pin0 = 1 then gosub flsh ‘ chiama il sottoprg flsh se il pin0 è a 1
goto main ‘ torna all inizio
flsh: toggle 1 ‘ cambia stato all’output1
pause 5000 ‘ delay 5 secondi
return
Return
RETURN
08M,14M,20M,18A,18X,28A,28X,28X1,28X2
Questo comando è usato al solo scopo di uscire da un sottoprogramma e va quindi sempre e obbligatoriamente
posto solo alla fine delle istruzioni di ogni sottoprogramma (o di un interrupt).
ES.
...
gosub camb ‘ chiamata
...
camb:toggle 2
return
‘ ritorno
Pulsin
PULSIN pin,stato,wordvariabile
08M,14M,20M,18A,18X,28A,28X,28X1,28X2
Permette di misurare la lunghezza di un impulso applicato ad un pin (che può essere indicato da un valore o da
una variabile che vanno da 0-7) e metterne il valore in una wordvariabile (1-65535). Se non ci sono impulsi il
valore misurato è 0. Stato vale 1 se il conteggio deve partire da un fronte di salita o 0 se il conteggio deve
partire da un fronte di discesa. L’unità di misura è 10us a 4 MHz quindi si possono contare impulsi che vanno da
10us a 655350us. ES. pulsin 3,1,w1 ‘ lunghezza di un imp applicato al pin 3 in w1
Pulsout
PULSOUT pin, durata
08M,14M,20M,18A,18X,28A,28X,28X1,28X2
Manda in uscita un impulso su un pin (che può essere indicato da un valore o da una variabile che vanno da
0-7) di durata (0-65535) espressa in decine di us (quindi scrivere 12 equivale ad un impulso di 120us). Questo
comando configura automaticamente il pin come output.
ES. pulsout 1,150
‘ genera un impulso di 1.5 ms dal pin 1
10/2008
Istruzioni PicAXE
Setint
Tabella riassuntiva
Microcontrollori
-5-
SETINT input,mask
08M,14M,20M,18A,18X,28A,28X,28X1,28X2
SETINT OFF
Questo comando causa un ‘polled’ interrupt cioè un controllo continuo (tra una istruzione e l’altra e
continuamente durante un ‘pause’) delle condizioni dell’input port che possono far verificare l’interrupt. Quando
una di queste si verifica il programma smette di eseguire ciò che stava facendo e va a svolgere le istruzioni
presenti all’indirizzo indicato dall’etichetta ‘interrupt’ (come se fosse una ‘gosub’). Per settare l’interrupt si
devono assegnare due valori binari: quello di input e quello di mask (variabili o costanti da 0 a 255); in mask si
definiscono i pin che scatenano l’interrupt assegnando 1 e mettendo 0 a quelli che non devono essere
controllati mentre in input si sceglie lo stato che devono assumere per scatenare l’interrupt (1 se alto o 0 se
basso). L’interrupt avverrà solo quando si verificherà quella particolare condizione degli ingressi. Gli input 3,4
del picaxe 14M e gli input 0,6,7 del 20M sono ignorati dall’interrupt a causa di condizioni interne quindi si
possono usare solo 0,1 e 2 (14M) e 1-5 (20M). È possibile un solo interrupt per ogni programma. Per
disabilitare l’interrupt basta eseguire un ‘setint off ’. quando si scatena un interrupt viene disabilitato
automaticamente ogni nuovo interrupt perciò se si vuole l’interrupt ancora attivo lo si deve riabilitare attraverso
un nuovo ‘setint’ (se viene riabilitato e la condizione è ancora attiva può generarsi un nuovo interrupt all’interno
del primo perciò è consigliato mettere questo ‘setint’ prima del return o meglio, se possibile, in una parte del
programma che viene sempre sicuramente eseguita). Quando l’esecuzione dell’interrupt è terminata il
programma torna a svolgere ciò da cui era stato interrotto e in caso di interruzione di una ‘pause’ ogni delay
rimanente viene ignorato
ES. setint %10000000,%10000000
‘ attiva interrupt quando il pin7 è a 1
main:
low 1
‘ 0 in output 1
pause 2000
‘ delay 2 secondi
goto main
‘ torna all inizio
interrupt:
high 1
‘ 1 in output 1
if pin7 = 1 then interrupt
‘ loop qui fino a che la condizione cessa
pause 2000
‘ delay 2 secondi
setint %10000000,%10000000
‘ riattiva interrupt
return
‘ ritorna dall’interrupt
Readadc
Readadc10
READADC canale,variabile
08M,14M,20M,18A,18X,28A,28X,28X1,28X2
READADC canale,variabile
08M,14M,20M,18X,28X,28X1,28X2
Il comando ‘readadc’ legge il valore analogico applicato ad un canale ADC (specificato da una variabile o da
una costante da 0-7) e lo converte in 8 bit che mette in una variabile (0-255) a differenza del ‘readadc10’ che ha
una risoluzione di 10 bit e mette il valore in una wordvariabile (0-65535). La tabella mostra quali input sono
utilizzabili come adc.
Quantità
Risoluzione
Tipo pin
Canali ADC
PICAXE 08M
3
8-10 bit
an / dig
1,2,4
PICAXE 14M
2(5)
8-10 bit
an / dig
0,4(1,2,3)
PICAXE 20M
4
8-10 bit
an / dig
1,2,3,7
PICAXE 18A
3
8 bit
an / dig
0,1,2
PICAXE 18X
3
8-10 bit
an / dig
0,1,2
PICAXE 28A
4
8 bit
an
1,2,3,4
PICAXE 28X,28X1
4
8-10 bit
an
1,2,4
ES.
readadc 1,b1
‘ leggi valore da ADC pin 1 e metti in b1
Peek
Poke
PEEK locazione,variabile,WORD wordvariabile... 08M,14M,20M,18A,18X,28A,28X,28X1,28X2
POKE locazione, variabile,WORD wordvariabile... 08M,14M,20M,18A,18X,28A,28X,28X1,28X2
Questi comandi permettono di utilizzare i registri di memorizzazione temporanea per salvare il valore di una
variabile (o di una wordvaribile). Questo permette di riutilizzare le variabili b0-b13 nei calcoli matematici. Il
comando ‘peek’ legge il dato dal registro del microcontrollore e lo scrive su una variabile (o wordvariabile)
mentre il comando ‘poke’ scrive il valore di un variabile (o di una wordvariabile); ‘peek’ è seguito dalla locazione
cioè dalla costante (o variabile) che indica l’indirizzo del byte di memoria da cui si legge il valore e dalla variabile
in cui lo si trascrive; ‘poke’ è seguito dalla locazione in cui si scrive il valore e dalla variabile da cui si copia il
valore. Quando si usa una wordvariabile si deve mettere la parola word dopo la locazione e il valore è salvato o
trascritto così: byte basso all’indirizzo e byte alto all’indirizzo+1. Le locazioni usabili liberamente da tutti i chip
picaxe sono 48: da 80 a 127 ($50 a $7F). ES. peek 80,b1 ‘ metti il valore del reg 80 in b1
peek 80, word w1
poke 80,b1 ‘ salva il valore di b1 nel reg 80
poke 80, word w1
Readoutputs
READOUTPUTS variabile
08M,14M,20M,18A,18X,28A,28X,28X1,28X2
Il comando legge il valore che hanno assunto in questo momento i pin degli output e lo mette in una variabile. Questo
comando indica quindi lo stato attuale delle uscite.
ES. readoutputs b1 ‘ leggi il valore degli output e mettilo in b1
10/2008
Istruzioni PicAXE
Tabella riassuntiva
Microcontrollori
-6-
Sleep
SLEEP periodo
08M,14M,20M,18A,18X,28A,28X,28X1,28X2
Manda il microcontrollore nel low power mode (modo a basso consumo) per un periodo di tempo (1-65535)
espresso in multipli di 2.3s (con tolleranze di -50+100%). Durante uno ‘sleep’ spenti tutti i timer perciò ‘pwmout’
e ‘servo’ cessano di funzionare. ES. sleep 10 ‘ sleep 23 sec
ES. sleep 100 ‘ sleep 230 sec
Pwm
PWM pin,duty,cicli
08M
È usato per creare un temporaneo valore pseudo-analogico (specificato da ‘duty’ che va da 0 a 255) e ripetuto
0-255 cicli, ognuno di durata circa 5ms, dai pin 1,2,4 (che possono essere indicati da un valore o una variabile)
collegando tra esso e massa un ramo RC a prelevando il segnale tra il condensatore e la resistenza. Per
pilotare motori è meglio usare il ‘pwmout’. ES. pwm 4,150,20 ‘ manda 20 cicli pwm dal pin 4
Pwmout
PWMOUT pin,periodo,duty cycle
08M,14M,18X,28X,28X1,28X2
PWMOUT pin, OFF
08M,14M,18X,28X,28X1,28X2
È usato per generare di continuo un segnale PWM da un pin (pin2 di 08M e 14M, pin3 di 18X e pin1 o pin2 di
28X,28X1,28X2) usando il modulo PWM interno del pic. Dopo il pin si assegna il periodo del segnale in uscita
(0-255) e il duty cycle (0-1023) dividendo quindi il periodo in 1024
parti dove il DC rappresenta per quanto tempo (es. DC = 50%
corrisponde a 513) deve stare a 1 durante il periodo. Per far
questo c’è un tool del programming editor (PICAXE / wizards /
pwmout…) che calcola il comando inserendo DC e frequenza
(freq=1/periodo PWM). Il periodo della PWM in uscita vale:
periodo PWM = (periodo + 1) x 4 x velocità risonatore
» velocità risonatore per 4MHz = 1/4000000 => periodo PWM = (periodo+1) usec. (periodo PWM va da 1 a 256us)
Una volta eseguito, questo comando funziona continuamente (in background) e si può interrompere con un
periodo di 0 o un ‘pwmout pin off ’. Note: il DC deve sempre essere al massimo 4x periodo; il comando non può
essere usato contemporaneamente a ‘servo’ in quanto usa lo stesso timer e cessa di funzionare durante un
‘nap’ , ‘sleep’ o ‘stop’. Inoltre ‘pwmout 2’ non può essere usato contemporaneamente al comando ‘hpwm’.
ES. pwmout 2,199,640 ‘ pwm 5kHz e DC 80%
ES. pwmout 2,199,480 ‘ pwm 5kHz e DC 60%
Serin
SERIN pin,baudmode,(qual,qual...),{#}variabile,{#}variabile… 08M,14M,20M,18A,18X,28A,28X,28X1,28X2
È usato per ricevere un dato in modo seriale ( 8 data, no parità, 1 stop) tramite un pin del microcontrollore
(specificato da una variabile o costante da 0-7) e metterlo in una variabile (0-255). Il simbolo opzionale #
specifica che il dato ricevuto è un simbolo ascii piuttosto che un valore (quindi se, ad esempio, si riceve 126
viene interpretato come “1” ”2” ”6”). Il baudmode setta la polarità e la velocità di trasmissione del segnale: a 4
MHz è 300,600,1200,2400,4800 baud (in ordine di velocità crescente) ;davanti a questo numero c’è una T
(quando pin a 1 se non c’è trasmissione) o una N (pin a 0 se non c’è trasmissione). A 8 MHz raddoppia la
velocità da 300 a 600,… ecc (ma solo le versioni X1 e X2 supportano la 4800 a 4MHz e la 9600 a 8MHz). Le
qualifiche (qual) sono variabili/costanti opzionali che devono essere ricevute in esatto ordine prima di ricevere e
salvare il byte seguente (quindi servono solo come ulteriore conferma della corretta trasmissione). Per una
comunicazione seriale tra 2 picaxe si possono interfacciare tra loro connettendo i pin trasmittente del 1º col
ricevente del 2º (e viceversa); tra PC e picaxe invece si deve usare uno dei 2 circuiti proposti nella sezione ‘note
tecniche’. L’interrupt non funziona durante lo svolgimento di questa istruzione.
ES. serin 1,N2400,b1 ‘ salva dato in b1
ES. serin 1,N2400,(“ABC”),b1 ‘aspetta fino a quando riceve ABC e salva dato in b1
ES. serin 1,N2400,(“go”) ‘ aspetta fino a quando riceve go
Serout
SEROUT pin,baudmode,({#}dato,{#}dato...)
08M,14M,20M,18A,18X,28A,28X,28X1,28X2
Viene usato per inviare un dato in modo seriale ( 8 data, no parità, 1 stop) tramite un pin del microcontrollore
(specificato da una variabile o costante da 0-7); il dato inviato è una costante o variabile (0-255). Il simbolo
opzionale # specifica che il dato ricevuto è un simbolo ascii piuttosto che un valore (quindi se, ad esempio, si
riceve 126 viene interpretato come “1” ”2” ”6”). Il baudmode setta la polarità e la velocità di trasmissione del
segnale: a 4 MHz è 300,600,1200,2400,4800 baud (in ordine di velocità crescente) ;davanti a questo numero
c’è una T (quando pin a 1 se non c’è trasmissione) o una N (pin a 0 se non c’è trasmissione). A 8 MHz
raddoppia la velocità da 300 a 600,… ecc ( ma solo le versioni X1 e X2 supportano la 4800 a 4MHz e la 9600 a
8MHz). Se si vuole trasmettere tra 2 picaxe si possono interfacciare tra loro connettendo i pin trasmittente del 1º
col ricevente del 2º (e viceversa); se si vuole una comunicazione PC-picaxe si deve usare uno dei 2 circuiti
proposti nella sezione ‘note tecniche’; tra pic e pic usare protocollo N (o T). Il ‘serout’ non può essere usato sul
pin di download dove invece va usato il ‘sertxd’. ES. serout 7,N2400,(b1) ‘ trasm valore di b1
Sertxd
SERTXD ({#}dato,{#}dato...)
08M,14M,20M,18A,18X,28A,28X,28X1,28X2
È simile al ‘serout’ ma è usato per inviare un dato in modo seriale ( 8 data, no parità, 1 stop) dal pin di download
del microcontrollore a velocità fissa di 4800 baud (incrementabile a 9600 a 16MHz); il dato inviato è una
costante o variabile (0-255). Questo comando è usato principalmente per comunicare col PC tramite il cavo di
programmazione (anche per scopo di debug aprendo il programming editor PICAXE / terminal window).
ES. sertxd (“Il valore di b1 è ”,#b1)
‘ trasm il valore di b1 e il messaggio
10/2008
Istruzioni PicAXE
Tabella riassuntiva
Microcontrollori
-7-
Random
RANDOM wordvariabile
08M,14M,20M,18A,18X,28A,28X,28X1,28X2
È usato per generare un valore pseudo-casuale (in realtà il valore è ottenuto attraverso calcoli matematici del
microcontrollore) in una wordvariabile (0-65535). Il comando funziona correttamente solo su una wordvariabile
che, oltre ad contenere il risultato, è anche lo ‘spazio di lavoro’. Per ottenere una maggiore casualità è
consigliato ripetere il comando periodicamente variandone, se possibile, il valore. ES. random w0
Servo
SERVO pin,impulso
08M,14M,20M,18A,18X,28A,28X,28X1,28X2
È usato per settare un pin (specificato da una variabile o costante da 0-7) in modo da generare continuamente
un impulso di durata da 0.75 a 2.25ms (specificata da una variabile o una costante) adatto a pilotare un servo. Il
comando ‘servo’ fa iniziare la generazione di impulsi positivi di durata valore impulso x 0.01 ogni 20ms e
continua l’esecuzione in background fino a che non viene eseguito ‘high’ o ‘low’ su quel pin oppure un ‘servo
off’. il comando ‘servo’ inizializza il pin per le operazioni del servo e fa partire il timer per gli impulsi (che è lo
stesso del ‘pwmout’ e non può quindi essere usato contemporaneamente a quel comando); viene anche
temporaneamente disabilitato durante i comandi ‘serin’,’serout’,’sertxd’e ‘debug’. Per variare la posizione del
servo usare il comando ‘servopos’. ES. servo 4,75 ‘ inizializza servo
Servopos SERVOPOS pin,impulso
08M,14M,20M,18A,18X,28A,28X,28X1,28X2
Viene usato per variare la posizione di un servo tramite un pin (specificato da una variabile o costante da 0-7)
che è gia stato precedentemente inizializzato (basta una sola inizializzazione) in modo da generare
continuamente un impulso di durata da 0.75 a 2.25ms (specificata da una variabile o una costante) adatto a
pilotare un servo; approssimativamente di solito 0.75 corrisponde ad un estremo, 1.5 alla posizione centrale e
2.25 all’altro estremo, posizioni intermedie sono tutti gli altri valori compresi in questo intervallo. L’esecuzione di
questo comando (come anche il ‘servo’) può anche causare un allungamento di altri comandi ( ad es. un ‘pause’
può durare più di quanto previsto) e viene temporaneamente disabilitato durante l’esecuzione dei comandi
‘serin’,’serout’,’sertxd’ e ‘debug’. ES. servopos 4,75 ‘ muovi servo ad un estremo
Lookup
LOOKUP offset,(dato0,dato1...datoN),variabile
08M,14M,20M,18A,18X,28A,28X,28X1,28X2
È usato per ricercare il dato (contenuto della variabile indicata o costante, anche ascii, da 0 a N dove al
massimo N può essere 255) indicato dall’offset e memorizzarlo in una variabile. Se l’offset (che è rappresentato
dal valore di una variabile) vale 0 verrà caricato il valore del dato0 nella variabile che riceve il risultato, se vale 1
verrà caricato il dato1 e così via. Se l’offset è maggiore del numero di valori caricabili la variabile resta invariata.
ES. lookup b0,(6,54,82,1),b1
ES. lookup b0,(“abcd”),b1 ES. lookup b0,(b2,b3,b4),b1
Lookdown
LOOKDOWN target,(dato0,dato1...datoN),variabile
08M,14M,20M,18A,18X,28A,28X,28X1,28X2
È usato quando si deve confrontare una variabile, detta target, con una lista prefissata di valori (cioè dei valori
ascii, delle costanti o dei valori di variabili) e quando un valore è uguale al target caricare il valore della
posizione nella variabile. Quindi se il target (che è rappresentato dal valore di una variabile) è uguale al dato0
verrà caricato il valore 0 nella variabile che riceve il risultato, se è uguale al dato1 verrà caricato 1 e così via. Se
il target è maggiore del numero di valori caricabili la variabile resta invariata.
ES. lookdown b0,(6,54,82,1),b1
ES. lookdown b0,(“abcd”),b1
End
END
08M,14M,20M,18,18A,18X,28A,28X,28X1,28X2
È usato per non far cadere accidentalmente l’esecuzione del programma in un sottoprogramma nel caso che
non termini in un loop. In pratica separa il programma principale dai sottoprogrammi; è usato raramente in
quanto il compiler pone sempre questa istruzione dopo l ‘ultima riga di programma. Quando eseguita, questa
istruzione, pone in modalità a basso consumo il microcontrollore spegnendo tutti i timer (disattiva anche ‘servo’
e ‘pwmout’) e attendendo così fino ad un nuovo download. ES. main:
...
end
sottoprg:...
Symbol
SYMBOL
08M,14M,20M,18,18A,18X,28A,28X,28X1,28X2
Tramite l’istruzione ‘symbol’ è possibile dare un nome diverso, scelto dall’utente, ad una variabile o ad una
costante ad esempio per ricordarne la funzione all’interno del programma. Come le etichette i nomi dati
possono essere qualsiasi parola che non sia una parola chiave già usata dal linguaggio di programmazione e
possono contenere cifre ma devono iniziare sempre con una lettera. L’uso di questa istruzione non incrementa
la lunghezza del programma.
ES. symbol LED_BLU = 3 ‘ output3 = led blu
ES. symbol DELAY = b0 ‘ delay = b0
Stop
STOP
08M,14M,20M,18,18A,18X,28A,28X,28X1,28X2
È usato per far entrare il programma in un loop permanente fino ad un nuovo download e, al contrario di ‘stop’,
non spegne i timer interni permettendo quindi il funzionamento di ‘servo’ e ‘pwmout’.
ES.
main:
pwmout 1,120,400 ‘ lancia la pwm
stop
‘ ferma il microcontrollore lasciando attiva la pwm
10/2008