Sei sulla pagina 1di 30

Corso introduttivo sui

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/

Il softw are per il PIC

Come per qualsiasi sistema a microprocessore, anche per il PIC


necessario preparare un programma per farlo funzionare.

Un programma costituito da una sequenza di instruzioni, ognuna


delle quali identifica univocamente una funzione che il PIC deve
svolgere. Ogni istruzione rappresentata da un codice operativo (in
inglese operation code o pi brevemente opcode) composto da 14 bit
ed memorizzata in una locazione di memoria dell'area programma.
Tale memoria nel PIC16F877 di tipo EEPROM e dispone di 8192
locazioni ognuna delle quali in grado di contenere una sola
istruzione oppure una coppia istruzione/dato.

Questi codici, completamente privi di senso per un essere umano,


sono gli unici che il PIC in grado di capire. Per fortuna esistono
alcuni strumenti che consentono di facilitare il compito al
programmatore rendendo le istruzioni pi comprensibili.

NA L3

http://www.mrscuole.net/anxapic/
2

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Il software per il PIC 1 modo


Il programma per il PIC si pu scrivere in linguaggio assembly o
assembler , usando direttamente le 35 istruzioni riconosciute
dal microcontrollore.
Il codice si scrive come un file di testo . Esso viene convertito in
codice binario da un programma chiamato Assemblatore. Il file
creato contiene codici esadecimali e ha estensione . HEX
Per trasferire poi il file HEX nella memoria di programma del PIC
occorre un dispositivo chiamato Programmatore
Si usa un Personal Computer :
per scrivere il testo del programma, con un editor di testi ( non
usando Word ! )
per convertirlo in codice eseguibile, usando lAssemblatore
per scriverlo nel PIC, usando un Programmatore.

NA L3

http://www.mrscuole.net/anxapic/
3

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Il software per il PIC 1 modo


La casa costruttrice Microchip fornisce un pacchetto integrato chiamato
MPLAB [Download gratuito => http://www.microchip.com].
Esso comprende :
MPLAB Editor : editor di testo per scrivere il testo del programma
MPASM : il compilatore che traduce il testo in codice eseguibile
(usando il codice esadecimale)
Il compilatore MPASM liberamente usabile. Si scarica dal sito della
Microchip e si pu usare indipendentemente dalleditor.
Lavorando in Assembler, la parte pi difficile il debug , cio
leliminazione degli errori di programmazione. Esistono software di
simulazione, a pagamento in genere, che consentono di controllare il
funzionamento del programma
NA L3

http://www.mrscuole.net/anxapic/
4

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

.asm Contiene il codice sorgente


in formato assembler.
.inc File header, intestazioni e defiizioni
hardware per il micro
.lst Contiene lintero codice assembler
e varie informazioni di compilazione
.tre Albero di allocazione della
memoria.
.err File con errori di compilazione
e numeri di linea.
.hex File con il codice macchina, per la
programmazione del microcontrollore

NA L3

http://www.mrscuole.net/anxapic/
5

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Il software per il PIC 1 modo


Esempio di file ASM

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

; Construct instructions in buff


; Upper byte of address to main
; Clear carry bit
; Rotate through carry
; Second word in goto must start with F.
; High byte of address to main.

; Low byte of address to main

; High byte in first word is EF

; two last nop


;
;
; buff should now contain 8 bytes :

http://www.mrscuole.net/anxapic/
6

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Set istruzioni PIC16F84 - 877


Sintassi

Descrizione Microchip

Operazione equivalente

ADDLW k

Add Literal and W

ADDWF f,d

Add W and f

ANDLW k

AND Literal with W

ANDWF f,d

AND W with f

BCF f,b

Bit Clear f

BFS f,b

Bit Set f

BTFSC f,b

Bit Test f, Skip if Clear

BTFSS f,b

Bit Test f, skip if Set

CALL k

Subroutine Call

CLRF f

Clear f

CLRW

Clear W Register

CLRWDT

Clear Watchdog Timer

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

d = f -1 (dove d pu essere W o f) se d = 0 salta

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

d = f +1 (dove d pu essere W o f) se d = 0 salta

IORLW k

Inclusive OR Literal with W

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

Load Option Register

OPTION = W

RETIE

Return from Interrupt

Ritorna da un interrupt handler

RETLW k

Return Literal to W

Ritorna da una subroutine con W = k

RETURN

Return from Subroutine

Ritorna da una subroutine

RLF f,d

Rotale Left f through Carry

d = f << 1 (dove d pu essere W o f)

NA L3

http://www.mrscuole.net/anxapic/
8

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Set istruzioni PIC16F84 - 877


RLF f,d

Rotale Left f through Carry

RRF f,d

Rotale Right f through Carry

SLEEP

Go into Standby Mode

SUBLW k

Subtract W from Literal

SUBWF f,d

Subtract W from f

SWAPF f

Swap f

TRIS f

Load TRIS Register

XORLW k

Exclusive OR Literal with W

XORWF f,d

Exclusive OR W with f

NA L3

d = f << 1 (dove d pu essere W o f)


d = f >> 1 (dove d pu essere W o f)
Mette in standby il PIC
W= k - W
d = f - W (dove d pu essere W o f)
f = Swap dei bit 0123 con 4567 di f
TRIS di f = W
W = W XOR k
d = f XOR W (dove d pu essere

http://www.mrscuole.net/anxapic/
9

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Il software per il PIC 2 modo


Il programma per il PIC si pu scrivere usando un Compilatore ad alto
livello , ossia un software che usa istruzioni a livello pi elevato , per
velocizzare e facilitare la stesura del programma .
Il Compilatore pu essere
in linguaggio BASIC ( ad esempio il PicBasic)
in linguaggio C
di tipo grafico, ossia che usa simboli grafici al posto delle istruzioni. Ad
esempio usa il simbolo di una porta AND al posto dellistruzione
assembler equivalente . Due esempi di compilatori grafici sono il Visual
Parsic e il Proton+.
I compilatori devono essere acquistati ; i pi semplici in Basic o C sono
a basso costo o anche freeware. Alcuni compilatori, come il Proton+,
offrono delle versioni di prova dette Lite , cio con funzioni limitate .
NA L3

http://www.mrscuole.net/anxapic/
10

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Il software per il PIC 2 modo

NA L3

http://www.mrscuole.net/anxapic/
11

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Il sistema di sviluppo CCS PCWH

NA L3

http://www.mrscuole.net/anxapic/
12

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Programmazione dei PIC


Esempio di file HEX
:1000000008308A00C92D0000FF00030E8301A10003
:100010000A08A0008A010408A2007708A300780853
:10002000A4007908A5007A08A6007B08A70083131E
:1000300083128B1E1D280B1936288C308400801EDD
:1000400023288C1A3928220884002308F700240862
:10005000F8002508F9002608FA002708FB00200808
:100060008A00210E8300FF0E7F0E09008A110A12FA
:10007000E4288A110A1287280A108A100A118207B6
:1000800020344D34413441345234533420345334C9
:1000900054344134523454345534503420344D3473
....................
:103F10008A1525308316B0000A128A1183120426EE
:103F20000A168A1501308316B0000A128A1183120C
:103F300004260A168A1583162B08B0000A128A1165
:103F4000831204260A168A1523308316B0000A123B
:103F50008A11831204260A168A15AE2F8A150A12B0
:103F6000B12E0A148A140A158207FE2CFE2CFE2C90
:023F7000FE2C25
:02400E00323F3F
:00000001FF
;PIC16F876

NA L3

http://www.mrscuole.net/anxapic/
13

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Programmazione del PIC


La famiglia PIC16F8X , che comprende il 16F84, il 16F877
ecc. , pu essere programmata :
separatamente, con un Programmatore
direttamente, mentre si trova gi montato nel circuito
finale , aggiungendo nello schema del progetto un adatto
connettore in pi ( programmazione in-circuit)

Dato che il PIC ha una memoria Flash di programma,


sono possibili veloci variazioni o aggiornamenti del
codice programma.
NA L3

http://www.mrscuole.net/anxapic/
14

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Programmazione del PIC


Dopo aver scritto il programma , cio il codice sorgente, lo si
compila: viene creato un file oggetto con estensione .HEX, il quale
deve essere caricato nella memoria di programma del PIC.
Per caricare il file .HEX nella memoria programma del PIC occorre:
Un personal computer
Un programmatore
Il software di gestione del programmatore

NA L3

http://www.mrscuole.net/anxapic/
15

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Il primo esercizio => Blinking Led


Led lampeggiante che si accende e si spegne ogni mezzo secondo

Punti fongamentali per:


Analisi, progettazione e stesura del software
Analisi e stesura per punti cronologici del
problema
Flow Charts
Scrittura del codice

NA L3

http://www.mrscuole.net/anxapic/
16

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Analisi della soubroutine di ritardo di 500 ms


Il concetto molto semplice: il microcontrollore deve aspettare 500 ms senza compiere alcuna
operazione attiva.
Ad esempio se il controllore
1.
Decrementa il contenuto di un registro (1 s)
2.
Torna a 1. se il contenuto del registro <> 0 [Confronto] (2 s)
In totale avremo un tempo di esecuzione pari a 3 s. Se ripetiamo questa operazione per 167.000 volte avremo
un tempo di esecuzione pari a 501.000 s cio circa 500 ms
Il nostro controllore possiede registri ad 8 bit allora possiamo sfruttare la seguente logica sfruttando 2 registri ad 8 bit e
ricordando che i registri sono ciclici cio 00 - 1= FF

1.

Riserviamo due registri (delayL e delayH); set delayL 0 e delayH 0

2.

Decrement delayL

3.

se delayL 0 jump 2. else 4.

4.

questa operazione viene ripetuta per FF

5.

(256) volte cio per

6.

4. Decrement delayH

7.

se delayH 0 jump 2. else 6.

8.

questa operazione viene ripetuta per FF

9.

(256) volte cio per

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/

Analisi della soubroutine di ritardo di 500 ms -> Flow Chart


Il concetto molto semplice: il microcontrollore deve aspettare 500 ms senza compiere
alcuna
operazione attiva.
Ad esempio se il controllore

Decrementa il contenuto di un registro (1 s)

Torna a 1. se il contenuto del registro <> 0 [Confronto] (2 s)

In totale avremo un tempo di esecuzione pari a 3 s. Se ripetiamo questa operazione per


167.000 volte avremo un tempo di esecuzione pari a 501.000 s cio circa 500 ms
Il nostro controllore possiede registri ad 8 bit allora possiamo sfruttare la seguente logica sfruttando
2 registri ad 8 bit e ricordando che i registri sono ciclici cio 00 - 1= FF
1.

Riserviamo due registri (delayL e delayH); set delayL 0 e delayH 0

2.

Decrement delayL

3.

se delayL 0 jump 2. else 4. 2 s

4.

questa operazione viene ripetuta per FF

5.

(256) volte cio per

6.

Decrement delayH

7.

se delayH 0 jump 2. else 6.

8.

questa operazione viene ripetuta per FF

9.

(256) volte cio per

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

;Led collegato su RB0


;N.A. October 2004
;********************************************
PROCESSOR
16F877A ;Direttive preprocessore
RADIX
DEC
INCLUDE
"P16F877A.INC"
ERRORLEVEL -302
__CONFIG
3FF1H
LED EQU 0
;Bit 1 della porta relativa
Spegni
ORG 20h
;Registro general purpose
bcf PORTB,LED ;Spengo il led
ram RES 2
;Riservo due registri a 8 bit
ORG 00H
;Start reset vector
goto loop ;Jump a Loop
bcf STATUS,RP1
;Scelgo il Bank 1
bsf STATUS,RP0
;RP1=0 RP0=1
Delay500
;Sobroutine di ritardo
movlw 00111111B ;Bit PORTA come input
movwf TRISA
movlw 11111110B
;Bit1 PORTB in Out
movwf TRISB
;gli altri bit in input
bcf STATUS,RP0
;Torno al Bank0
bsf PORTB,LED
;Accendo il Led
Loop ; Label
call Delay500 ;Delay 500 ms
btfsc PORTB,LED ;Spengo il led
goto Spegni ;se acceso
bsf PORTB,LED ;Accendo il led
goto loop ;Jump a Loop

NA L3

Clrf ram
Clrf ram+1

;Azzero i due registri

;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

;Indispensabile alla fine del listato

http://www.mrscuole.net/anxapic/
19

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Analisi del listato Direttive


Le direttive non sono delle istruzioni mnemoniche che il compilatore
traduce nel rispettivo opcode, ma delle semplici indicazioni rivolte al
compilatore per determinarne il funzionamento durante la compilazione
PROCESSOR 16F877
PROCESSOR una direttiva del compilatore assembler che consente di
definire per quale microprocessore stato scritto il nostro source. In questo caso
informiamo il compilatore che le istruzioni che abbiamo inserito nel nostro
source sono relative ad un PIC16F877
RADIX DEC
La direttiva RADIX serve ad informare il compilatore che i numeri riportati
senza notazione, sono da intendersi come numeri decimali
ORG 00H
Questa seconda direttiva fa riferimento ad un indirizzo in area programma nella
EEPROM. Da questo punto in poi andremo infatti ad inserire le istruzioni
mnemoniche che il compilatore dovr convertire negli opportuni opcode per il
PIC.
Il primo opcode eseguito dal PIC dopo il reset quello memorizzato nella
locazione 0, da qui il valore 00H inserito nella ORG.
NA L3

http://www.mrscuole.net/anxapic/
20

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Analisi del listato Direttive


La direttiva EQU (parola riservata) molto importante in quanto ci consente di definire delle
costanti simboliche all'interno del nostro codice sorgente. In particolare :
LED EQU 3

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

in questo caso verranno riservate la locazione 20H e 21H .


La label RAM, dove RAM un nome scelto da noi, un marcatore che nel resto del codice sorgente
assumer il valore dell'indirizzo in cui stato inserito.
ORG 00H

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/

Analisi del listato OpCode

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

Ecco finalmente la prima istruzione mnemonica completa di parametri.

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/

Analisi del listato OpCode


Nell'istruzione successiva:
movwf TRISA

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.

Nella seguente tabella viene riportata la configurazione che


assumeranno i pin del PIC dopo l'esecuzione di questa istruzione:

Come possibile vedere i bit


6 e 7 non corrispondono a
nessuna linea di I/O e quindi
il loro valore non ha alcuna
influenza.

NA L3

http://www.mrscuole.net/anxapic/
23

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Analisi del listato OpCode


Le due istruzioni successive svolgono le stesse funzioni per la porta B del PIC:
movlw 11111110B
Movwf TRISB

in questo caso la definizione delle linee sar la seguente:

L'istruzione movwf TRISB trasferisce il


valore contenuto nell'accumulatore
(inizializzato
opportunamente
con
l'istruzione movlw 11111110 B) nel
registro TRISB. Il significato di movwf
infatti MOVE W TO FILE
REGISTER.
Si noti come il valore 0 nel bit 0 del registro TRISB
determini la configurazione in uscita della rispettiva linea
del PIC.
Nella nostra applicazione infatti questa linea viene utilizzata
per pilotare il LED da far lampeggiare.

NA L3

http://www.mrscuole.net/anxapic/
24

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Analisi del listato OpCode


bcf STATUS,RP0

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/

Analisi del listato OpCode


Loop

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/

Analisi del listato OpCode


btfsc PORTB,LED

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/

Analisi del listato La soubroutine Delay

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

Delay e Ciclo_di_ritardo sono due label.


Delay identifica l'indirizzo di inizio della subroutine e
viene utilizzato per le chiamate dal corpo principale del
programma.
Ciclo_di_ritardo viene chiamato internamente dalla
subrountine e serve come punto di ingresso per il ciclo
(dall'inglese loop) di ritardo. In pratica il ritardo viene
ottenuto eseguendo migliaia di istruzioni che non fanno
nulla !

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/

Analisi del listato La soubroutine 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

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

L'istruzione significa DECREMENT FILE


REGISTER, SKIP IF ZERO ovvero decrementa il
contenuto di un registro (in questo caso Count e
salta l'istruzione successiva se il valore raggiunto
zero). Se il valore raggiunto non zero viene
eseguita l'istruzione successiva:
goto Ciclo_di_ritardo

NA L3

Che rimanda rimanda l'esecuzione all'inizio del


ciclo di ritardo.

http://www.mrscuole.net/anxapic/
29

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Analisi del listato La soubroutine 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

Una volta raggiunto lo zero con il contatore ram


vengono eseguite le istruzioni:
decfsz ram+1,1
goto Ciclo_di_ritardo
Che decremetano il registro seguente fino a che anche
questo raggiunge lo zero. Il registro ram+1 in
particolare verr decrementato di uno ogni 256
decrementi di ram.

Quando anche ram +1 avr raggiunto lo zero l'istruzione:


return

il cui significato RETURN FROM SUBROUTINE


determiner l'uscita dalla routine di ritardo ed il
proseguimento
dell'esecuzione
dall'istruzione
successiva la call Delay.

Per finire END una direttiva (indispensabile)


che indica al compilatore la fine del source
assembler.

NA L3

http://www.mrscuole.net/anxapic/
30

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/