microcontrollori
A. S. 2007 2008
La programmazione dei PIC
Nicola Amoroso
namoroso@mrscuole.net
NA L3
http://www.mrscuole.net/anxapic/
1
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
NA L3
http://www.mrscuole.net/anxapic/
2
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
NA L3
http://www.mrscuole.net/anxapic/
3
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
4
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
NA L3
http://www.mrscuole.net/anxapic/
5
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
RestoreLoader
lfsr 0, buff
movlw UPPER Main
movwf t1+3
bcf STATUS, C
rrcf t1+3, F
movlw B'11110000'
iorwf t1+3, F
movlw HIGH Main
movwf t1+2
rrcf t1+2, F
movlw LOW Main
movwf t1
rrcf t1, F
MOVLF 0xEF, t1+1
lfsr 1, t1
MOVLF 0x04, count
rest_rep
movff POSTINC1, POSTINC0
decf count, F
bnz rest_rep
movlw 0xFF
movwf POSTINC0
movwf POSTINC0
movwf POSTINC0
NA L3
http://www.mrscuole.net/anxapic/
6
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Descrizione Microchip
Operazione equivalente
ADDLW k
ADDWF f,d
Add W and f
ANDLW k
ANDWF f,d
AND W with f
BCF f,b
Bit Clear f
BFS f,b
Bit Set f
BTFSC f,b
BTFSS f,b
CALL k
Subroutine Call
CLRF f
Clear f
CLRW
Clear W Register
CLRWDT
W=W+ k
d = W + f (dove d pu essere W o f)
W = W AND k
d = W AND f (dove d pu essere W o f)
f(b) = 0
f(b) = 1
f(b) = 0 ? Si, salta una istruzione
f(b) = 1 ? Si, salta una istruzione
Chiama la subroutine all'indirizzo k
f=0
W= 0
Watchdog timer = 0
NA L3
http://www.mrscuole.net/anxapic/
7
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
DECF f,d
Decrement f
d = f -1 (dove d pu essere W o f)
DECFSZ f,d
Decrement f, Skip if 0
GOTO k
Go to address
Salta all'indirizzo k
INCF f,d
Increment f
d = f +1 (dove d pu essere W o f)
INCFSZ f,d
Increment f, Skip if 0
IORLW k
W = W OR k
IORWF f,d
Inclusive OR W with f
d = f OR W (dove d pu essere W o f)
MOVLW k
Move literal to W
W=k
MOVF f,d
Move f
d = f (dove d pu essere W o f)
MOVWF f
Move W to f
f=W
NOP
No Operation
Nessuna operazione
OPTION
OPTION = W
RETIE
RETLW k
Return Literal to W
RETURN
RLF f,d
NA L3
http://www.mrscuole.net/anxapic/
8
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
RRF f,d
SLEEP
SUBLW k
SUBWF f,d
Subtract W from f
SWAPF f
Swap f
TRIS f
XORLW k
XORWF f,d
Exclusive OR W with f
NA L3
http://www.mrscuole.net/anxapic/
9
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
10
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
NA L3
http://www.mrscuole.net/anxapic/
11
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
NA L3
http://www.mrscuole.net/anxapic/
12
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
NA L3
http://www.mrscuole.net/anxapic/
13
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
14
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
NA L3
http://www.mrscuole.net/anxapic/
15
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
NA L3
http://www.mrscuole.net/anxapic/
16
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
1.
2.
Decrement delayL
3.
4.
5.
6.
4. Decrement delayH
7.
8.
9.
1 s
2 s
256 x 3 = 768 s
1 s
2 s
256 x 3 = 768 s
Considerando che i due cicli sono annidati avremo che i due registri tornano ambedue a zero dopo un tempo
pari a 768 x 768 = 589. 824 s cio quasi 500 ms.
Fine Routine Return
NA L3
http://www.mrscuole.net/anxapic/
17
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
2.
Decrement delayL
3.
4.
5.
6.
Decrement delayH
7.
8.
9.
1 s
256 x 3 = 768 s
1 s
2 s
256 x 3 = 768 s
Considerando che i due cicli sono annidati avremo che i due registri tornano ambedue a
zero dopo un tempo pari a 768 x 768 = 589. 824 s cio quasi 500 ms.
Fine Routine Return
NA L3
http://www.mrscuole.net/anxapic/
18
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Il Listato completo
;***********************************************************
;Led blinking -> ON/OFF ogni 500 ms
NA L3
Clrf ram
Clrf ram+1
;riservati
Ciclo_di_ritardo
decfsz ram,1 ;Decremento il registro ram
goto Ciclo_di_ritardo ;per 256 volte
decfsz ram+1,1 ;Decremento il registro ram +1
goto Ciclo_di_ritardo ;per 256 volte
return ;Fine soubroutine
END
http://www.mrscuole.net/anxapic/
19
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
20
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
la parola LED (nome scelto da noi) da questo punto in poi nel sorgente sar equivalente al valore 3
Nel prossimo esempio incontriamo una (label)etichetta : RAM e una direttiva: RES.
La direttiva RES indica al compilatore che intendiamo riservare un certo numero di byte o meglio di
file register all'interno dell'area dati:
ORG 20h
ram RES
Questa seconda direttiva ORG f riferimento ad un indirizzo in area programma (nella EEPROM)
anzich in area dati.
Da questo punto in poi andremo infatti ad inserire le istruzioni mnemoniche che il compilatore dovr
convertire negli opportuni opcode per il PIC.
NA L3
http://www.mrscuole.net/anxapic/
21
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Il primo opcode eseguito dal PIC dopo il reset quello memorizzato nella locazione 0, da qui il valore
00H inserito nella ORG.
bsf STATUS,RP0
I PIC hanno una CPU interna di tipo RISC per cui ogni istruzione occupa una sola locazione di memoria,
opcode e parametri inclusi. In questo caso l'istruzione mnemonica bsf sta per BIT SET FILE REGISTER
ovvero metti a uno (condizione logica alta) uno dei bit contenuti nella locazione di ram specificata.
Il parametro STATUS viene definito nel file P16F877A.INC tramite una direttiva EQU. Il valore assegnato
in questo file 03H e corrisponde ad un file register (ovvero una locazione ram nell'area dati) riservato.
Anche il parametro RP0 viene definito nel file P16F877A.INC con valore 05H e corrisponde al
numero del bit che si vuole mettere a uno. Ogni file register lungo 8 bit e la numerazione di
ciascuno parte da 0 (bit meno significativo) fino ad arrivare a 7 (bit pi significativo)
Questa istruzione in pratica mette a 1 il quinto bit del file register STATUS, necessaria per accedere ai
file register TRISA e TRISB come vedremo ora.
movlw 00011111B
Questa istruzione sta a significare: MOVE LITERAL TO W REGISTER ovvero muovi un valore costante
nell'accumulatore. L'accumulatore un particolare registro utilizzato dalla CPU in tutte quelle situazioni in
cui vengono effettuate operazioni tra due valori oppure in operazioni di spostamento tra locazioni di
memoria. In pratica un registro di appoggio utilizzato dalla CPU per memorizzare temporaneamente un
byte ogni volta che se ne presenta la necessit.
Il valore costante da memorizzare nell'accumulatore 00011111B ovvero un valore binario a 8 bit dove il bit pi a
destra rappresenta il bit 0 o bit meno significativo.
NA L3
http://www.mrscuole.net/anxapic/
22
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
il valore 00011111 viene memorizzato nel registro TRISA (come per il registro
STATUS anche TRISA definito tramite una direttiva EQU) la cui funzione
quella di definire il funzionamento di ogni linea di I/O della porta A. In
particolare ogni bit ad uno del registro TRISA determina un ingresso sulla
rispettiva linea della porta A mentre ogni 0 determina un'uscita.
NA L3
http://www.mrscuole.net/anxapic/
23
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
NA L3
http://www.mrscuole.net/anxapic/
24
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Questa istruzione simile alla bsf vista in precedenza, con la sola differenza che azzera il bit
anzich metterlo a uno. La sigla un questo caso BIT CLEAR FILE REGISTER.
Dal punto di vista funzionale questa istruzione stata inserita per consentire l'accesso ai
registri interni del banco 0 anzich ai registri interni del banco 1 di cui fanno parte TRISA e
TRISB.
N.B:=> La direttiva assembler BankSel .. Viene oggi suggerita dalla microchip per la
selezione dei registri dei rispettivi banchi di memoria; in seguito vedremo un uso appropriato
di questa direttiva.
bsf PORTB,LED
Con questa istruzione viene effettuata la prima operazione che ha qualche riscontro
all'esterno del PIC. In particolare viene acceso il led collegato alla linea RB0.
PORTB una costante definita in P16F877A.INC e consente di referenziare il file
register corrispondente alle linee di I/O della porta B mentre LED il numero della
linea da mettere a 1. All'inizio del source la costante LED stata definita pari a 0,
quindi la linea interessata sar RB0.
NA L3
http://www.mrscuole.net/anxapic/
25
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Questa linea contiene una label ovvero un riferimento simbolico ad un indirizzo di memoria. Il valore della
label, come detto in precedenza, viene calcolato in fase di compilazione in base al numero di istruzioni, alle
direttive ORG e alle altre istruzione che in qualche modo allocano spazio nella memoria del PIC. In questo
caso, se contiamo le istruzioni inserite a partire dall'ultima direttiva ORG possiamo calcolare il valore che
verr assegnato a MainLoop ovvero 09H.
In realt il valore che assumono le label non ha molta importanza in quanto il loro scopo proprio quello di
evitare di dover conoscere la posizione precisa degli opcode nella memoria del PIC permettendo comunque
di referenziare una determinata locazione di memoria.
In questo caso la label Loop viene utilizzata come punto di ingresso di un ciclo (dall'inglese Loop) di
accensione e spegnimento del led, ovvero una parte di codice che verr ripetuta ciclicamente all'infinito.
call Delay500
Questa istruzione dermina una chiamata (dall'inglese call) ad una subroutine che inizia in corrispondenza
della label Delay.
Le subroutine sono delle parti di programma specializzare ad effettuare una funzione specifica. Ogni
qualvolta necessaria quella funzione sufficiente richiamarla con una sola istruzione, anzich ripetere
ogni volta tutte le istruzioni necessarie ad effettuarla. In questo caso la subroutine inserisce un ritardo pari
al tempo di accensione e spegnimento del led.
NA L3
http://www.mrscuole.net/anxapic/
26
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Il significato di questa istruzione BIT TEST FLAG, SKIP IF CLEAR ovvero controlla lo stato di un bit all'interno di un
registro e salta l'istruzione successiva se il valore di tale bit zero. Il bit da controllare corrisponde alla linea di uscita cui
collegato il diodo led, tramite questo test potremo determinare quindi se il led acceso o spento e quindi agire di
conseguenza, ovvero se il led gia acceso lo spegneremo, se il led spento lo accenderemo.
goto Spegni
Questa istruzione un salto incondizionato (dall'inglese GO TO, vai a)alla label SetToZero dove troveremo le istruzioni per
spegnere il led. Questa istruzione verr saltata dall'istruzione successiva se il led gia spento.
bsf PORTB,LED
goto Loop
Queste due istruzioni semplicemente accendono il led e rimandano il programma all'ingresso del ciclo di lampeggiamento.
Spegni
bcf PORTB,LED
goto Loop
Queste istruzioni semplicemente spengono il led e rimandano il programma all'ingresso del ciclo di lampeggiamento.
NA L3
http://www.mrscuole.net/anxapic/
27
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Come descritto in precedenza questa subroutine inserisce un ritardo di circa un secondo e pu essere
chiamata pi volte nel source tramite l'istruzione call Delay.
La soubroutine di ritardo
Delay500
clrf ram
clrf ram+1
Ciclo_di_ritardo
decfsz ram,1
goto Ciclo_di_ritardo
decfsz ram+1,1
goto Ciclo_di_ritardo
return
END
Questo tipo di ritardo si chiama ritardo software o ritardo a programma. E' il tipo di ritardo pi semplice da
implementare e pu essere utilizzato quando non richiesto che il PIC esegua altri compiti mentre esegue
il ritardo.
NA L3
http://www.mrscuole.net/anxapic/
28
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
La soubroutine di ritardo
Delay500
clrf ram
clrf ram+1
Ciclo_di_ritardo
decfsz ram,1
goto Ciclo_di_ritardo
decfsz ram+1,1
goto Ciclo_di_ritardo
return
END
Clrf ram
clrf ram +1
CLEAR FILE REGISTER azzerano le due
locazioni di ram riservate precedentemente con
l'istruzione: ram RES 2
Queste due locazioni sono adiacenti a partire
dall'indirizzo referenziato dalla label ram (in
pratica 20H e 21H
decfsz ram,1
NA L3
http://www.mrscuole.net/anxapic/
29
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/
Delay500
clrf ram
clrf ram+1
Ciclo_di_ritardo
decfsz ram,1
goto Ciclo_di_ritardo
decfsz ram+1,1
goto Ciclo_di_ritardo
return
END
NA L3
http://www.mrscuole.net/anxapic/
30
http://www.mrscuole.net/anxapic/
http://www.mrscuole.net/anxapic/