Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
TUTORIAL
®
PIC MICROCONTROLLER
BY EXAMPLE
quarta parte
di Tiziano Galizia (t.galizia@farelettronica.com)
e Sergio Tanzilli (s.tanzilli@farelettronica.com)
26 TUTORIAL
GALIZIA-impaginato224 9-02-2004 12:32 Pagina 27
TUTORIAL
all'inizio del nostro sorgente, se in- nessuno, lavorando sulle sole diret- tica la #DEFINE consente di definire
vece vogliamo escluderlo dovremo tive #DEFINE all'inizio del sorgente. delle porzioni di testo da associare
togliere la diretta #DEFINE INSERI- ad una unica parola.
SCI_TEST cancellandola o commen- Esiste anche la direttiva IFNDEF che
tandola (mettendoci davanti un include il codice se "non" è stata in- Vediamo un esempio:
punto e virgola). serita una #DEFINE e la direttiva
Nessuno ci vieta, ovviamente, di re- ELSE che si comporta come la IFN- #DEFINE ON_LED1 bcf PORTA,0
plicare le direttive IFDEF in più DEF ma indica l'alternativa ad una
punti all'interno del sorgente in IFDEF, come riportato nell'esempio Con questa linea diciamo all'assem-
modo da includere o escludere più seguente. blatore di sostituire in fase di com-
porzioni di codice con un unico co- pilazione ogni occorrenza della pa-
mando. #DEFINE INSERISCI_TEST rola ON_LED1 con il testo riportato
;Parte iniziale della sulla destra. In questo modo pos-
È ovviamente possibile definire an- ; nostra applicazione siamo quindi definire delle frasi che
che diversi tipi di esclusione inse- ... una volta inserite nel nostro sor-
rendo più #define all'inizio del sor- ;La linea seguente e' gente lo rendono più leggibile.
gente, come riportato di seguito. ; stata inserita solo per
; testare l'applicazione. #DEFINE ON_VERDE bsf PORTA,0
#DEFINE INSERISCI_TEST1 ; Deve essere eliminata #DEFINE OFF_VERDE bcf PORTA,0
#DEFINE INSERISCI_TEST2 ; nella versione
;Parte iniziale della ; definitiva #DEFINE ON_ROSSO bsf PORTA,1
; nostra applicazione #DEFINE OFF_ROSSO bcf PORTA,1
... IFDEF INSERISCI_TEST
;Accende il led verde
IFDEF INSERISCI_TEST1 ;Inizio delle istruzioni ON_VERDE
;Inizio delle istruzioni ; di test, da eliminare
; di test, da eliminare ; nella versione ;Ora accende il led rosso
; nella versione ; definitiva ON_ROSSO
; definitiva bsf PORTA,0
bsf PORTA,0 ;Fine delle istruzioni di ;Ora spegne entrambe i led
;Fine delle istruzioni di ; test OFF_ROSSO
; test ELSE OFF_VERDE
ENDIF bcf PORTA,0
;Continua con il resto ENDIF LA DIRETTIVA MACRO
; dell’applicazione ;Continua con il resto La direttiva MACRO è ancora più in-
... ; dell’applicazione teressante della #DEFINE per inven-
... tare nuove istruzioni.
IFDEF INSERISCI_TEST2 Come la #DEFINE lavora sempre
;Inizio delle istruzioni In questo caso se all'inizio del sor- sulla sostituzione di testo in fase di
; di test, da eliminare gente c'è una #DEFINE compilazione, ma consente di sosti-
; nella versione INSERISCI_TEST viene compilata la tuire ad una parola (il nome della
; definitiva linea bsf PORTA,0 se invece la diret- macro) un insieme di istruzioni e di
bcf PORTA,0 tiva non c'è viene compilata la linea definire anche i parametri della
;Fine delle istruzioni di bcf PORTA,0. nuova funzione.
; test Vediamo un esempio: ipotizziamo
ENDIF LA DIRETTIVA #DEFINE di dover mettere a zero le linee
;Continua con il resto Vediamo ora in dettaglio cosa fa RB0, RB1 ed RB2 in diversi punti del
; dell’applicazione esattamente la direttiva #DEFINE. nostro programma.
... Per chi conosce il linguaggio C di- Ogni volta che è necessario com-
ciamo subito che la direttiva #DE- piere questa operazione dovremo
In questo caso possiamo escludere FINE si comporta esattamente scrivere le seguenti istruzioni all'in-
solo uno dei due test, entrambi o come nel C standard ANSI. In pra- terno del nostro sorgente:
TUTORIAL 27
GALIZIA-impaginato224 9-02-2004 12:33 Pagina 28
TUTORIAL
28 TUTORIAL
GALIZIA-impaginato224 9-02-2004 12:33 Pagina 29
TUTORIAL
TUTORIAL 29
GALIZIA-impaginato224 9-02-2004 12:33 Pagina 30
TUTORIAL
30 TUTORIAL
GALIZIA-impaginato224 9-02-2004 12:33 Pagina 31
TUTORIAL
TUTORIAL 31
GALIZIA-impaginato224 9-02-2004 12:33 Pagina 32
TUTORIAL
32 TUTORIAL
GALIZIA-impaginato224 9-02-2004 12:33 Pagina 33
TUTORIAL
funzioni specifiche, solitamente non glia l'uso. Questa istruzione non influenza
viene inserito direttamente l'indiriz- In alternativa è consigliabile usare le alcun bit di stato.
zo ma il relativo nome simbolico seguenti istruzioni.
definito nel file P16F84.INC. RETLW K
Il codice diventa quindi il seguente: org 00H Questa istruzione ritorna il controllo
da una subroutine al programma
movlw 10H start principale.
;Scrive nel registro W bsf STATUS,RP0 A differenza dell'istruzione RETURN
; il valore 10H ;Attiva il banco registri 1 essa consente di passare, tramite
movwf TMR0 movlw 01000100B l'accumulatore W, il valore costante
;E lo memorizza nel movwf OPTION_REG k al programma principale.
; registro TMR0 ...
Esempio:
L'esecuzione della MOVWF non In pratica si consiglia di scrivere diret-
influenza nessun bit di stato. tamente nel registro OPTION presen- rtc equ 0CH
te nel banco 1 dei registri del PIC uti- org 00H
NOP lizzando la MOVWF, anziché l'istru- call mySub1
Questa istruzione non esegue nessu- zione OPTION che in futuro potreb- movwf rtc
na operazione ma è utile per inseri- be non essere più implementata. ...
re ritardi pari ad un ciclo macchina. Questa istruzione non influenza nes- mySub1
sun bit di stato. nop
Esempio: retlw 10
RETFIE
Utilizzando un quarzo da 4 MHz Questa istruzione deve essere inseri- Una volta eseguito questo program-
potremo ottenere un ritardo pari ad ta al termine di ogni subroutine di ma memorizza nel registro rtc il
1µs per ogni istruzione NOP inserita gestione degli interrupt per ridare il valore 10 passato dalla subroutine
nel nostro sorgente. controllo al programma principale. mySub1.
Questa istruzione non influenza
nop Esempio: alcun bit di stato.
;Esegue un ritardo pari
; ad 1µs org 00H RETURN
;Loop infinito Questa istruzione deve essere inseri-
La NOP non influenza nessun bit di loop ta al termine di ogni subroutine per
stato. goto loop riprendere l'esecuzione del pro-
gramma principale.
OPTION org 04H
Questa istruzione memorizza nel ;Interrupt vector Esempio:
registro speciale OPTION il valore intHandler
contenuto nell'accumulatore W. ... org 00H
retfie
Esempio: ;Ritorna dall'interrupt call mySub1
...
org 00H In questo sorgente il programma
principale esegue un loop infinito. mySub1
start Se abilitiamo uno degli interrupt del nop
movlw 01000100B 16F84, non appena esso si verifiche- return
option rà il controllo verrà dato automati-
... camente al programma allocato dal- Nel PIC16F84 possono essere anni-
l'indirizzo 04H (nell'esempio date fino ad 8 chiamate a subrouti-
Questa istruzione esiste per mante- intHandler), l'istruzione RETFIE ne del tipo:
nere la compatibilità con i PIC pro- determinerà quindi il ritorno al loop
dotti finora, la Microchip ne sconsi- principale. org 00H
TUTORIAL 33
GALIZIA-impaginato224 9-02-2004 12:33 Pagina 34
TUTORIAL
Esempio: C D7 D6 D5 D4 D3 D2 D1 D0
org 00H Figura 1: Rotazione dei bit contenuti nel registro all'indirizzo f verso sinistra
;Azzera il CARRY
clrf C,STATUS
;Valore iniziale
movlw 01010101B
movwf parm1
rlf parm1,F
Al termine del programma il registro Figura 2: Rotazione dei bit contenuti nel registro all'indirizzo f verso destra
parm1 varrà 10101010B mentre il
34 TUTORIAL
GALIZIA-impaginato224 9-02-2004 12:33 Pagina 35
TUTORIAL
Programmatori PIC
Display LCD/VFD
ICD Debugger
Noritake Cristallfontz
Programmatori Willem
originali olandesi
Gruppi di continuità
da 500 VA fino a 160 KVA
WWW.PARSICITALIA.IT
Via Rovereto, 13 - 48020 Savio (RA) - Tel 0544.927468 - Fax 178.6040078 - Email: parsicitalia@libero.it
TUTORIAL 35
GALIZIA-impaginato224 9-02-2004 12:33 Pagina 36
TUTORIAL
bit meno significativi (D3-D0) dello Questa istruzione non influenza nes- in due forme a seconda di dove
stesso. Il risultato viene memorizza- sun bit di stato. vogliamo mettere il risultato, ovvero:
to nell'accumulatore W o nello stes-
so registro f in base al valore di d. XORLW K xorwf COUNTER,F
Per d = W il risultato viene memoriz- Effettua l'OR esclusivo tra il valore ;COUNTER=COUNTER XOR W
zato nel registro W. contenuto nell'accumulatore W ed il
Per d = F il risultato viene memorizza- valore costante k. In alternativa:
to nello stesso registro F.
Questa istruzione non influenza alcun Esempio: xorwf COUNTER,W
bit di stato. ;W=COUNTER XOR W
org 00H
TRIS F L'OR esclusivo (XOR) è un'operazione
Questa istruzione memorizza in uno start tra due bit in cui il bit risultante vale 0
dei registri speciale TRIS il valore con- movlw 00000000B se i due bit sono uguali.
tenuto nell'accumulatore W. I registri xorlw 11110000B Spesso lo XOR viene utilizzato nell'as-
TRIS determinano il funzionamento in ... sembler del PIC per effettuare la com-
ingresso e uscita delle linee di I/O del parazione tra due valori in mancanza
PIC. Esiste un registro TRIS per ogni Dopo aver eseguito questo pro- di un'istruzione specifica. Ipotizziamo
porta di I/O denominato TRISA, gramma l'accumulatore W varrà di avere un valore nel registro REG1 e
TRISB, e così via. 11110000B. di voler verificare se è uguale a 57H.
Questa istruzione influenza il bit Z Le istruzioni da eseguire sono le
Esempio: del registro STATUS. seguenti:
Z vale 1 se il risultato dell'operazio-
org 00H ne vale 0. movlw 57H
;W=Valore da comparare=57H
start XORWF F,D ;Risultato W = 57H
movlw 11111111B Questa istruzione effettua l'OR
tris PORTA esclusivo (XOR) tra il valore conte- xorwf REG1,W
... nuto nell'accumulatore W ed il valo- ;W = W XOR REG1 Effettua lo
re contenuto nel registro indirizzato ; XOR con il valore in REG1
Questa istruzione esiste per mantene- dal parametro f. btfss STATUS,
re la compatibilità con i PIC prodotti Il parametro d è un flag che indica ;Salta l'istruzione
finora, la Microchip ne sconsiglia l'uso. su quale registro deve essere memo- ; seguente se il risultato
In alternativa è consigliabile usare le rizzato il risultato. ; dello XOR vale 0, ovvero
seguenti istruzioni. Per d = W il risultato viene memoriz- ; se il valore di REG1 e'
zato nel registro W. ; pari a 57H
org 00H Per d = F il risultato viene memoriz- goto diverso
zato nel registro f. ;Salta se diverso da 57H
start Questa istruzione influenza i bit Z goto uguale
;Attiva il banco registri 1 del registro STATUS che varrà 1 se il ;Salta se uguale a 57H
bsf STATUS,RP0 risultato dell'operazione è 0.
CONCLUSIONI
movlw 11111111B Esempio: Abbiamo così terminato il noiosissi-
movwf TRISA mo elenco delle istruzioni assembler
... Ipotizziamo di dover effettuare lo del PIC. Nel prossimo numero, tor-
XOR tra il registro W ed il registro neremo a lavorare su qualcosa di
In pratica si consiglia di scrivere REG1 da noi definito all'indirizzo pratico. Dopo aver realizzato dei
direttamente nei registri TRIS pre- 0CH con la direttiva: semplici esperimenti con diodi LED
senti nel banco 1 dei registri del PIC e pulsanti, vedremo come interfac-
utilizzando la MOVWF anziché l'i- REG1 EQU 0CH ciare il PIC16F84 con qualcosa di
struzione TRIS che in futuro potreb- più complesso come un display
be non essere più implementata. Possiamo utilizzare l'istruzione IORWF LCD. Alla prossima puntata.
36 TUTORIAL
GALIZIA-impaginato224 9-02-2004 12:33 Pagina 37
TUTORIAL
TUTORIAL 37