Lez3.ppt [modalità compatibilità]Lez3.pdf · Tale memoria nel PIC16F877 è di tipo EEPROM e...

30
NA – L3 1 Corso introduttivo sui microcontrollori A. S. 2007 – 2008 La programmazione dei PIC Nicola Amoroso [email protected] http://www.mrscuole.net/anxapic/ http://www.mrscuole.net/anxapic/ http://www.mrscuole.net/anxapic/

Transcript of Lez3.ppt [modalità compatibilità]Lez3.pdf · Tale memoria nel PIC16F877 è di tipo EEPROM e...

Page 1: Lez3.ppt [modalità compatibilità]Lez3.pdf · Tale memoria nel PIC16F877 è di tipo EEPROM e dispone di 8192 locazioni ognuna delle quali è in grado di contenere una sola istruzione

NA – L3 1

Corso introduttivo sui microcontrollori

A. S. 2007 – 2008

La programmazione dei PIC

Nicola [email protected]

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

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

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

Page 2: Lez3.ppt [modalità compatibilità]Lez3.pdf · Tale memoria nel PIC16F877 è di tipo EEPROM e dispone di 8192 locazioni ognuna delle quali è in grado di contenere una sola istruzione

NA – L3 2

Il software 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, ognunadelle quali identifica univocamente una funzione che il PIC devesvolgere. Ogni istruzione è rappresentata da un codice operativo (ininglese operation code o più brevemente opcode) composto da 14 bited è memorizzata in una locazione di memoria dell'area programma.Tale memoria nel PIC16F877 è di tipo EEPROM e dispone di 8192locazioni ognuna delle quali è in grado di contenere una solaistruzione 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 esistonoalcuni strumenti che consentono di facilitare il compito alprogrammatore rendendo le istruzioni più comprensibili.

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

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

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

Page 3: Lez3.ppt [modalità compatibilità]Lez3.pdf · Tale memoria nel PIC16F877 è di tipo EEPROM e dispone di 8192 locazioni ognuna delle quali è in grado di contenere una sola istruzione

NA – L3 3

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.

Il software per il PIC – 1° modo

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

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

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

Page 4: Lez3.ppt [modalità compatibilità]Lez3.pdf · Tale memoria nel PIC16F877 è di tipo EEPROM e dispone di 8192 locazioni ognuna delle quali è in grado di contenere una sola istruzione

NA – L3 4

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

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

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

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

Page 5: Lez3.ppt [modalità compatibilità]Lez3.pdf · Tale memoria nel PIC16F877 è di tipo EEPROM e dispone di 8192 locazioni ognuna delle quali è in grado di contenere una sola istruzione

NA – L3 5

.asm Contiene il codice sorgentein formato assembler.

.inc File header, intestazioni e defiizionihardware per il micro

.lst Contiene l’intero codice assemblere varie informazioni di compilazione

.tre Albero di allocazione dellamemoria.

.err File con errori di compilazionee numeri di linea.

.hex File con il codice macchina, per laprogrammazione del microcontrollore

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

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

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

Page 6: Lez3.ppt [modalità compatibilità]Lez3.pdf · Tale memoria nel PIC16F877 è di tipo EEPROM e dispone di 8192 locazioni ognuna delle quali è in grado di contenere una sola istruzione

NA – L3 6

Il software per il PIC – 1° modoEsempio di file ASM…RestoreLoader

lfsr 0, buff ; Construct instructions in buffmovlw UPPER Main ; Upper byte of address to mainmovwf t1+3bcf STATUS, C ; Clear carry bitrrcf t1+3, F ; Rotate through carrymovlw B'11110000' ; Second word in goto must start with F.iorwf t1+3, Fmovlw HIGH Main ; High byte of address to main.movwf t1+2rrcf t1+2, Fmovlw LOW Main ; Low byte of address to mainmovwf t1rrcf t1, FMOVLF 0xEF, t1+1 ; High byte in first word is EFlfsr 1, t1MOVLF 0x04, countrest_repmovff POSTINC1, POSTINC0decf count, Fbnz rest_repmovlw 0xFF ; two last nopmovwf POSTINC0 ;movwf POSTINC0 ;movwf POSTINC0 ; buff should now contain 8 bytes :

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

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

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

Page 7: Lez3.ppt [modalità compatibilità]Lez3.pdf · Tale memoria nel PIC16F877 è di tipo EEPROM e dispone di 8192 locazioni ognuna delle quali è in grado di contenere una sola istruzione

NA – L3 7

Set istruzioni PIC16F84 - 877Sintassi Descrizione Microchip Operazione equivalente

ADDLW k Add Literal and W W = W + kADDWF f,d Add W and f d = W + f (dove d può essere W o f)ANDLW k AND Literal with W W = W AND kANDWF f,d AND W with f d = W AND f (dove d può essere W o f)BCF f,b Bit Clear f f(b) = 0BFS f,b Bit Set f f(b) = 1BTFSC f,b Bit Test f, Skip if Clear f(b) = 0 ? Si, salta una istruzioneBTFSS f,b Bit Test f, skip if Set f(b) = 1 ? Si, salta una istruzioneCALL k Subroutine Call Chiama la subroutine all'indirizzo kCLRF f Clear f f = 0CLRW Clear W Register W = 0CLRWDT Clear Watchdog Timer Watchdog timer = 0

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

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

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

Page 8: Lez3.ppt [modalità compatibilità]Lez3.pdf · Tale memoria nel PIC16F877 è di tipo EEPROM e dispone di 8192 locazioni ognuna delle quali è in grado di contenere una sola istruzione

NA – L3 8

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)

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

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

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

Page 9: Lez3.ppt [modalità compatibilità]Lez3.pdf · Tale memoria nel PIC16F877 è di tipo EEPROM e dispone di 8192 locazioni ognuna delle quali è in grado di contenere una sola istruzione

NA – L3 9

RLF f,d Rotale Left f through Carry d = f << 1 (dove d può essere W o f)RRF f,d Rotale Right f through Carry d = f >> 1 (dove d può essere W o f)SLEEP Go into Standby Mode Mette in standby il PICSUBLW k Subtract W from Literal W = k - WSUBWF f,d Subtract W from f d = f - W (dove d può essere W o f)SWAPF f Swap f f = Swap dei bit 0123 con 4567 di fTRIS f Load TRIS Register TRIS di f = WXORLW k Exclusive OR Literal with W W = W XOR kXORWF f,d Exclusive OR W with f d = f XOR W (dove d può essere

Set istruzioni PIC16F84 - 877http://www.mrscuole.net/anxapic/

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

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

Page 10: Lez3.ppt [modalità compatibilità]Lez3.pdf · Tale memoria nel PIC16F877 è di tipo EEPROM e dispone di 8192 locazioni ognuna delle quali è in grado di contenere una sola istruzione

NA – L3 10

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 .

Il software per il PIC – 2° modo

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

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

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

Page 11: Lez3.ppt [modalità compatibilità]Lez3.pdf · Tale memoria nel PIC16F877 è di tipo EEPROM e dispone di 8192 locazioni ognuna delle quali è in grado di contenere una sola istruzione

NA – L3 11

Il software per il PIC – 2° modohttp://www.mrscuole.net/anxapic/

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

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

Page 12: Lez3.ppt [modalità compatibilità]Lez3.pdf · Tale memoria nel PIC16F877 è di tipo EEPROM e dispone di 8192 locazioni ognuna delle quali è in grado di contenere una sola istruzione

NA – L3 12

Il sistema di sviluppo CCS PCWH

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

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

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

Page 13: Lez3.ppt [modalità compatibilità]Lez3.pdf · Tale memoria nel PIC16F877 è di tipo EEPROM e dispone di 8192 locazioni ognuna delle quali è in grado di contenere una sola istruzione

NA – L3 13

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

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

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

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

Page 14: Lez3.ppt [modalità compatibilità]Lez3.pdf · Tale memoria nel PIC16F877 è di tipo EEPROM e dispone di 8192 locazioni ognuna delle quali è in grado di contenere una sola istruzione

NA – L3 14

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.

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

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

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

Page 15: Lez3.ppt [modalità compatibilità]Lez3.pdf · Tale memoria nel PIC16F877 è di tipo EEPROM e dispone di 8192 locazioni ognuna delle quali è in grado di contenere una sola istruzione

NA – L3 15

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

Programmazione del PIC

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

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

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

Page 16: Lez3.ppt [modalità compatibilità]Lez3.pdf · Tale memoria nel PIC16F877 è di tipo EEPROM e dispone di 8192 locazioni ognuna delle quali è in grado di contenere una sola istruzione

NA – L3 16

Il primo esercizio => Blinking LedLed 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

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

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

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

Page 17: Lez3.ppt [modalità compatibilità]Lez3.pdf · Tale memoria nel PIC16F877 è di tipo EEPROM e dispone di 8192 locazioni ognuna delle quali è in grado di contenere una sola istruzione

NA – L3 17

Analisi della soubroutine di ritardo di 500 msIl 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 02. Decrement delayL 1 µs3. se delayL ≠ 0 jump 2. else 4. 2 µs4. questa operazione viene ripetuta per FF5. (256) volte cioè per 256 x 3 = 768 µs6. 4. Decrement delayH 1 µs7. se delayH ≠ 0 jump 2. else 6. 2 µs8. questa operazione viene ripetuta per FF9. (256) volte cioè per 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

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

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

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

Page 18: Lez3.ppt [modalità compatibilità]Lez3.pdf · Tale memoria nel PIC16F877 è di tipo EEPROM e dispone di 8192 locazioni ognuna delle quali è in grado di contenere una sola istruzione

NA – L3 18

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 1 µs

3. se delayL ≠ 0 jump 2. else 4. 2 µs

4. questa operazione viene ripetuta per FF5. (256) volte cioè per 256 x 3 = 768 µs6. Decrement delayH 1 µs

7. se delayH ≠ 0 jump 2. else 6. 2 µs

8. questa operazione viene ripetuta per FF

9. (256) volte cioè per 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

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

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

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

Page 19: Lez3.ppt [modalità compatibilità]Lez3.pdf · Tale memoria nel PIC16F877 è di tipo EEPROM e dispone di 8192 locazioni ognuna delle quali è in grado di contenere una sola istruzione

NA – L3 19

Il Listato completo

;***********************************************************;Led blinking -> ON/OFF ogni 500 ms;Led collegato su RB0;N.A. October 2004;********************************************PROCESSOR 16F877A ;Direttive preprocessore

RADIX DECINCLUDE "P16F877A.INC"

ERRORLEVEL -302__CONFIG 3FF1H

LED EQU 0 ;Bit 1 della porta relativaORG 20h ;Registro general purpose

ram RES 2 ;Riservo due registri a 8 bitORG 00H ;Start reset vectorbcf STATUS,RP1 ;Scelgo il Bank 1bsf STATUS,RP0 ;RP1=0 RP0=1movlw 00111111B ;Bit PORTA come inputmovwf TRISAmovlw 11111110B ;Bit1 PORTB in Outmovwf TRISB ;gli altri bit in inputbcf STATUS,RP0 ;Torno al Bank0bsf PORTB,LED ;Accendo il Led

Loop ; Labelcall Delay500 ;Delay 500 msbtfsc PORTB,LED ;Spengo il ledgoto Spegni ;se è accesobsf PORTB,LED ;Accendo il ledgoto loop ;Jump a Loop

Spegnibcf PORTB,LED ;Spengo il led

goto loop ;Jump a Loop

Delay500 ;Sobroutine di ritardoClrf ram ;Azzero i due registriClrf ram+1 ;riservati

Ciclo_di_ritardodecfsz ram,1 ;Decremento il registro ramgoto Ciclo_di_ritardo ;per 256 voltedecfsz ram+1,1 ;Decremento il registro ram +1goto Ciclo_di_ritardo ;per 256 voltereturn ;Fine soubroutine

END ;Indispensabile alla fine del listato

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

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

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

Page 20: Lez3.ppt [modalità compatibilità]Lez3.pdf · Tale memoria nel PIC16F877 è di tipo EEPROM e dispone di 8192 locazioni ognuna delle quali è in grado di contenere una sola istruzione

NA – L3 20

PROCESSOR 16F877PROCESSOR è 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 PIC16F877RADIX DECLa 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.

Analisi del listato DirettiveLe 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

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

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

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

Page 21: Lez3.ppt [modalità compatibilità]Lez3.pdf · Tale memoria nel PIC16F877 è di tipo EEPROM e dispone di 8192 locazioni ognuna delle quali è in grado di contenere una sola istruzione

NA – L3 21

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 3la 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 20hram 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.

Analisi del listato Direttive

ORG 00HQuesta 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.

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

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

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

Page 22: Lez3.ppt [modalità compatibilità]Lez3.pdf · Tale memoria nel PIC16F877 è di tipo EEPROM e dispone di 8192 locazioni ognuna delle quali è in grado di contenere una sola istruzione

NA – L3 22

• Il primo opcode eseguito dal PIC dopo il reset è quello memorizzato nella locazione 0, da qui il valore 00H inserito nella ORG.

bsf STATUS,RP0Ecco 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.

Analisi del listato OpCodehttp://www.mrscuole.net/anxapic/

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

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

Page 23: Lez3.ppt [modalità compatibilità]Lez3.pdf · Tale memoria nel PIC16F877 è di tipo EEPROM e dispone di 8192 locazioni ognuna delle quali è in grado di contenere una sola istruzione

NA – L3 23

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. Inparticolare ogni bit ad uno del registro TRISA determina un ingresso sullarispettiva linea della porta A mentre ogni 0 determina un'uscita.

Analisi del listato OpCode

Nella seguente tabella viene riportata la configurazione cheassumeranno i pin del PIC dopo l'esecuzione di questa istruzione:

Come è possibile vedere i bit6 e 7 non corrispondono anessuna linea di I/O e quindiil loro valore non ha alcunainfluenza.

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

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

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

Page 24: Lez3.ppt [modalità compatibilità]Lez3.pdf · Tale memoria nel PIC16F877 è di tipo EEPROM e dispone di 8192 locazioni ognuna delle quali è in grado di contenere una sola istruzione

NA – L3 24

Le due istruzioni successive svolgono le stesse funzioni per la porta B del PIC:

movlw 11111110B

Movwf TRISB

Analisi del listato OpCode

in questo caso la definizione delle linee sarà la seguente:

Si noti come il valore 0 nel bit 0 del registro TRISBdetermini la configurazione in uscita della rispettiva lineadel PIC.Nella nostra applicazione infatti questa linea viene utilizzataper pilotare il LED da far lampeggiare.

L'istruzione movwf TRISB trasferisce ilvalore contenuto nell'accumulatore(inizializzato opportunamente conl'istruzione movlw 11111110 B) nelregistro TRISB. Il significato di movwfè infatti MOVE W TO FILEREGISTER.

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

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

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

Page 25: Lez3.ppt [modalità compatibilità]Lez3.pdf · Tale memoria nel PIC16F877 è di tipo EEPROM e dispone di 8192 locazioni ognuna delle quali è in grado di contenere una sola istruzione

NA – L3 25

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 riscontroall'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 fileregister corrispondente alle linee di I/O della porta B mentre LED è il numero dellalinea da mettere a 1. All'inizio del source la costante LED è stata definita pari a 0,quindi la linea interessata sarà RB0.

Analisi del listato OpCode

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

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

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

Page 26: Lez3.ppt [modalità compatibilità]Lez3.pdf · Tale memoria nel PIC16F877 è di tipo EEPROM e dispone di 8192 locazioni ognuna delle quali è in grado di contenere una sola istruzione

NA – L3 26

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, alledirettive ORG e alle altre istruzione che in qualche modo allocano spazio nella memoria del PIC. In questocaso, se contiamo le istruzioni inserite a partire dall'ultima direttiva ORG possiamo calcolare il valore cheverrà assegnato a MainLoop ovvero 09H.

• In realtà il valore che assumono le label non ha molta importanza in quanto il loro scopo è proprio quello dievitare di dover conoscere la posizione precisa degli opcode nella memoria del PIC permettendo comunquedi referenziare una determinata locazione di memoria.

• In questo caso la label Loop viene utilizzata come punto di ingresso di un ciclo (dall'inglese Loop) diaccensione 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è ripetereogni volta tutte le istruzioni necessarie ad effettuarla. In questo caso la subroutine inserisce un ritardo parial tempo di accensione e spegnimento del led.

Analisi del listato OpCode

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

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

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

Page 27: Lez3.ppt [modalità compatibilità]Lez3.pdf · Tale memoria nel PIC16F877 è di tipo EEPROM e dispone di 8192 locazioni ognuna delle quali è in grado di contenere una sola istruzione

NA – L3 27

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 diconseguenza, 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,LEDgoto Loop

• Queste due istruzioni semplicemente accendono il led e rimandano il programma all'ingresso del ciclo di lampeggiamento.

Spegnibcf PORTB,LED

goto Loop• Queste istruzioni semplicemente spengono il led e rimandano il programma all'ingresso del ciclo di lampeggiamento.

Analisi del listato OpCode

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

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

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

Page 28: Lez3.ppt [modalità compatibilità]Lez3.pdf · Tale memoria nel PIC16F877 è di tipo EEPROM e dispone di 8192 locazioni ognuna delle quali è in grado di contenere una sola istruzione

NA – L3 28

• 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.

Analisi del listato La soubroutine Delay

La soubroutine di ritardo

Delay500clrf ramclrf ram+1

Ciclo_di_ritardodecfsz ram,1goto Ciclo_di_ritardodecfsz ram+1,1goto Ciclo_di_ritardoreturn

END

Delay e Ciclo_di_ritardo sono due label.

Delay identifica l'indirizzo di inizio della subroutine eviene utilizzato per le chiamate dal corpo principale delprogramma.

Ciclo_di_ritardo viene chiamato internamente dallasubrountine e serve come punto di ingresso per il ciclo(dall'inglese loop) di ritardo. In pratica il ritardo vieneottenuto eseguendo migliaia di istruzioni che non fannonulla !

Questo tipo di ritardo si chiama ritardo software o ritardo a programma. E' il tipo di ritardo più semplice daimplementare e può essere utilizzato quando non è richiesto che il PIC esegua altri compiti mentre esegueil ritardo.

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

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

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

Page 29: Lez3.ppt [modalità compatibilità]Lez3.pdf · Tale memoria nel PIC16F877 è di tipo EEPROM e dispone di 8192 locazioni ognuna delle quali è in grado di contenere una sola istruzione

NA – L3 29

Clrf ramclrf ram +1

• CLEAR FILE REGISTER azzerano le duelocazioni di ram riservate precedentemente conl'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 FILEREGISTER, SKIP IF ZERO ovvero decrementa ilcontenuto di un registro (in questo caso Count esalta l'istruzione successiva se il valore raggiuntoè zero). Se il valore raggiunto non è zero vieneeseguita l'istruzione successiva:

goto Ciclo_di_ritardo

• Che rimanda rimanda l'esecuzione all'inizio delciclo di ritardo.

Analisi del listato La soubroutine Delay

La soubroutine di ritardo

Delay500clrf ramclrf ram+1

Ciclo_di_ritardodecfsz ram,1goto Ciclo_di_ritardodecfsz ram+1,1goto Ciclo_di_ritardoreturn

END

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

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

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

Page 30: Lez3.ppt [modalità compatibilità]Lez3.pdf · Tale memoria nel PIC16F877 è di tipo EEPROM e dispone di 8192 locazioni ognuna delle quali è in grado di contenere una sola istruzione

NA – L3 30

• Una volta raggiunto lo zero con il contatore ramvengono eseguite le istruzioni:

decfsz ram+1,1goto Ciclo_di_ritardo

• Che decremetano il registro seguente fino a che anchequesto raggiunge lo zero. Il registro ram+1 inparticolare verrà decrementato di uno ogni 256decrementi di ram.

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

return

• il cui significato è RETURN FROM SUBROUTINEdeterminerà l'uscita dalla routine di ritardo ed ilproseguimento dell'esecuzione dall'istruzionesuccessiva la call Delay.

Analisi del listato La soubroutine Delay

La soubroutine di ritardo

Delay500clrf ramclrf ram+1

Ciclo_di_ritardodecfsz ram,1goto Ciclo_di_ritardodecfsz ram+1,1goto Ciclo_di_ritardoreturn

END

Per finire END è una direttiva (indispensabile)che indica al compilatore la fine del sourceassembler.

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

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

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