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