Lezione n° 3 - mrscuole.net

Transcript

Lezione n° 3 - mrscuole.net
Corso introduttivo sui
microcontrollori
A. S. 2007 – 2008
La programmazione dei PIC
Nicola Amoroso
[email protected]
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 l’Assemblatore
• 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 dall’editor.
Lavorando in Assembler, la parte più difficile è il debug , cioè
l’eliminazione 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 l’intero 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 dell’istruzione
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
2
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/

Documenti analoghi

Lezione n° 5 - mrscuole.net

Lezione n° 5 - mrscuole.net Vediamo ora dei semplici esempi di programmazione dei PIC in assembler, riordineremo i concetti sviluppati in precedenza e cercheremo di approfondire la simulazione mediante MPSIM e Proteus. Ricord...

Dettagli

Microcontrollori PIC

Microcontrollori PIC btfss = Bit Test File Register Skip Set = Esegui il test del bit del file register e salta se è settato

Dettagli

Corso PIC - Sistemi e reti di computer

Corso PIC - Sistemi e reti di computer Il pin MCLR (pin 4) serve per poter effettuare il reset del PIC. Normalmente viene mantenuto a 5 volt tramite la resistenza di pull up R1 e messo a zero quando si desidera resettare il PIC. Grazie ...

Dettagli