Maurizio Del Corso Tiziano Galizia

Conoscere ed usare
Progettare con i microcontrollori PIC in modo facile e veloce

PICmicro

Copyright: © 20 – INWARE Edizioni S.r.l. Via Giotto, 7 20032 Cormano (MI) Tel: 02-66504755 Fax: 02-66508225 info@inwaredizioni.it - www.inwaredizioni.it

Tutti i diritti sono riservati a norma di legge e a norma delle convenzioni internazionali. È vietata la riproduzione di testi e di disegni raccolti in questa opera. Nomi e marchi citati nel testo sono generalmente depositati o registrati dalle rispettive case produttrici.

.........Le porte di I/O .............. 41 L'Accumulatore o registro W ...................................................... 53 Funzionamento in uscita.................................................................................... 5 Struttura interna.................................................................................................... 25 La subroutine Delay............................... 57 Uso delle porte di I/O: Input da tastiera......................................................................................................................................................... 54 Stadio di uscita delle linee RB0........................................................................................................ 5 Periferiche ........... 51 Le porte A e B............ 38 La ALU............................................................................................................................................ RB1.................. 9 2 ........................ RB5.. 43 Lo Stack Pointer .............. 15 3 ...... 7 Organizzazione della memoria programma ........................................................................................................................................ 17 Lo schema elettrico ...........Indice 1 .....................................................................................................................................................................................................................................Introduzione ai PICmicro .............................................................................................................................................................................. 8 Organizzazione della memoria dati ............ 54 Stadio d'uscita della linea RA4 ............................ 35 4 ........ RA1.......................... 1 Un po’ di storia......... RB6 e RB7 ......................................................... 11 L’hardware.....Gli strumenti necessari....................................................Realizzazione delle "luci in sequenza" ........................................................... RB2 ed RB3 ........................................................................................................................................ 44 5 .. 42 Il Program Counter (PC)......... 34 I flag di configurazione dei PICmicro ........................................ 13 Il software .....................................................................Architettura interna del PIC16F84A................... 11 Un programmatore .................................................................................Un semplice lampeggiatore a led ........................................................ 58 I ....................................................................................... 11 Una scheda di prototipazione ................................................... 32 La compilazione di un sorgente assembler................................................................................................. 2 PIC16F84A Il microcontrollore utilizzato in questo libro................................. 51 Stadi di uscita delle linee di I/O ................................... 53 Funzionamento in ingresso.. 1 Introduzione al PICmicro ............................................................................................................... 13 Alimentazione dei circuiti .......................................................................................................................................................................... 5 CPU e memoria ......... 14 MPLAB: editor e compilatore ................................................................................................................................................................................................................................................................................................ 47 6 .......................................................... 14 Il software per la programmazione ...... 18 Scrittura e compilazione di un programma assembler ............................................... 56 Stadio di uscita delle linee RB4...................................... 22 Analisi di un sorgente Assembler ................................................................................................................ 37 La Program Memory... 38 Il Register File................................................... 17 La generazione del segnale di clock....................................... 53 Stadio di uscita delle linee RA0.............................................................................................. RA2 e RA3 .........

................................................................................................................................................................................................................ 77 Power-up Timer (PWRT) .... 61 Il registro contatore TMR0 ....................................Il Power Down Mode.....................................95 Analizziamo il sorgente LCD1........................................................... 87 12 .......................... 82 Esempio di Power Down mode ................................................................................................................................................................................Gli interrupt .............ASM ................................................................................Il watch dog timer (WDT) .. 68 Salvataggio del contesto....Esempi ed applicazioni pratiche..........Scrittura e lettura dati da EEPROM ....................................................................................................................................................... 100 La comunicazione seriale asincrona................................................. 81 Il "risveglio" del PICmicro................................... 102 Funzionamento del MAX232........ 101 Come collegare il circuito d'esempio.....................................97 Gestione di una connessione RS232 .. 104 II ............................................................. 71 Perchè viene generato un interrupt quando è premuto un tasto qualsiasi? ........................................ 68 Interrupt flag................................................................................................................................................................ 77 10 .................................................................Reset ......................... 93 Gestione di un display LCD ............................................ 67 Interrupt vector ed Interrupt handler ........................64 8 .........................................................................96 Subroutine di gestione del display LCD ......................... 89 Scrittura di un dato su EEPROM ........................................................ 85 Assegnazione del PRESCALER al WDT .................................................................................................................................................................................. 89 Lettura di un dato da EEPROM ............................... 63 Esempio di uso del prescaler......................... 69 Ritorno da un interrupt handler.......72 Esempio pratico di gestione di più interrupt..................................................................... 93 Hello World! ............................................ 81 Introduzione ............................. 70 Analisi del sorgente INTRB.................ASM ................95 Multiplex sul bus dati ............................................. 81 L'istruzione SLEEP ...................................................................................................................... 67 Tipi di evento e bit di abilitazione...............................................................................94 Le linee Enable (E) e Register Select (RS) dell'LCD ....................................................................................................... 73 Analisi del sorgente DBLINT................................7 ............................. 70 Esempio pratico di gestione di un interrupt ...........................................................................................................................................................................................74 9 ....................................................................................................................................................................................................... 91 13 .................................................. 99 Introduzione .....................................................Il contatore TMR0 ed il PRESCALER.....99 Cos'é e a cosa serve l'RS232 .................................................................................................... 82 11 ................................................................................................................................. 86 Esempio pratico di uso del Watch Dog Timer ................................................ 85 Introduzione .............. 75 Power-On-Reset (POR). 89 Registri speciali per l’accesso alla EEPROM dati ............................................................103 Analisi del file sorgente ............ 61 Il Prescaler....................................................................................................................................................... 77 Oscillator Start-up Timer (OST)..........................ASM............

.. 122 DECFSZ ................................. 113 Le istruzioni semplici .................. 135 B ............................. 135 ADDDCF .............................................. 125 IORWF .......................................................................................................... 109 Comandi di spegnimento LED ........................................................................................................................... 136 BNZ .................................................................................... 121 CLRW ............................................................................................................... 133 XORWF .......................... 124 IORLW................................................................................................................. 108 Protocollo di comunicazione con il PC............................................................................................................................................................................. 109 Comandi di accensione LED ............................................................................................................................................................................................. 121 CLRWDT ....... 120 CLRF ............................................................................................................................................................................................................................................................................................................... 110 Realizzazione del gioco elettronico “SIMON”.............................. 129 RRF ................................................................................................................................................................................................................................................................ 131 SUBLW...................................................................................................... 133 XORLW .................................................................................................................................................................................................................. 109 Programma di prova ............. 119 BTFSS........................................................................... 113 ADDLW ............. 132 SWAPF..................................................... 117 BCF ............................................................................ 126 MOVF ..................................................................................................................................................................................................................................................................... 118 BTFSC............................................... 122 DECF............................................................................................. 118 BSF ........................................................................................................................................... 111 14 ......................................................................................................... 131 SUBWF ................ 109 Lettura stato pulsanti ......................................................................................... 136 BNDC ................................................................................................................................... 137 III .................................................................................................................................... 127 NOP...................... 135 BC ................................................................................................................................................................................................... 126 MOVWF.......................................................................................................................... 125 MOVLW ................................................................................................................................................................................................................................................................................................................................................................................................ 119 CALL ...... 123 GOTO........... 130 SLEEP.........................................................................................................................Un altro esempio con l'interfaccia RS232 ........................................................................................................................................................................................................................................................................... 127 RETFIE................................................... 116 ANDWF ..................................................................................................................................................................................................................................................................................................................................... 136 BDC...........Set di istruzioni............................................................ 133 Le istruzioni speciali ........................................................................................................................................ 128 RETURN ............................... 116 ANDLW .............. 127 RETLW......................................................................................................................... 115 ADDWF ....................................................................................... 135 ADDCF ......... 128 RLF.......................................................... 121 COMF..................................................................................................................... 124 INCFSZ .................................................................................... 123 INCF .............................................................................................................................................. 136 BNC...........................................................

....................................... 146 IF................................. 157 C ......................................................................................................................................................... 159 CPU ...........LST file.................................................................................. 148 MACRO............................... 145 GLOBAL ..................................................... 144 ERRORLEVEL...............................................................................................................................................................................................................................................................................................................................................................................................139 SUBCF.......................................................... 137 CLRDC ............................................... 139 SKPNZ...... 159 .......................................... 147 ORG................................................................................................ 141 DT ....La programmazione ICSP™ dei PICmicro... 159 IV ...............................................................................................Tabelle.......................................................................................................................... 144 EQU ............................................................................................................................................................................................... 150 RADIX ........................................................................................................................................................................ 148 PROCESSOR....................................................................................................................................... 139 SKPZ ........... 138 NEGF......................................................... 159 Interrupt ............................. 139 SKPNC ...... 156 Tabella di conversione binario/esadecimale.............. 140 TSTF...ERR file............................................................................. 151 B ...................................................................................................................................................................................................................................................................................................................................................................................................................... 141 __CONFIG....................Glossario dei termini utilizzati .........139 SKPDC ........................................................................................................Direttive dell'assembler MPASM...................................................................................BZ ................................................................................................................................................................. 137 CLRZ ..................................................................... 138 SKPC .......................... 138 SETC ......................................................................................... 137 MOVFW .................................................................... 139 SKPNDC...HEX file .....................................ASM file .............................................................................................................................................................................. 159 Macro .....................................137 CLRC .................. 159 ...................................................................................... 159 ............................................................................................................................................................ 140 15 ........................................................................................................................... 159 ............................................. 144 EXTERN ............................................................................................ 138 SETDC...................................................... 147 INCLUDE ..................... 140 SUBDCF ... 155 Tabella dei caratteri ASCII..... 159 ICSP.................................. 146 IFDEF..... 138 SETZ........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... 150 A ..................................................... 143 #DEFINE..................................................................................... 148 RES....................................................................................................... 141 CBLOCK ............................................................................................................................................................................................. 159 Microcontroller ............................................................................................................

................................................................................................................................................................................................................................... 160 OPCODE .. EPROM.................................................. 161 RAM................................................................................................................................................................................. PROM..........................Il contenuto del CD .................................. 174 F ..................................................................... 162 FLASH............................................. 161 NOT................................ 162 SUBROUTINE ..................... 166 Moltiplicazione tra due numeri binari a 16 bit................................................................... FLASH............................................................................ 175 V ................................................ 163 Conversione da binario a cifre ASCII ................................................................................................................................................. 173 I contenuti ................................................................................................................................................................................................. 172 E .................................... 162 D .................................................................................... EEPROM.....................................................................................................................................Notazione BINARIA ed ESADECIMALE .................................................. 161 XOR...................... 162 PROM.............................................................................................................. 162 ROM ............................Indice delle figure e delle tabelle....................... 163 Conversione da ASCII a binario ..........................Routine Assembler di varia utilità... 164 Conversione da esadecimale a cifre ASCII........................................... 173 L’interfaccia grafica ................................. 160 AND........................................................................................... 160 OR .............................................. 162 EPROM ......................... 168 Gestione di ore............................................................................... 161 ROM..................... 160 Operazioni booleane ........................................................................................................................................................................... 170 Discriminazione di un interrupt ..................... 161 RESET. minuti e secondi mediante Timer0................................. 167 Divisione tra un dividendo binario a 48 bit ed un divisore binario a 23 bit ................ 162 EEPROM ......................................

.

forse lo facevano perché dubitavano che questi oggettini pretenziosi potessero mai guadagnarsi lo status di un prodotto maturo. ma Microchip è sempre lì. continua a raccontare una storia cominciata negli anni ottanta. Da allora ha accompagnato i primi passi di milioni di firmwaristi e progettisti in erba. Oggi esistono migliaia di prodotti FLASH. di costruttori diversi. si sentiva ancora il bisogno di un libro che parlasse di PIC "dando del tu" al lettore. la tecnologia che ha sostituito rapidamente quella OTP. Il PBE è stato riorganizzato e rielaborato con la preziosa esperienza di Maurizio Del Corso che. Questo libro nasce infatti su un successo: il PIC BY EXAMPLE (noto anche come PBE). Antonio Cirella Editore VII . ai nostri giorni. affascinando per la sua compattezza.Prefazione Era la fine del 1991 quando misi per la prima volta i miei occhi su un data-book della Microchip. lavorando a quattro mani con Tiziano Galizia. esaustiva e di indubbio aiuto per ogni neofita appassionato. Erano gli anni in cui la famiglia 5x. che nel 1997 il co-autore Tiziano Galizia scrisse con grande entusiasmo insieme a Sergio Tanzilli e lo pubblicò in una esordiente Internet. si trattava di un PIC17C42 "Preliminary". per le prestazioni inarrivabili ad una semplicità spesso disarmante. ha prodotto una trattazione ottimale. Molti anni anagrafici (purtroppo) sono passati da allora. non in senso letterale ma permettendo una rapida assimilazione dei concetti apprendendoli in modo molto pratico. Ciononostante. con il glorioso PIC16C54 rappresentava l'unico paniere di prodotti OTP a buon mercato disponibili (letteralmente) sulla piazza. ma molti di più tecnologicamente parlando. In quel periodo andava molto di moda stampare i data-book con questa scritta trasversale.

.

IX . Tra gli esempi applicativi vengono proposti la gestione di un display LCD. la gestione di una connessione RS232. la gestione di una tastiera ed un esempio di gestione della EEPROM interna mediante la realizzazione dello storico gioco elettronico “SIMON”. A corredo del volume è allegato un CDROM contenente tutta la documentazione tecnica relativa ai PICmicro. Le nozioni trattate nel presente volume possono essere facilmente applicate ad altri modelli di PICmicro rendendo il testo non solo un punto di partenza. benché la letteratura in materia sia abbondante. rendendo molto semplice la comprensione di questi affascinanti dispositivi. i file sorgenti e compilati relativi ai progetti trattati e le versioni dimostrative di vari pacchetti software utili alla realizzazione di progetti con i PICmicro. il timer TMR0 e la sua utilizzazione mediante il prescaler. Viene analizzata l’architettura interna con riferimento alle porte di I/O ed i relativi stadi di ingresso ed uscita. Il testo tratta in maniera esaustiva il microcontrollore PIC16F84A e le sue applicazioni circuitali. non è sempre immediato capire nel dettaglio come utilizzare questi dispositivi per trarne il massimo delle prestazioni. seguendo un approccio prevalentemente pratico in modo da realizzare semplici progetti fin dalle prime pagine.Introduzione Conoscere a fondo un microcontrollore non significa solo averne compreso le sue funzioni e le sue potenzialità. il power-down mode e la gestione dei vari meccanismi di reset nonché l’uso del watchdog timer e la scrittura/lettura dati della EEPROM interna. L’intento di questo volume è accompagnare il lettore alla scoperta dei microcontrollori PICmicro. Gli argomenti sono trattati attraverso semplici circuiti di esempio il cui codice viene analizzato riga per riga in modo da spiegarne la funzione fin nei minimi dettagli. Tuttavia. Vengono illustrate le tecniche di gestione mediante interruzioni. Per rendere il lettore autonomo nella realizzazione dei vari progetti. viene illustrato l’uso dell’ambiente MPLAB di Microchip che consente la creazione e modifica dei file sorgenti e la relativa compilazione mediante una interfaccia “user friendly”. ma anche un utile manuale da tenere sempre a portata di mano. ma significa soprattutto disporre di uno strumento potentissimo per la realizzazione di sistemi elettronici ottimizzati per la gestione ed il controllo di apparecchiature anche molto complesse. l’ambiente di sviluppo MPLAB. A completamento della trattazione vengono analizzate tutte le istruzioni supportate da PIC16F84A incluse le macro-istruzioni e molte delle direttive dell’assemblatore MPASM.

.

nella storia dell’elettronica. che con la sua allegria e curiosità ha tentato incessantemente di spegnere il mio computer dopo aver scoperto a cosa serviva quel “misterioso” pulsante nero. che vedendomi lavorare da solo in ufficio. Infine un ringraziamento a voi lettori che avete deciso di acquistare il libro. Ai miei amici.nel “lontano” 1997. a pieno diritto. Il corso è ancora visibile all’indirizzo www. amico di vecchia data. con la speranza e. I nostri ringraziamenti vanno anche ad Antonio Cirella (Direttore Responsabile della rivista Fare Elettronica – www.PIC BY EXAMPLE . Maurizio Del Corso Vorrei dedicare questo mio lavoro alle persone che amo di più. per la stesura del corso originale . senza peccare di presunzione “certezza”. il mio piccolo Julian.tanzilli. Tiziano Galizia XI .com) per averci convinto a portare avanti questo progetto e per il grande supporto morale e logistico che ci ha accompagnato durante tutto il lavoro di stesura del testo.com ed è stato tradotto in diverse lingue. che vi tornerà molto utile per comprendere questi microcontrollori ormai entrati. che ha avuto tanta pazienza nel sopportare le notti passate al computer. la dolcissima Gaia.Ringraziamenti Sono doverosi i ringraziamenti a Sergio Tanzilli. Possiamo sicuramente affermare che migliaia di utenti hanno iniziato la loro avventura con i PICmicro seguendo proprio questo corso. guardando incessantemente il DVD di “Topo Gigio” sull’altro computer.farelettronica. Mia moglie Angela. ha voluto tenermi compagnia ogni giorno. dandomi la tranquillità necessaria a poter completare il libro.

.

Il gruppo d’investitori fondò quello che oggi è noto come Microchip Technology e questi microcontrollori diventarono il loro prodotto di punta. non tutti disponevano di alcune caratteristiche comuni come l’interrupt e usavano un inconsueto sistema di paginazione della memoria (ancora oggi utilizzato su alcuni modelli).INTRODUZIONE AI PICMICRO UN PO’ DI STORIA Microchip Technology Incorporated è stata fondata da un gruppo di investitori che vide il potenziale di mercato nella linea di semiconduttori della General Instruments che allora produceva diversi componenti elettronici. ma la caratteristica ancora più interessante era la possibilità di disporre di correnti. periferiche seriali e parallele ed altro ancora. in grado di eseguire una istruzione per ciclo di clock alla frequenza massima di 20 Mhz (attualmente i PICmicro della famiglia 18 raggiungono la frequenza di 40 MHz). in uscita ad ogni pin. la General Instruments valutò che non valesse la pena mantenere la divisione microcontrollori e quindi decise di venderla al gruppo di investitori. consentendo a Microchip di sviluppare nuovi modelli con caratteristiche migliori.1 . comparatori. la famiglia a 8 pin (PIC12) ideale per impieghi in prodotti a basso costo. il mercato rispose in modo incoraggiante. Molto presto la Microchip introdusse la prima famiglia di microcontrollori con memoria OTP (One Time Programming) che. Inizialmente i modelli disponibili erano pochi. Per ragioni sconosciute. in pratica PIC (ecco svelato il significato della sigla). consentendo la programmazione diretta del chip. Di fatto erano dei microcontrollori molto semplici. A/D. Questo ne aumentò in maniera considerevole la richiesta soprattutto da parte di piccole aziende. quando i prodotti concorrenti difficilmente superavano la decina di milliAmpere. La grande offerta di prodotti (alcune centinaia di modelli) e l’enorme flessibilità 1 . Era il 1990. La General Intruments aveva a catalogo anche una interessante linea di microcontrollori programmabili. A dispetto di queste limitazioni. In seguito si aggiunsero le prime famiglie con memoria FLASH. costruiti attorno ad un’architettura RISC (Reduced Instructions Set Code). permettevano di evitare gli alti costi di mascheratura delle allora comuni memorie di tipo ROM (Read Only Memory). e le famiglie ad alte prestazioni ed alto numero di pin (PIC17/18/dsPIC). Questo faceva del PIC un microcontrollore a 8 bit relativamente veloce. di circa 20 mA.Introduzione ai PICmicro 1 . insieme alla fabbrica di Chandler in Arizona. tra le quali: interrupt. chiamata Peripheral Interface Controllers.

utilizzato nella presente trattazione. In particolare. si ottiene dividendo la frequenza di clock per quattro. si presentano esternamente come dei normali circuiti integrati TTL o CMOS. Questo tipo di memoria può essere scritta migliaia di volte. Figura 1. nel PIC16F84A.offerta dai microcontrollori PIC. i PIC. rendendola ideale per impieghi hobbistici. in un unico dispositivo.1: Il PIC16F84A Come si può notare dalla figura 1.Introduzione ai PICmicro . La potenza di calcolo di una CPU si misura in milioni d’istruzioni per secondo (MIPS) e. decretò il definitivo successo della Microchip. in questo caso un PIC16F84A. tutti i circuiti necessari a realizzare un completo sistema digitale programmabile. per lo sviluppo o per tutte quelle applicazioni che richiedono un aggiornamento frequente del codice. ma internamente dispongono di tutti dispositivi tipici di un sistema a microprocessore. questa memoria è di tipo FLASH. ovvero componenti che integrano. INTRODUZIONE AL PICMICRO I PICmicro. 2 1 .1. rendendo questa azienda il primo produttore mondiale di microcontrollori a 8 bit. nel caso dei PIC. sono circuiti integrati appartenenti alla categoria dei microcontrollori. Memoria programma (FLASH) Nella memoria programma sono memorizzate le istruzioni da eseguire: il programma. ovvero: CPU (Central Processor Unit) La CPU è il “cervello” del microcontrollore in quanto si occupa di interpretare le istruzioni di programma. che per semplicità da ora in poi chiameremo PIC.

ecc. porte seriali. anche in quei circuiti che fino a poco tempo fa erano destinati ad essere realizzati con circuiterie tradizionali. contatori. convertitori AD. bus. togliendo la tensione di alimentazione al microcontrollore. i dati memorizzati andranno perduti. Dispositivi ausiliari Una serie di dispositivi ausiliari. quindi.Introduzione ai PICmicro 3 . i dati rimarranno memorizzati.Memoria RAM (Random Access Memory) La memoria RAM è usata per memorizzare le variabili utilizzate dal programma. pulsanti. La presenza di tutti questi dispositivi. quindi. 1 . Figura 1. consente al progettista di avvalersi degli enormi vantaggi derivanti dall'uso di un sistema a microprocessore. togliendo la tensione di alimentazione al microcontrollore. Si utilizzano per pilotare dispositivi esterni o ricevere segnali da sensori. Memoria EEPROM (Random Access Memory) La memoria EEPROM è usata per memorizzare le variabili utilizzate dal programma. in uno spazio veramente contenuto. quali: generatori di clock. più che sufficiente a pilotare piccoli carichi come i LED. eccetera. È una memoria di tipo permanente. Una delle particolarità che differenziano i PIC da altri dispositivi analoghi è la corrente di uscita disponibile. Linee di I/O (Input/Output) Le linee d’ingresso e uscita. È una memoria di tipo non permanente.2: Schema a blocchi di un microcontrollore di nuova generazione.

Una descrizione dettagliata delle tipologie di PICmicro è disponibile presso il sito web della Microchip. Si parte dai modelli più piccoli. i sistemi di sviluppo ed altri componenti prodotti dalla Microchip. esempi di applicazioni e aggiornamenti disponibili. software di supporto. 4 1 . quantità e tipo di memoria e per dotazione di dispositivi. raggiungibile all’indirizzo www. I PIC sono disponibili in un'ampia gamma di modelli per meglio adattarsi alle esigenze di progetto specifiche. identificati dalla sigla PIC12 e dotati di soli 8 pin.Nota La potenza di calcolo di un PIC si ottiene dividendo per quattro la frequenza di clock.Introduzione ai PICmicro . differenziandosi per: numero di linee di I/O.com contenente una grande quantità di informazioni tecniche. fino ad arrivare ai modelli più grandi con sigla PIC18 dotati di 40 e più pin.pdf che riporta le caratteristiche di tutti i modelli di PICmicro disponibili.microchip. Ad esempio: 20 MHz / 4 = 5 MIPS. Nel CD allegato Nella cartella \Documentazione trovate il file Microchip_Line_Card.

oltre ad essere particolarmente adatto per scopi didattici. Questo modello di PICmicro.Introduzione ai PICmicro 5 . è uno dei più economici e facilmente reperibili anche per l’hobbista.0 a 5. CPU e memoria • 35 istruzioni single word (tutte le istruzioni sono eseguite in un solo ciclomacchina.5 V (dipende dai modelli) Periferiche • Timer0: 8-bit timer/counter con prescaler a 8-bit • Watch-Dog timer (WDT) con oscillatore RC interno • 13 pin di I/O capaci di erogare fino a 25mA di corrente Figura 1.PIC16F84A IL MICROCONTROLLORE UTILIZZATO IN QUESTO LIBRO Prima di entrare nel vivo della sperimentazione. è necessario analizzare in dettaglio il microcontrollore che verrà utilizzato: il PIC16F84A. oramai storico.3: Piedinatura del PIC16F84A 1 . tranne quelle di salto e confronto che richiedono due cicli) • Velocità operativa massima: 20 MHz (5 MIPS) • 1 KB di memoria programma (FLASH) • 68 bytes di memoria dati (RAM) • 64 bytes di memoria dati (EEPROM) • Programmazione in-circuit (ICSP™) • SLEEP mode • 4 differenti tipi di oscillatore selezionabili • Basso consumo di corrente • Alimentazione da 2.

se portato a livello logico basso provoca il reset del dispositivo OSC2 O Uscita per il quarzo dell’oscillatore CLKO O I 4 MCLR 17 18 1 2 3 6 7 8 9 10 11 12 13 5 14 RA0 RA1 RA2 RA3 RA4 T0CKI RB0 INT RB1 RB2 RB3 RB4 RB5 RB6 RB7 VSS VDD I/O Digital I/O I/O Digital I/O I/O Digital I/O I/O Digital I/O I/O Digital I/O .1: Descrizione dei pin del PIC16F84A 6 1 .se configurata come uscita è di tipo Open Drain I I Ingresso di clock per Timer0 Interrupt esterno I/O Digital I/O I/O Digital I/O I/O Digital I/O I/O Digital I/O I/O Digital I/O I/O Digital I/O I/O Digital I/O I/O Digital I/O Terminale di riferimento per le tensioni (GND) Terminale positivo di alimentazione Tabella 1.Introduzione ai PICmicro .# Nome I/O Descrizione 16 15 OSC1 CLKI I I Ingresso per il quarzo dell’oscillatore Ingresso per un clock esterno In modalità RC su questo pin è disponibile un segnale di 1/4 della frequenza di clock che denota un ciclo istruzione Ingresso Master Clear (Reset) .

4 è riportato lo schema a blocchi della struttura interna del PIC16F84A. 1 .4: Schema a blocchi del PIC16F84A Nel corso della trattazione verranno analizzate le funzioni di tutte le periferiche e la loro gestione mediante istruzioni assembler.Struttura interna Nella figura 1. Le periferiche presenti sono le seguenti: • • • • • • • 13 porte I/O per l’interazione col mondo esterno 68 byte di memoria RAM 1024 locazioni di memoria FLASH per i programmi 64 byte di memoria non volatile (EEPROM) Timer TMR0 Watchdog timer Timer per la gestione del dispositivo al reset Figura 1.Introduzione ai PICmicro 7 .

5: Memoria programma per un PIC16F84A 8 1 .5 è riportata la struttura della memoria programma per il PIC16F84A. Nella figura 1. I due blocchi hanno un bus dedicato pertanto l’accesso a ciascun blocco può avvenire durante lo stesso ciclo di clock. Figura 1. L’indirizzamento è ciclico per cui riferendosi ad esempio all’indirizzo 0x0400 (il primo successivo a 0x03FF) equivale a riferirsi all’indirizzo 0x0000.Introduzione ai PICmicro . L’indirizzo 0x0000 è noto anche come Reset Vector ed è l’indirizzo caricato nel Program Counter al reset.Organizzazione della memoria programma Il PIC16F84A è provvisto di due blocchi di memoria: memoria programma (program memory) e memoria dati (data memory). La memoria programma per il PIC16F84A è composta da 1024 locazioni di 14 bit ciascuna ed indirizzate da 0x0000 a 0x03FF.

Introduzione ai PICmicro 9 . Ciascun banco è a sua volta suddiviso in due aree dette SFR (Specific Function Register) e GPS (General Purpose Register). L’area SFR consente di monitorare e controllare le periferiche ed occupa le 1 .6: Struttura della memoria dati È possibile selezionare uno dei due banchi utilizzando specifici bit del registro STATUS come verrà spiegato più avanti.Organizzazione della memoria dati La memoria dati è suddivisa in due banchi denominati Bank0 e Bank1. Figura 1.

L’area GPR è costituita invece da 68 locazioni nel banco 0. Le corrispondenti locazioni del banco 1 sono equivalenti a quelle del banco 0 per cui indirizzare la cella 0x0C del banco 0 o la cella 0x8C del banco 1 è perfettamente equivalente. Nel CD allegato Nella cartella \Documentazione trovate il file PIC16F84A. Nota Il contenuto degli indirizzi di memoria non implementati (quindi gli indirizzi da 50H a 7FH del banco 0 e da D0H a FFH del banco 1) vengono letti come zero logico.prime 12 locazioni di ciascun banco. 10 1 .pdf che è il data-sheet del PIC a cui la trattazione fa riferimento.Introduzione ai PICmicro .

elettroshop. tuttavia consigliamo l’uso di una scheda di prototipazione per PICmicro in modo da ridurre al minimo il tempo di realizzazione oltre ad evitare grossolani errori nel montaggio.Gli strumenti necessari 11 . non preclude la corretta preparazione ed esecuzione dei vari esperimenti.1: Una panoramica della scheda easyPIC2. verrà fatto riferimento alla scheda di prototipazione easyPIC2 prodotta da Mikroelektronika e acquistabile presso il distributore italiano www.2 .com. Il lettore può realizzare i circuiti impiegando una breadboard o una scheda millefori. Ovviamente una scelta diversa. Vista la grande flessibilità ed il costo decisamente contenuto. è necessario realizzare di volta in volta il circuito comprendente il PIC16F84A e gli altri componenti eventualmente necessari. Figura 2.GLI STRUMENTI NECESSARI L’HARDWARE Una scheda di prototipazione Per eseguire gli esercizi proposti nel testo. da parte del lettore. 2 .

8.DIP28 e DIP40. 5. Display led a 7 segmenti 4 cifre. 13. 16. 7. 12. 10. Questo permette di monitorare i lo stato dei segnali digitali presenti sui pin. 17. Se SW1 non è nella posizione ON. 14. Programmatore USB caratterizzato da alta velocità e flessibilità. I pin RA2 ed RA3 del micro sono collegati a due trimmer in modo da poter disporre di due ingressi analogici variabili da 0V a 5V. 11. E’ possibile scegliere se la pressione di un pulsante provochi il livello alto o il livello basso del relativo ingresso. DIP18. 12 2 .5°C. Con riferimento alla figura 2. 14. 6.1. 15. 4. Predisposizione per sensore di temperatura DS1820 che consente di misurare temperature con un accuratezza di 0. 2. La port A è connessa ad una rete di resistori mediante il dip switch SW1. DIP14. In quest’ultimo caso non è necessario l’impiego di un alimentatore esterno. Predisposizione per la connessione di un display LCD compatibile con il controller HD44780. pilotato in modalità multiplex in modo da utilizzare il minimo numero di I/O del micro. La funzione di pull-up o pull-down per le varie porte può essere selezionata mediante questi jumper. E’ possibile regolare il contrasto del display LCD eventualmente connesso alla scheda.Gli strumenti necessari . alla port A non viene collegato nessun pull-up o pull-down. Questi dip switch consentono di scollegare fisicamente i led dai pin del micro. Alimentatore a 5V per i dispositivi presenti sulla scheda. Può essere infatti pilotato da un software che. È possibile anche selezionare quale delle quattro cifre dovrà essere abilitata. consentendo lo sviluppo di applicazioni per tutte le famiglie di PICmicro. Sezione di comunicazione RS232: è possibile selezionare su quali pin del micro indirizzare i segnali Rx e Tx. Tutti i jumper ed i componenti presenti sulla scheda sono contrassegnati con un identificatore per poter avere un eventuale riferimento diretto con lo schema elettrico. 9. 3. ecco cosa mette a disposizione la scheda: 1. accetta tensioni d’ingresso da 7V a 15V sia in corrente continua che alternata. LED connessi ad ogni pin del micro. 32 pulsanti per pilotare gli ingressi del micro. Questo jumper permette di selezionare la fonte di alimentazione tra una esterna o direttamente dal bus USB. 28 e 40 pin. Area “millefori” per utilizzare specifici componenti. E’ possibile selezionare a quali porte saranno connessi i LED. consente la programmazione dei micro anche più recenti. 18. se mantenuto aggiornato. Supporto per micro in package DIP8.La scheda easyPIC2 consente lo sviluppo di applicazioni impieganti PICmicro a 8.

com. È buona norma collegare un condensatore ceramico da 100 nF tra il Vdd e il Vss. il circuito di alimentazione a 5V. Nel caso della easyPIC2 il programmatore si trova già a bordo della scheda che viene collegata ad un PC tramite un cavo USB. tenendo le piste di collegamento il più corte possibile. sarà necessario costruire. consigliamo sicuramente di partire visitando il sito www. In rete si trovano moltissimi siti che propongono schemi elettrici di programmatori per PIC. Se per gli esperimenti viene usata una qualsiasi scheda di prototipazione (come ad esempio la easyPIC2) il problema non si pone in quanto tali schede prevedono un circuito di alimentazione. una ricerca su Google (www. In alternativa. se il circuito viene realizzato su una breadboard o su una scheda millefori. consente mediante opportuno software.com) produrrà molti risultati. Figura 2. viene scaricato all’interno del micro.2 è riportato lo schema elettrico di un alimentatore stabilizzato a 5 V.Un programmatore Una volta messo a punto il programma per il micro. Alimentazione dei circuiti Ovviamente tutti i circuiti presentati nel testo necessitano di una tensione di alimentazione di 5V per il corretto funzionamento. si rende necessaria una fase di programmazione in cui tale programma. in modo da filtrare eventuali disturbi. Chi ha deciso di realizzare i montaggi su millefori o breadboard. Per semplicità in figura 2.Gli strumenti necessari 13 . una volta collegato al PC.ic-prog.google. un circuito sul quale viene inserito il PIC da programmare e. una volta per tutte. Al contrario. correttamente compilato (firmware). la programmazione del micro. avrà necessità di un programmatore e una alternativa all’acquisto è l’autocostruzione. Per questa fase è necessario disporre di un programmatore di PIC. 2 .2: Schema elettrico della parte di alimentazione La tensione di alimentazione di 5 volt viene inviata al pin Vdd (pin 14) mentre il pin Vss (pin 5) viene collegato al negativo di alimentazione. realizzato con il comunissimo LM7805.

L’editor di testi è di tipo “intelligente” ovvero una volta determinato il tipo di file da editare.microchip. Figura 2. La stesura del programma verrà affrontata più avanti.asm il file così creato. Mentre per il primo è possibile usare anche il famoso Blocco Note (Notepad) di Windows. A seguito della compilazione si aprirà una finestra di output 14 2 . per inserire il file nel progetto basta cliccare con il tasto destro su “Source Files” nella finestra di riepilogo del progetto e scegliere “Add File” (come mostrato nella figura 2. A questo punto. MPLAB è un software gratuito che comprende un editor di testi ed un compilatore assembler disponibili in un unico ambiente. La prima cosa da fare è dunque iniziare un nuovo progetto cliccando sull’icona come mostrato in figura 2.3: Creazione di un nuovo progetto in MPLAB Una volta creato il nuovo progetto dovrà essere creato il primo file da inserire nel progetto e questo può essere fatto scegliendo “New” dal menu “File” e salvare con estensione .3 oppure scegliendo “New” dal menu “Project”.IL SOFTWARE MPLAB: editor e compilatore Per lo sviluppo di applicazioni con PICmicro sono necessari un editor di testi ed il compilatore assembler.com l’ultima versione di MPLAB. dalle variabili e dai commenti ed utilizza diversi colori rendendo molto più leggibile il codice. il compilatore assembler viene fornito gratuitamente da Microchip.Gli strumenti necessari .4) quindi selezionare il file precedentemente salvato. è possibile infatti scaricare dal sito www. In realtà Microchip offre molto di più di un semplice compilatore. il programma distingue le istruzioni programma dalle costanti. Struttura ed uso di MPLAB Una applicazione sviluppata in MPLAB è costituita da un Progetto all’interno del quale si trovano tutti i file sorgenti e di libreria utilizzati. La compilazione dell’applicazione può essere effettuata scegliendo “Build All” dal menu “Project”.

ma che potrebbe risultare un ostacolo in caso di programmatori autocostruiti.microchip. questo dovrà essere caricato nel micro tramite il programmatore come già accennato in precedenza.icprog. Il software per la programmazione Una volta creato il file eseguibile. Nel CD allegato Nella cartella \Software\MPLAB trovate i file di installazione per MPLAB 7.Gli strumenti necessari 15 . Icprog supporta molti micro e molti programmatori oltre a disporre dei driver necessari per il funzionamento sotto windows2000 e XP. si consiglia di usare il software gratuito icprog scaricabile dal sito www.in cui verranno elencati gli eventuali errori commessi ed attraverso la quale l’utente sarà informato circa l’esito dell’operazione di compilazione. Il problema non si pone se si usa un programmatore di tipo commerciale o si è optato per l’uso della easyPIC2.com.4: Aggiunta di un file al progetto Nei capitoli successivi sarà illustrato dettagliatamente l’uso di MPLAB analizzando le potenzialità di questo ambiente di programmazione.com.0 Per l’ultima versione rilasciata da Microchip consigliamo di visitare il sito www. Figura 2. Se si sta usando un programmatore “fatto in casa”. 2 . Il programmatore viene gestito da PC mediante un opportuno software che generalmente viene fornito con il programmatore stesso.

.

Grazie alla circuiteria interna di reset di cui il PICmicro è dotato. non è necessario collegare.Un semplice lampeggiatore a led 17 . 3 . LO SCHEMA ELETTRICO Il pin MCLR (pin 4) comanda il reset del PICmicro.UN SEMPLICE LAMPEGGIATORE A LED Come primo esempio di applicazione verrà realizzato un circuito molto semplice il cui scopo è quello di far lampeggiare un diodo LED.1: Schema elettrico del lampeggiatore a LED. Figura 3. utilizzando il PIC16F84A. pulsanti o circuiti RC per ottenere il reset all'accensione. al pin MCLR. In particolare questa applicazione illustrerà come scrivere un programma assembler. Più avanti verrà mostrato come sia possibile abilitare o disabilitare questa funzione direttamente nel codice sorgente. come compilarlo e come trasferirlo nella memoria flash del micro per essere eseguito. Normalmente è mantenuto a 5 volt tramite la resistenza di pull-up R1 (10k) e deve essere portato a zero (massa) ogni qualvolta si intende resettare il dispositivo.3 .

XT o LP). per la generazione del clock. in questo caso. in particolare. nel circuito di figura 3. L’utilizzo di un quarzo ad uscita seriale potrebbe generare una frequenza al di fuori delle specifiche del costruttore. Il PIC16F84A può operare in quattro differenti modalità di oscillatore ed è possibile agire su due bit di configurazione (FOSC1 e FOSC2) per selezionare una di queste quattro modalità.1. • • • • LP XT HS RC Low Power Crystal Crystal/Resonator High Speed Crystal/Resonator Resistor/Capacitor Nelle modalità XT. Figura 3. utilizzata per temporizzare tutti i cicli di funzionamento interni al chip. In modalità XT.1 il segnale di clock è ottenuto utilizzando un quarzo esterno da 4MHz. Nello schema di figura 3.I pin OSC1/CLKIN (pin 16) e OSC2/CLKOUT (pin 15) sono collegati internamente al circuito per la generazione della frequenza di clock. tuttavia questo non è l’unico modo per generare il segnale di cadenza. l’oscillazione viene generata connettendo ai pin OSC1/CLKIN e OSC2/CLKOUT un risonatore ceramico o a cristallo come indicato nella figura 3.2.Un semplice lampeggiatore a led . Nel caso del PIC16F84A-20/P tale frequenza può raggiungere un massimo di 20 Mhz. Il pin RB0 (pin 6) è una delle linee di I/O (Input/Output) disponibili che. La generazione del segnale di clock Come già osservato in precedenza. LP o HS il 18 3 . LP o HS. Il design dell’oscillatore del PIC16F84A richiede l’utilizzo di un quarzo ad uscita parallela. è stata collegata al LED tramite una resistenza di limitazione da 470 Ω. Da questa frequenza (in letteratura indicata con Fosc) dipende la quasi totalità delle operazioni interne ed. la velocità con cui il PICmicro esegue le istruzioni del programma. da cui si ottiene una velocità di esecuzione delle istruzioni pari a 5 milioni di istruzioni al secondo (Fosc/4).2: Oscillatore al quarzo/ceramico (modalità HS. è stato utilizzato un quarzo esterno da 4 MHz e due condensatori da 22 pF.

Tabella 3. sul pin OSC1/CLKIN.3). Oltre a questi parametri è opportuno tenere in considerazione anche le tolleranze dei componenti esterni utilizzati. Questo comporta un notevole risparmio rispetto all’inserimento di un quarzo a scapito della precisione della frequenza ottenuta. Questi valori sono solo di riferimento e. Valori testati Modalità XT HS Frequenza 455 kHz 2.5 MHz è raccomandato l’utilizzo della modalità HS invece della XT. Nota Quando si usa un risonatore con frequenze al di sopra di 3. è consigliabile consultare il produttore del risonatore per gli appropriati valori dei componenti esterni.dispositivo può essere pilotato. 3 .Un semplice lampeggiatore a led 19 . dai valori di R e C inseriti e dalla temperatura alla quale il dispositivo si trova ad operare.4 mostra la connessione di una rete RC ad un PIC per la generazione del clock.0 MHz 10. Figura 3.1: Selezione delle capacità per i risonatori ceramici.0 MHz OSC1/C1 47 – 100 pF 5 .3: Sorgente di clock esterno (modalità HS.33 pF 15 – 33 pF Nota: Capacità alte migliorano la stabilità dell’oscillatore.33 pF 15 – 33 pF OSC2/C2 47 – 100 pF 5 . ma aumentano il tempo di start-up.33 pF 15 – 33 pF 5 .0 MHz 8. da una fonte esterna di clock (figura 3. è possibile generare il segnale di cadenza utilizzando una rete RC esterna realizzando quindi un oscillatore RC. La frequenza dell’oscillatore RC dipende infatti dalla tensione di alimentazione. Per applicazioni in cui la precisione e la stabilità della frequenza di clock non è un parametro critico. visto che ogni risonatore ha le proprie caratteristiche. XT o LP).0 MHz 4. La modalità HS può essere usata a qualsiasi Vdd per la quale il microcontrollore è certificato.33 pF 15 – 33 pF 15 . La figura 3.

Figura 3. Nelle figure seguenti sono riportati gli andamenti della frequenza ottenuta mediante una rete RC esterna al variare della tensione di alimentazione Vdd per diversi valori di REXT e CEXT.4: Oscillatore RC.Un semplice lampeggiatore a led . 20 3 .

3 .Un semplice lampeggiatore a led 21 .

Un semplice lampeggiatore a led . La stringa dell’esempio precedente espressa in notazione esadecimale diviene: 0x0100 Questo rappresenta esattamente lo stesso valore ma in forma più compatta (una cifra esadecimale corrisponde infatti a 4 cifre binarie). ma anche variabili. Un esempio di istruzione in notazione binaria è riportato di seguito: 00 0001 0000 0000 ovvero una sequenza di 14 cifre binarie (0 o 1). In inglese questa azione è espressa con la frase CLEAR W REGISTER. effettua l'azzeramento del registro W (operazione che verrà analizzata più in dettaglio più avanti). Lo stesso valore può essere rappresentato in assembler con la notazione H'0100'. che aiuta a ricordare la funzione svolta da ciascuna istruzione. Un programma è costituito da una sequenza di istruzioni. ognuna delle quali identifica univocamente una funzione che il PICmicro deve svolgere. la forma mnemonica dell’operazione 0x0100. per questioni di compattezza di scrittura. sono gli unici che il PICmicro è in grado di comprendere. Tale memoria nel PIC16F84A è di tipo FLASH e dispone di 1024 locazioni ognuna delle quali è in grado di contenere una sola istruzione oppure una coppia istruzione/dato. La 0x in testa al valore indica che il numero che segue è da interpretarsi espresso in notazione esadecimale. anche per il PICmicro è necessario preparare un programma per farlo funzionare. completamente privi di senso per un essere umano. costanti ed etichette (label). Per fortuna esistono alcuni strumenti che consentono di facilitare il compito al programmatore rendendo le istruzioni decisamente più comprensibili. Altre sigle mnemoniche consentono di definire non solo tutte le istruzioni che il PICmicro è in grado di eseguire. 22 3 . Per convenzione. Ogni istruzione è rappresentata da una stringa di 14 bit ed è memorizzata in una locazione di memoria dell'area programma. la stringa di 14 bit viene rappresentata in notazione esadecimale. ad ogni operazione è stata associata una breve sigla detta mnemonica. ovvero "AZZERA IL REGISTRO W" che nella forma abbreviata diventa CLRW. Generalmente.SCRITTURA E COMPILAZIONE DI UN PROGRAMMA ASSEMBLER Come per qualsiasi sistema a microprocessore. L'insieme di queste sigle e le regole con cui usarle per formare un programma completo è chiamato LINGUAGGIO ASSEMBLER. Questi codici. La stringa 0x0100 dell'esempio precedente.

L'estensione di questo file deve essere . Il programma che esegue questa “traduzione” è detto compilatore assembler o assemblatore. parametri. Il file di testo contenente il programma (sotto forma di sequenza di istruzioni mnemoniche) è denominato sorgente o sorgente assembler. Come già detto precedentemente.Per scrivere un programma in linguaggio assembler occorre: • Conoscere il set d’istruzioni disponibili sul microcontrollore che s’intende utilizzare (in questo caso il PICmicro). ecc.5 è schematizzato il flusso di operazioni ed i file generati. • Conoscere le regole sintattiche per definire variabili. nella giusta sequenza d’istruzioni in formato binario che il PICmicro è in grado di capire. Per la creazione del file ASM si consiglia l’uso dell’editor di MPLAB.5: Le operazioni per la programmazione di un PIC. Figura 3. Nella figura 3.Un semplice lampeggiatore a led 23 . Il passo successivo consiste nel tradurre il sorgente assembler. la prima operazione da effettuare è la scrittura del sorgente e la sua memorizzazione in un file di testo. necessari ad ottenere un PICmicro programmato. • Disporre di un editor di testo con cui digitare il programma.ASM. tuttavia è possibile generare questo file anche con programmi di elaborazione testi come Notepad o qualunque altro software in 3 .

Il compilatore assembler è MPASM prodotto dalla Microchip ed è integrato nell’ambiente MPLAB.LST è un file di testo in cui viene riportato l'intero sorgente assembler e la corrispondente traduzione in opcode.grado di salvare i file in formato TXT.5. In questo caso il file è il P16F84A.HEX non è un file in formato binario.INC. I files . ma con una estensione diversa. Il passo successivo è la compilazione del sorgente. differente a seconda del tipo di PICmicro utilizzato. Il file . Il file sorgente utilizzato in questa prima applicazione è il file LED. ma è estremamente utile per verificare i processi di compilazione che ha eseguito l'assemblatore. Questo sorgente contiene alcune definizioni dipendenti dal chip utilizzato che verranno analizzate più avanti. Non è utilizzabile per la programmazione del PICmicro. bensì un file codificato in un formato stabilito da Intel per la descrizione dei file binari in formato ASCII. Nota Editando il file sorgente con un word processor avanzato.ASM.ASM) in cui sono stati rilevati. Com’è possibile vedere nella figura 3. 24 3 . Senza entrare troppo nei dettagli è utile sapere che tale formato è direttamente riconoscibile da qualsiasi programmatore di PICmicro il quale provvederà a leggere da questo formato gli opcode ed a trasferirli nella memoria del PICmicro.INC. ovvero la trasformazione in opcode dei codici mnemonici o istruzioni assembler in esso contenute. oltre al file sorgente con estensione . l'assemblatore genera una serie di files con il nome identico al sorgente da cui derivano.HEX viene utilizzato realmente per programmare il PICmicro. • .ERR contiene la lista degli errori di compilazione riscontrati ed il numero di linea all'interno del sorgente assembler (.ASM è necessario fornire al compilatore un secondo file prodotto dalla Microchip con estensione .HEX è il file contenente gli opcode da inserire nella memoria programma del PICmicro. Durante la fase di compilazione.ERR vengono utilizzati per il controllo di quanto effettuato in fase di compilazione. Il compilatore viene richiamato automaticamente quando in MPLAB viene dato il comando “Build All” per la compilazione. In particolare si ottengono files con le seguenti estensioni: • . è necessario effettuarne il salvataggio come “solo testo” per rimuovere tutti i caratteri speciali di controllo della formattazione che il compilatore non è in grado di trattare.LST e . • .Un semplice lampeggiatore a led . Solo il file .

Subroutines 3 .Reset Vector .LED MainLoop PORTB.INC" LED EQU 0 ORG 0CH Count RES 2 .LED MainLoop call btfsc goto bsf goto SetToZero bcf goto Delay PORTB. il contenuto del file è stato riportato integralmente di seguito. Conoscere ed usare i PICmicro(R) .Un semplice lampeggiatore a led 25 . LED.Punto d’inizio del programma al reset della CPU ORG 00H bsf STATUS.Tiziano Galizia .ASM.LED MainLoop .ASM: Lampeggiatore ad un led . . Maurizio Del Corso .************************************************** PROCESSOR 16F84A RADIX DEC ERRORLEVEL -302 INCLUDE "P16F84A.LED SetToZero PORTB.RP0 bsf PORTB.ANALISI DI UN SORGENTE ASSEMBLER In questo paragrafo verrà analizzato linea per linea il contenuto del sorgente LED.RP0 movlw 00011111B movwf TRISA movlw 11111110B movwf TRISB bcf STATUS. Per facilitarne la comprensione. (c) 2005.************************************************** .

Delay clrf clrf DelayLoop decfsz goto decfsz goto return END Count Count+1 Count. per scrivere ad esempio il numero esadecimale 10 (16 decimale) dovrà essere esplicitamente espressa la notazione: 0x10 oppure H’10’.Un semplice lampeggiatore a led . 26 3 . sono da intendersi espressi nella notazione specificata dalla direttiva RADIX (DEC sta per decimale). ERRORLEVEL -302 La direttiva ERRORLEVEL consente di escludere la segnalazione di alcuni errori di compilazione.1 DelayLoop Nel CD allegato Nella cartella \sorgenti trovate il file LED.1 DelayLoop Count+1. Avendo specificato RADIX DEC. Scrivendo solamente 10 il compilatore lo interpreterà come 10 decimale. Nella prima linea di codice è riportato: PROCESSOR 16F84A PROCESSOR è una direttiva del compilatore assembler che consente di definire per quale microprocessore è stato scritto il file sorgente. Nel caso dell’esempio viene utilizzata per evitare che il compilatore visualizzi la segnalazione 302 (la segnalazione 302 ricorda di commutare il banco di memoria qualora si utilizzino registri che non stanno nel banco 0).ASM utilizzato per l’esempio. In questo caso il compilatore viene informato che le istruzioni inserite nel file sorgente sono relative ad un PIC16F84A. Le direttive non sono delle istruzioni mnemoniche che il compilatore traduce nel rispettivo opcode. ma sono indicazioni rivolte al compilatore per discriminarne il funzionamento durante la compilazione. RADIX DEC Con la direttiva RADIX il compilatore viene informato che i numeri riportati senza notazione.

Nota Le direttive hanno senso solo durante la compilazione del sorgente. Non sarà quindi possibile inserire istruzioni tipo LED = 3 all'interno del sorgente in quanto l'assegnazione dinamica di un valore ad una variabile è un'operazione che richiede l'intervento della CPU del PICmicro e che quindi deve essere espressa con istruzioni e non con direttive. È importante notare che la parola LED non identifica una variabile. Quest'area coincide con l'area RAM del PICmicro definita dalla Microchip come area dei FILE REGISTER (si vedano anche le figure 1.INCLUDE "P16F84A.INC" Ancora un'altra direttiva per informare il compilatore di includere nel sorgente un secondo file denominato P16F84A. ma semplicemente un nome simbolico valido durante la compilazione. LED EQU 0 La direttiva EQU è molto importante in quanto consente di definire delle costanti simboliche all'interno del file sorgente. Lo scopo principale dell'esistenza della direttiva EQU è quindi rendere i sorgenti più leggibili e consentire di cambiare i valori costanti in un unico punto del sorgente. __CONFIG _XT_OSC & _CP_OFF & _WDT_OFF La direttiva __CONFIG imposta i flag di configurazione che verranno utilizzati dal programmatore in fase di programmazione del micro. quindi un PIC non potrà mai eseguire una direttiva. Il compilatore si limiterà a sostituire la linea contenente la direttiva INCLUDE con il contenuto del file indicato ed effettuare la compilazione come se fosse anch'esso parte del file sorgente. In particolare la parola LED da questo punto in poi del sorgente sarà equivalente al valore 0. Questa direttiva verrà esaminata in dettaglio più avanti in questo capitolo.Un semplice lampeggiatore a led 27 . In questo caso viene definita un'area dati all'interno del PICmicro ovvero un'area in cui memorizzare variabili e contatori durante l'esecuzione del programma.6). I file register altro non sono che locazioni RAM disponibili per l'utente a partire dall'indirizzo 0x0C. 3 . Proseguendo nell’analisi del sorgente si trova la linea: ORG 0x0C Anche ORG è una direttiva e consente di definire l'indirizzo a partire dal quale il compilatore inizia ad allocare i dati o le istruzioni seguenti.5 ed 1.INC. Questo indirizzo di inizio è fisso e non può essere cambiato in quanto le locazioni precedenti sono occupate da altri registri specializzati per uso interno.

RP0 Ecco la prima istruzione mnemonica completa di parametri. 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’.count RES 2 In questa linea sono presenti una label: Count e una direttiva: RES. Da questo punto in poi andranno infatti inserite le istruzioni mnemoniche che il compilatore dovrà convertire negli opportuni opcode per il PICmicro. L'accumulatore è un particolare registro utilizzato dalla CPU in tutte quelle situazioni in cui vengono effettuate 28 3 .6). La label Count (dove Count è un nome scelto dall’utente) è un marcatore che nel resto del sorgente assumerà il valore dell'indirizzo in cui è stato inserito. Dato che precedentemente era stato definito l'indirizzo di partenza a 0x0C con la direttiva ORG. La direttiva RES indica al compilatore di riservare un certo numero di byte o meglio di file register all'interno dell'area dati (in questo caso 2 bytes). bsf STATUS. Anche il parametro RP0 viene definito nel file P16F84A. I PICmicro hanno una CPU interna di tipo RISC per cui ogni istruzione occupa una sola locazione di memoria. I nomi delle label possono essere qualsiasi ad eccezione delle parole riservate al compilatore quali le istruzioni mnemoniche e le direttive). Il valore assegnato in questo file è 0x03 e corrisponde ad un file register (ovvero una locazione ram nell'area dati) riservato (si veda la figura 1.Un semplice lampeggiatore a led . da qui il valore 0x00 inserito nella ORG. opcode e parametri inclusi. Se ad esempio viene inserita una label anche alla linea successiva essa varrà 0x0C + 2 (due sono i byte che sono stati riservati) ovvero 0x0E.INC con valore 0x05H e corrisponde al numero del bit che si vuole mettere a uno. Count varrà 0x0C. Ogni file register è lungo 8 bit e la numerazione di ciascuno inizia 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 ed è necessaria per accedere ai file register del banco 1. Il parametro STATUS viene definito nel file P16F84A. Una label si distingue da una costante simbolica in quanto il suo valore viene calcolato in fase di compilazione e non assegnato staticamente dall’utente. ORG 0x00 Questa seconda direttiva ORG fa riferimento ad un indirizzo in area programma (nella FLASH) anziché in area dati.INC tramite una direttiva EQU. movlw B'00011111' Questa istruzione sta a significare: MOVE LITERAL TO W REGISTER ovvero ‘muovi un valore costante nell'accumulatore W’. Il primo opcode eseguito dal PICmicro dopo il reset è quello memorizzato nella locazione 0.

rappresenta il bit 0 o bit meno significativo (si noti come sia stata specificata la notazione binaria utilizzando la lettera “B”). Le due istruzioni successive svolgono le funzioni appena viste.Un semplice lampeggiatore a led 29 .operazioni tra due valori oppure in operazioni di spostamento tra locazioni di memoria. Nell'istruzione successiva: movwf TRISA il valore 00011111 che si trova in W viene trasferito 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 pratica è un registro di appoggio utilizzato dalla CPU per memorizzare temporaneamente un byte ogni volta che se ne presenta la necessità. Si noti che i bit 5.2: Pin della PORTA dopo il caricamento di 0001111 in TRISA. In particolare ogni bit ad uno del registro TRISA determina un ingresso sulla rispettiva linea della porta A mentre ogni 0 determina un'uscita. 6 e 7 non corrispondono a nessuna linea di I/O e quindi il loro valore non è significativo. ma operando sulla porta B del PICmicro: movlw movwf B'11111110' TRISB in questo caso la definizione delle linee sarà quella riportata nella tabella 3. Nella tabella 3.3. 3 . Il valore costante da memorizzare nell'accumulatore è 00011111 ovvero un valore binario a 8 bit dove.2 viene riportata la configurazione che assumeranno i pin del PICmicro dopo l'esecuzione di questa istruzione: Bit registro TRISA Linea porta A Pin Valore 0 1 2 3 4 5 6 7 RA0 RA1 RA2 RA3 RA4 17 18 1 2 3 1 1 1 1 1 0 0 0 Stato Ingresso Ingresso Ingresso Ingresso Ingresso - Tabella 3. il bit più a destra.

alle direttive ORG e alle altre istruzioni che in qualche modo allocano spazio nella memoria del 30 3 . quindi la linea interessata sarà RB0. All'inizio del sorgente la costante LED era stata definita pari a 0. Una descrizione più dettagliata verrà data più avanti nel testo.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. Il valore della label.Bit registro TRISB Linea porta B Pin Valore 0 1 2 3 4 5 6 7 RB0 RB1 RB2 RB3 RB4 RB5 RB6 RB7 6 7 8 9 10 11 12 13 0 1 1 1 1 1 1 1 Stato Uscita Ingresso Ingresso Ingresso Ingresso Ingresso Ingresso Ingresso Tabella 3. Notate come il valore 0 nel bit 0 del registro TRISB determini la configurazione in uscita della rispettiva linea del PICmicro. In particolare viene acceso il LED collegato alla linea RB0.Un semplice lampeggiatore a led .3: Pin della PORTB dopo il caricamento di 11111110 in TRISB. 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 a cui appartengono TRISA e TRISB.RP0 Questa istruzione è simile alla bsf vista in precedenza. bcf STATUS. viene calcolato in fase di compilazione in base al numero di istruzioni. Nella applicazione di esempio infatti questa linea viene utilizzata per pilotare il LED. È stato visto come l'istruzione movwf trasferisca il valore contenuto nell'accumulatore W (inizializzato opportunamente con l'istruzione movlw B'11111110') nel registro specificato (ad esempio TRISB).LED Con questa istruzione viene effettuata la prima operazione che ha qualche riscontro all'esterno del PICmicro. La sigla in questo caso è l’acronimo di BIT CLEAR FILE REGISTER. MainLoop Questa linea contiene una label ovvero un riferimento simbolico ad un indirizzo di memoria. PORTB è una costante definita in P16F84A. con la sola differenza che azzera il bit anziché portarlo ad uno. come detto in precedenza. bsf PORTB. Il significato di movwf è infatti MOVE W TO FILE REGISTER.

Le subroutine sono delle parti di programma specializzate per effettuare una funzione specifica. Il bit da controllare corrisponde alla linea di uscita cui è collegato il diodo led e. vai a) alla label SetToZero dove si troveranno le istruzioni per spegnere il led.PICmicro. goto SetToZero Questa istruzione è il salto incondizionato (dall'inglese GO TO. Ogni qualvolta è necessaria quella funzione è sufficiente richiamarla con una sola istruzione. In questo caso la subroutine inserisce un ritardo pari al tempo di accensione e spegnimento del led. Le istruzioni che compongono la subroutine Delay sono inserite più avanti in questo stesso sorgente. tramite questo test è possibile determinare se il led è acceso o spento dunque agire di conseguenza: se il led è già acceso verrà spento (saltando alla label SetToZero grazie all’istruzione goto). anziché ripetere ogni volta tutte le istruzioni necessarie ad effettuarla. contando le istruzioni inserite a partire dall'ultima direttiva ORG si ricava il valore che verrà assegnato a MainLoop ovvero 0x07.Un semplice lampeggiatore a led 31 .LED goto MainLoop 3 . se il led è spento verrà acceso saltando (skip) l’istruzione goto. btfsc PORTB. bsf goto PORTB.LED Il significato di questa istruzione è BIT TEST FLAG.LED MainLoop Queste due istruzioni rispettivamente accendono il led e rimandano il programma all'inizio del ciclo di lampeggiamento. In questo caso la label MainLoop viene utilizzata come punto di ingresso di un ciclo (dall'inglese Loop) di accensione e spegnimento del led. In questo caso. Call Delay Questa istruzione determina una chiamata (dall'inglese call) ad una subroutine che inizia in corrispondenza della label Delay. 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. Questa istruzione verrà saltata se il led è già spento. SetToZero bcf PORTB. 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 PICmicro permettendo comunque di referenziare una determinata locazione di memoria. ovvero una parte di codice che verrà ripetuta ciclicamente all'infinito.

In pratica il ritardo viene ottenuto eseguendo migliaia di istruzioni che decrementano un contatore interno e non hanno quindi effetti visibili all’esterno. Ecco come funziona: Delay clrf clrf DelayLoop decfsz goto decfsz goto retlw Count Count+1 Count.1 L'istruzione significa DECREMENT FILE REGISTER. È il tipo di ritardo più semplice da implementare e può essere utilizzato quando non è richiesto che il PICmicro esegua altri compiti mentre esegue il ritardo.1 DelayLoop Count+1.Un semplice lampeggiatore a led . SKIP IF ZERO ovvero decrementa il contenuto di un registro (in questo caso Count e salta l'istruzione successiva se il valore raggiunto è zero). La subroutine Delay Come descritto in precedenza questa subroutine inserisce un ritardo di circa un secondo e può essere chiamata più volte nel sorgente tramite l'istruzione call Delay. Le istruzioni: clrf clrf Count Count+1 CLEAR FILE REGISTER azzerano le due locazioni di ram riservate precedentemente con l'istruzione: Count RES 2 Queste due locazioni sono adiacenti a partire dall'indirizzo referenziato dalla label Count. decfsz Count. Se il valore raggiunto non è zero viene 32 3 . Delay identifica l'indirizzo di inizio della subroutine e viene utilizzato per le chiamate dal corpo principale del programma.Queste due istruzioni rispettivamente spengono il led e rimandano il programma all'inizio del ciclo di lampeggiamento. DelayLoop viene chiamato internamente dalla subrountine e serve come punto di ingresso per il ciclo (dall'inglese loop) di ritardo.1 DelayLoop 0 Delay e DelayLoop sono due label. Questo tipo di ritardo si chiama ritardo software o ritardo a programma.

Un semplice lampeggiatore a led 33 . Quando anche Count+1 avrà raggiunto lo zero l'istruzione: return il cui significato è RETURN FROM SUBROUTINE.1 DelayLoop che decrementano il registro seguente fino a che anche questo raggiunge lo zero.eseguita l'istruzione successiva: goto DelayLoop che rimanda l'esecuzione all'inizio del ciclo di ritardo. Il registro Count+1 in particolare verrà decrementato di uno ogni 256 decrementi di Count. Una volta raggiunto lo zero con il contatore Count vengono eseguite le istruzioni: decfsz goto Count+1. END è una direttiva che indica al compilatore la fine del sorgente assembler. 3 . determinerà l'uscita dalla routine di ritardo ed il proseguimento dell'esecuzione dall'istruzione successiva alla call Delay. Per finire.

LA COMPILAZIONE DI UN SORGENTE ASSEMBLER In questo paragrafo verrà illustrato come effettuare la compilazione di un sorgente assembler usando l’ambiente MPLAB. Se non è stato fatto prima. Facendo un doppio click su led. Facendo click col tasto destro sulla voce “Source Files” e scegliendo “Add Files…” si inserisce il file led. dovrà essere creato un nuovo progetto (come indicato nel capitolo 2) nella directory C:\PIC (sia LED il nome del nuovo progetto creato). Se il tutto è stato eseguito correttamente. è ora il momento di installare l’ambiente MPLAB contenuto nel CD oppure reperire l’ultima versione disponibile direttamente dal sito Microchip (www. il file led. Si scelga ad esempio un nome quale C:\PIC (Qualsiasi altro nome di directory o drive è ovviamente valido.asm verrà aperto il file per la visualizzazione e le eventuali modifiche.microchip. Copiare ora nella directory di lavoro C:\PIC il file LED.asm dovrebbe comparire come sottogruppo di “Source Files” come mostrato in figura 3. Una volta avviato MPLAB. Basterà sostituire nel resto della trattazione tutti i riferimenti a C:\PIC con il nome del drive e della directory scelti).ASM.Un semplice lampeggiatore a led .com). istruzioni). Per prima cosa è opportuno creare sul disco fisso una directory di lavoro in cui da ora in poi verranno memorizzati tutti i file sorgenti utilizzati nel testo. 34 3 . verde scuro per i commenti. Figura 3.6.6: Il progetto in MPLAB.asm nel progetto appena creato. Si noti come nell’editor vengano utilizzati diversi colori: blu per le parole riservate (direttive.

Tutti gli esercizi riportati in questo testo. Un doppio click sulla linea relativa ad un errore porta direttamente all’interno del codice alla linea specifica. Per la programmazione del PICmicro occorre fare riferimento alla documentazione tecnica in dotazione al programmatore utilizzato.LST: file contenenti rispettivamente gli eventuali errori ed il codice assembler come già spiegato in precedenza.MCW: files relativi al progetto creato in MPLAB (hanno il nome del progetto). salvo quando esplicitamente indicato.viola per le label. Questo può essere fatto dal menu “Configure” quindi scegliendo “Select Device…” ed infine selezionando il PIC16F84A nella lista dei PIC disponibili. Prima di compilare il progetto è necessario specificare in MPLAB il tipo di PIC utilizzato. Alcuni di questi però non lo fanno. LED. Qualora vengano rilevati errori. blu per i numeri binari. A seguito della compilazione viene automaticamente aperta in MPLAB una finestra di output in cui è riportato l’esito dell’operazione. utilizzano la seguente configurazione: 1. quindi “Properties…” e scegliendo “Text”: qui oltre al tipo di carattere è possibile scegliere i vari colori (“Choose Colors”) o riportare le impostazioni a quelle predefinite (“Default Colors”). Questi flag determinano alcune modalità di funzionamento del PICmicro quando esso esegue un programma. LED. La configurazione dei flag è indicata nei sorgente d'esempio con la direttiva __CONFIG e dovrebbe essere letta correttamente da quasi tutti i programmatori di PICmicro. LED. I flag di configurazione dei PICmicro Il PICmicro dispone di una serie di flag di configurazione contenuti nella cosiddetta configuration word. È possibile visualizzare ed eventualmente cambiare le impostazioni dei colori mediante il menu “Edit”.ERR.In questa modalità il PICmicro funziona correttamente con un quarzo collegato ai pin OSC1 e OSC2 come indicato negli schemi d'esempio. La compilazione del progetto si avvia dal menu “Project” scegliendo “Build All” o con la combinazione si tasti CTRL+F10.Un semplice lampeggiatore a led 35 . 3 . questi saranno riportati nella finestra di output completi del numero di riga (relativo al file sorgente) alla quale sono stati rilevati. Ora tutto è pronto per scaricare nel PIC16F84A il programma appena compilato.MCP. 2.HEX: contiene il codice oggetto da utilizzare per programmare il PICmicro. LED. Oscillatore in modalità XT .asm: LED. Nella directory C:\PIC vi sono ora nuovi file oltre a led. per cui i flag andranno impostati manualmente prima di iniziare la programmazione. Watch Dog Timer Disabilitato .La funzione del Watch Dog Timer verrà illustrata più avanti.

7) vengono riportati i valori dei bit di configurazione in accordo ala direttiva __CONFIG.7: Lo stato della configuration word in MPLAB 36 3 . Nella nuova finestra che si apre (figura 3. o nella loro impostazione predefinita. Anche mediante MPLAB è possibile agire sulla configuration word attraverso il menu “Configure” quindi scegliendo “Configuration bits…”. _WDT_OFF disabilita il watchdog timer. disabilita la protezione del codice mentre l’ultimo. _CP_OFF. Figura 3.Nel programma di esempio è stata inserita la direttiva __CONFIG _XT_OSC & _CP_OFF & _WDT_OFF Il primo parametro _XT_OSC imposta l’oscillatore in modalità XT.Un semplice lampeggiatore a led . Tutti i software a corredo di programmatori per PIC consentono di visualizzare ed impostare questi flag. il secondo. se specificata nel sorgente. Cliccando poi su ciascuna riga è possibile variare l’impostazione di ciascun parametro. Queste impostazioni nel PIC16F84A vengono scritte nella locazione di memoria di indirizzo 0x2007.

1: La Program Memory ed il Register File 4 . Nella figura 4. Figura 4. Le parti evidenziate sono le componenti che di volta in volta saranno analizzate.Architettura interna del PIC16F84A 37 . in questo caso la Program Memory ed il Register File. quali dispositivi contiene e come interagiscono tra loro.4 .1 è riportato lo schema a blocchi semplificato dell'architettura interna del PIC16F84A.ARCHITETTURA INTERNA DEL PIC16F84A In questo capitolo verrà analizzata la struttura interna di un PICmicro.

L'istruzione che segue immediatamente la direttiva ORG 0x00: bsf STATUS. IL REGISTER FILE Il REGISTER FILE è un insieme di locazioni di memoria RAM ovvero memorie con cui è possibile leggere e modificare il contenuto senza l'ausilio di programmatori esterni e direttamente dal programma in esecuzione sul PICmicro. Questa direttiva tiene conto del fatto che l'esecuzione del programma al reset parte dall'indirizzo 0x00 dell'area programma. Il programma più complesso che potrà contenere.Architettura interna del PIC16F84A . Date le sue caratteristiche il REGISTER FILE è la memoria normalmente utilizzata per memorizzare le variabili di programma.RP0 sarà quindi la prima istruzione ad essere eseguita. Gli indirizzi riservati alla PROGRAM MEMORY vanno da 0x000 a 0x3FF (0x3FF esadecimale = 1023 decimale).LA PROGRAM MEMORY La PROGRAM MEMORY è una memoria speciale di tipo FLASH ed utilizzata nel PICmicro per memorizzare il programma da eseguire. all'indirizzo zero. Contrariamente alla PROGRAM MEMORY. Nel sorgente LED. Per scrivere. La prima locazione di memoria. Il PICmicro può solamente eseguire le istruzioni memorizzate in queste locazioni e non può in alcun modo leggere. il REGISTER FILE perde il suo contenuto quando il PICmicro viene spento per cui è necessario reinizializzare i 38 4 .ASM presentato nel capitolo precedente era stata inserita la direttiva: ORG 0x00 per segnare l'inizio del programma. La sua capacità di memorizzazione è di 1024 locazioni ognuna in grado di contenere un opcode a 14 bit ovvero una istruzione base del PICmicro. non potrà essere quindi più lungo di 1024 istruzioni. deve contenere la prima istruzione che il PICmicro dovrà eseguire al reset e per questo viene nominata Reset Vector. scrivere o cancellare quanto in esse contenuto. Questo vale in particolar modo per i PIC16F84A mentre su altri modelli quali i PIC16F87x è possibile anche aggiornare la memoria programma mentre il programma in esecuzione. leggere e cancellare queste locazioni è necessario un dispositivo esterno denominato programmatore (si veda il capitolo 2). ovvero tutti quei valori il cui contenuto varia durante l'esecuzione.

Figura 4.2 è mostrata la struttura del register file per il PIC16F84A. In figura 4.2: Register File del PIC16F84A 4 . Nota Mentre le PROGRAM MEMORY è una memoria non volatile.Architettura interna del PIC16F84A 39 . il REGISTER FILE deve essere sempre correttamente inizializzato prima di eseguire il programma.valori di tutte le sue locazioni prima di poterla usare.

Nell’esempio LED. tutte le linee della porta B del PIC come uscite agendo sul registro TRISB. per definire quali linee di I/O sono in ingresso e quali in uscita. che il programma utilizzerà per memorizzare i contatori di ritardo della subroutine Delay. contatori. ad esempio. Le 68 locazioni in pagina 0 indirizzate da 0x0C a 0x4F possono essere utilizzate liberamente dai programmi per memorizzare variabili. referenziare lo stesso registro con il suo nome simbolico: movlw movwf 40 B'00000000' TRISB 4 . Un secondo spazio di indirizzamento denominato pagina 1 va da 0x80 a 0xCF. Per accedere a questo secondo spazio è necessario ricorrere ai due bit ausiliari RP0 e RP1 secondo le modalità che verranno illustrate più avanti. Alcuni registri riportano lo stato di funzionamento dei dispositivi interni al PICmicro o il risultato di operazioni aritmetiche e logiche. denominato pagina 0 (o bank 0). nel file P16F84A. Ad esempio. È necessario conoscere esattamente quale funzione svolge ciascun registro specializzato e quali effetti si ottengono nel manipolarne il contenuto. Per configurare. Lo stesso stato logico delle linee di I/O dipende dal valore dei due registri PORTA (0x05) e PORTB (0x06).INC (incluso nel sorgente LED.Architettura interna del PIC16F84A . Le prime 12 locazioni della pagina 0 (da 0x00 a 0x0B) e della pagina 1 (da 0x80 a 0x8B) sono quelle riservate alle funzioni speciali per il funzionamento del PICmicro e non possono essere utilizzate per altri scopi. è possibile referenziare direttamente il registro con il suo indirizzo: movlw movwf B'00000000' 0x86 oppure. si ricorre alla coppia di registri specializzati TRISA (0x85) e TRISB (0x86).ASM con la direttiva INCLUDE) Microchip ha inserito una lista di nomi che identificano univocamente ciascun registro specializzato e a cui sono associati gli indirizzi corrispondenti nell'area dei REGISTER FILE. I registri specializzati del PIC vengono utilizzati frequentemente nei programmi. ecc. La direttiva che segue: Count RES 2 riserva uno spazio di due locazioni.ASM la direttiva: ORG 0x0C indica proprio l'indirizzo di inizio dell'area dati utilizzabile dal programma.Le locazioni di memoria presenti nel REGISTER FILE sono indirizzabili direttamente in uno spazio di memoria che va da 0x00 a 0x4F per un totale di 80 byte. Per facilitare le operazioni sui registri specializzati.

486© e Pentium© ad esempio dispone di una ALU a 32 bit. Le potenze di calcolo raggiunte da questi micro sono notevolmente superiori a scapito della complessità della circuiteria interna ed accessoria e conseguentemente dello spazio occupato. La famiglia Intel© 80386©. La ALU è una componente presente in tutti i microprocessori e da essa dipende direttamente la potenza di calcolo del micro stesso. ovvero valori numerici non più grandi di 255.Architettura interna del PIC16F84A 41 .avendo però l'accortezza di inserire la direttiva INCLUDE "P16F84A.INC" nel file sorgente. 32. 64 bit e oltre. Figura 4. Esistono microprocessori con ALU a 16. La ALU del PIC16F84A è in grado di operare su valori ad 8 bit. LA ALU La ALU (acronimo di Arithmetic and Logic Unit ovvero unità aritmetica e logica) è la componente più complessa del PICmicro in quanto contiene tutta la circuiteria delegata a svolgere le funzioni di calcolo e manipolazione dei dati durante l'esecuzione di un programma.3: La ALU ed il registro accumulatore W 4 .

Il totale è di 8 + 7 + 6 = 21 bit. l'opcode di una istruzione non può essere più grande di 14 bit mentre per l’operazione che si intende eseguire ne occorrono: 8 bit per specificare il valore da inserire nella locazione di memoria. per referenziare il registro W. la ALU non deve fornire nessun indirizzo di memoria. ovvero: movlw movwf 0x01 0x0C La prima inserisce nel registro W il valore 0x01 con l'istruzione MOVe Literal to W.L'ACCUMULATORE O REGISTRO W Direttamente connesso con la ALU c'è il registro W denominato anche accumulatore. La differenza sostanziale tra il registro W e le altre locazioni di memoria consiste proprio nel fatto che. Questo registro consiste di una semplice locazione di memoria in grado di contenere un solo valore a 8 bit. la seconda sposta il valore contenuto in W nella locazione 0x0C con l'istruzione MOVe W to F. ma può accedervi direttamente.Architettura interna del PIC16F84A . 6 bit per specificare l’istruzione da utilizzare. infatti. 42 4 . Nel set di istruzioni del PICmicro non esiste un'unica istruzione in grado di effettuare questa operazione quindi si rende necessario ricorrere all'accumulatore ed usare due istruzioni in sequenza. Come già visto. Nota Il registro accumulatore W è l’unico registro a cui la ALU può accedere direttamente. È necessario dunque ricorrere a due istruzioni. Come esempio pratico si supponga di voler inserire nella locazione di memoria 0x0C del REGISTER FILE il valore 0x01. Il registro W viene utilizzato molto spesso nei programmi per PICmicro. 7 bit per specificare in quale locazione di memoria tale valore dovrà essere inserito.

Figura 4. ovvero istruzioni in grado di modificare il flusso di esecuzione del programma in base alle esigenze del programmatore. quindi continuare l'esecuzione a partire da quel punto.IL PROGRAM COUNTER (PC) Qualsiasi linguaggio di programmazione prevede le istruzioni di salto.4: Il program Counter e lo Stack Una di queste istruzioni è GOTO (dall'inglese GO TO.Architettura interna del PIC16F84A . Un esempio: ORG Point1 movlw goto 0x00 D’10’ Point1 43 4 . all'interno della memoria programma. vai a) che permette di cambiare la sequenza di esecuzione e di "saltare" direttamente ad un qualsiasi punto.

La differenza sostanziale consiste però nel fatto che prima di eseguire il salto. in un altro registro speciale. Ad esempio: ORG Point1 movlw call goto Point2 movlw return 44 0x00 D’10’ Point2 Point1 D’11’ 4 . Come la GOTO infatti permette di scrivere nel PROGRAM COUNTER un nuovo indirizzo di esecuzione del programma. il PIC memorizza. Questo registro viene incrementato automaticamente ad ogni istruzione eseguita per determinare il passaggio all'istruzione successiva. per determinare quale sarà l'istruzione successiva da eseguire. l'indirizzo di quella che sarebbe dovuta essere la successiva istruzione da eseguire se non si fosse incontrata la CALL. Al momento del RESET del PIC il PROGRAM COUNTER viene azzerato. questo programma non farà altro che eseguire continuamente le due istruzioni elencate.Al reset il PICmicro eseguirà l'istruzione MOVLW 10 memorizzata alla locazione 0x00. il PIC utilizza uno speciale registro denominato PROGRAM COUNTER (dall'inglese contatore di programma) la cui funzione è proprio quella di mantenere traccia dell'indirizzo che contiene la prossima istruzione da eseguire. Questa istruzione funziona in maniera molto simile alla GOTO. Durante questo ciclo (o loop).Architettura interna del PIC16F84A . Nel suo insieme quindi. quindi passerà ad eseguire l'istruzione successiva GOTO Point1. la quale inserirà nell'accumulatore il valore decimale 10. Questa istruzione determinerà un salto incondizionato alla locazione di memoria puntata dalla label Point1 ovvero di nuovo alla locazione 0x00. LO STACK POINTER Un'altra istruzione molto utile. L'istruzione GOTO consente l'inserimento a programma di un nuovo valore nel PROGRAM COUNTER ed il conseguente salto ad una locazione qualsiasi dell'area programma del PIC. determinando così l'inizio dell'esecuzione a partire dall'indirizzo 0x00. denominato STACK. che influenza il valore del PROGRAM COUNTER è la CALL (dall'inglese chiamata) con la quale è possibile effettuare delle CHIAMATE A SUBROUTINE.

4 . in cui l'ultimo elemento inserito (last in) deve necessariamente essere il primo ad uscire (last out). Gli indirizzi da memorizzare nello stack sono due in quanto viene incontrata una seconda CALL prima ancora di incontrare la RETURN corrispondente alla prima. uno sull'altro. Come detto l'operazione appena effettuata viene denominata CHIAMATA A SUBROUTINE. Questo tipo di memorizzazione viene anche denominata LIFO dall'inglese Last In First Out. dopo aver eseguito la MOVLW D’10’ passa ad eseguire l’istruzione CALL Point2. Grazie a questa caratteristica è possibile effettuare più CALL annidate una nell'altra e mantenere sempre traccia del punto in cui riprendere il flusso al momento che si incontra una istruzione RETURN. Questa istruzione. ovvero l'indirizzo della locazione successiva alla CALL. consente di "ritornare". L'esecuzione passa quindi all'istruzione MOVLW D’11’ quindi alla istruzione RETURN (dall'inglese ritorno). come dice il suo nome. Prima di saltare però. Al ritorno da quest'ultima il programma dovrà rientrare nella subroutine Point2 eseguire la RETURN e quindi tornare nel flusso principale. ovvero di riprendere l'esecuzione a partire dall'istruzione successiva alla CALL che aveva determinato l'abbandono del flusso principale del programma utilizzando il valore memorizzato nel registro di STACK. più indirizzi per recuperarli quando servono. memorizza nello STACK l'indirizzo 0x02.In questo caso il PICmicro. ovvero una interruzione momentanea del normale flusso di programma per "chiamare" in esecuzione una serie di istruzioni per poi ritornare al normale flusso di esecuzione. Ecco un altro esempio: ORG Point1 movlw call goto Point2 movlw call return Point3 movlw return 0x00 D’10’ Point2 Point1 D’11’ Point3 D’12’ In questo caso nella subroutine Point2 viene effettuata un'ulteriore CALL alla subroutine Point3. La parola STACK in inglese significa "catasta" ed infatti su questa catasta è possibile depositare.Architettura interna del PIC16F84A 45 .

Nota È buona norma. 46 4 . È importante assicurasi.Il PIC16F84A dispone di uno stack a 8 livelli. che ci sia sempre una istruzione RETURN per ogni CALL per evitare pericolosi disallineamenti dello stack che in esecuzione possono provocare errori difficilmente rilevabili. ovvero uno stack che consente fino ad 8 chiamate annidate. salvare il contenuto dei registri che verranno utilizzati in modo da poterli ripristinare prima di ritornare al programma principale. durante la stesura di un programma. all’inizio di una subroutine.Architettura interna del PIC16F84A .

Nella figura 5.5 .ASM presentato nel capitolo 3 per realizzare un lampeggiatore sequenziale a quattro led.1: Schema del lampeggiatore sequenziale 5 .ASM. verrà rielaborato il sorgente LED.REALIZZAZIONE DELLE "LUCI IN SEQUENZA" Come esercitazione relativa ai concetti finora esposti. Figura 5.Realizzazione delle "luci in sequenza" 47 . Il nuovo sorgente modificato si chiamerà SEQ. con l'unica variante che ora i led collegati sono quattro anziché uno. sostanzialmente equivalente al circuito presentato nel capitolo 3.1 viene riportato lo schema elettrico del nuovo circuito.

quindi.C che azzera appunto il bit Carry. del valore contenuto in Shift.F la prima istruzione azzera il bit CARRY del registro di stato STATUS che verrà analizzato più avanti.C Shift. RB2 per il terzo ed RB3 per il quarto. 48 5 . nel ciclo principale del programma. corrispondenti alle linee RB0÷RB3 vengono messi a zero per definire tali linee in uscita.Le linee di I/O utilizzate sono RB0 per il primo led. A questo punto il registro Shift varrà 00000010. Questo viene fatto con le seguenti istruzioni: movf movwf Shift. significa che tutti i quattro led sono stati accesi almeno una volta e occorre quindi ripartire dal led 1. il valore memorizzato nel registro Shift verrà trasferito sulla Porta B ottenendo quindi l'accensione del primo led. una volta trasferito tale valore sulla port B si otterrà lo spegnimento del LED1 e l'accensione del LED2 e così via per i cicli successivi. Esse vanno quindi configurate come uscite all'inizio del programma con le istruzioni: movlw movwf B'11110000' TRISB in cui i quattro bit meno significativi. Nell'area di memoria del REGISTER FILE (che nel sorgente inizia con la direttiva ORG 0x0C) oltre ai due byte referenziati dalla label Count.W PORTB Successivamente viene effettuato lo scorrimento a sinistra di un bit. L'istruzione RLF Rotate Left F through Carry (ruota a sinistra attraverso il bit di carry) sposta di un bit verso sinistra il valore memorizzato nel registro Shift inserendo nella posizione occupata dal bit 0 il valore del bit di Carry. al ciclo successivo. prima della RLF viene eseguita l'istruzione BCF STATUS. RB1 per il secondo. La direttiva da inserire è: Shift RES 1 Prima di eseguire il ciclo principale (label MainLoop) viene inizializzato il nuovo registro Shift a 00000001B con le seguenti istruzioni: movlw movwf B'00000001' Shift A questo punto.Realizzazione delle "luci in sequenza" . viene riservato un ulteriore byte con label Shift che verrà utilizzato per determinare la sequenza di accensione dei led. Per far sì che il bit inserito sia sempre zero. Quando il bit 4 di Shift varrà 1. con le seguenti istruzioni: bcf rlf STATUS.

4 controlla appunto se il bit 4 del registro Shift vale 1. 5 . Nel CD allegato Nella cartella \sorgenti trovate il file SEQ. Dal valore iniziale del registro Shift pari a 00010000 ottenuto dopo alcune ripetizioni del ciclo MainLoop si ottiene il valore 00000001 quindi la riaccensione del primo led. L'istruzione SWAP (dall'inglese "scambia") scambia i quattro bit più significativi contenuti nel registro Shift con i quattro meno significativi.ASM utilizzato in questo capitolo.F altrimenti l’istruzione consecutiva viene saltata.Le istruzioni seguenti svolgono questo tipo di controllo: btfsc swapf Shift. In caso positivo viene eseguita l'istruzione successiva SWAPF Shift.F L'istruzione BTFSC Shift.4 Shift.Realizzazione delle "luci in sequenza" 49 .

.

RB2. RA1. RA3 ed RA4. La PORT A dispone di 5 linee configurabili sia come ingresso che come uscita identificate dalle sigle RA0.Le porte di I/O 51 . RB1.1: Le porte A e B La suddivisione delle linee in due porte distinte è dettata dai vincoli dell'architettura interna del PIC16F84A che prevede la gestione di dati di 6 . RB5. RB3.6 .LE PORTE DI I/O LE PORTE A E B Il PIC16F84A dispone di un totale di 13 linee di I/O organizzate in due porte denominate PORT A e PORT B. RB4. RA2. Figura 6. La PORT B dispone di 8 linee anch'esse configurabili come ingresso o come uscita ed identificate dalle sigle RB0. RB6 ed RB7.

ovviamente. Si ricorda a tale proposito che nella notazione binaria il bit più a destra corrisponde con il bit meno significativo (bit 0). di voler collegare un led sulla linea RB0 ed uno switch sulla linea RB4. TRISB e PORTB per la porta B. Ad esempio il bit 0 del registro PORTA e del registro TRIS A corrispondono alla linea RA0. Se il bit 0 del registro TRISA viene messo a uno.4 SwitchAMassa SwitchAlPositivo dove. Si supponga. il codice sarà: btfss goto goto PORTB. 1 = 5 volt). il PIC dispone di due registri interni per ogni porta denominati TRISA e PORTA per la porta A. la linea RA0 verrà configurata come linea in ingresso. quindi lo stato logico in cui verrà posta la linea RA0 dalla circuiteria esterna. quindi il valore a cui verrà messo il bit 0 del registro PORTA determinerà lo stato logico di tale linea (0 = 0 volt. SwitchAMassa e SwitchAlPositivo sono le etichette alle quali salterà il programma nel caso in cui lo switch sia rispettivamente chiuso a massa (0V) al positivo di alimentazione (5V). 52 6 .lunghezza massima pari a 8 bit. Per la gestione delle linee di I/O da programma.0 Per leggere lo stato dello switch collegato alla linea RB4.Le porte di I/O . La linea di codice per l’accensione del led (accensione sul livello alto) sarà la seguente: bsf PORTB. permettono di determinare se una singola linea di una porta debba funzionare come ingresso o come uscita. il bit 1 alla linea RA1 e così via. come esempio. Ognuno dei bit contenuti nei registri menzionati corrisponde univocamente ad una linea di I/O. si rifletterà sullo stato del bit 0 del registro PORTA. Se il bit 0 del registro TRISA viene messo a zero. I registri PORTA e PORTB permettono invece di impostare lo stato delle linee di uscita o leggere lo stato delle linee di ingresso.0 Per spegnerlo: bcf PORTB. Il codice da scrivere sarà il seguente: movlw movwf 00010000B TRISB in cui viene messo a zero il bit 0 (linea RB0 in uscita) e ad uno il bit 4 (linea RB4) in ingresso. I registri TRIS A e B. la linea RA0 verrà configurata come linea in uscita.

Esistono quindi dei gruppi di pin il cui comportamento è leggermente differenziato da altri gruppi. per configurare la linea RA0 in ingresso.0 Questo determina una commutazione ad 1 dello stato logico del flip-flop di tipo D-latch indicato nel blocco con il nome TRIS latch. Per ogni linea di I/O esiste uno di questi flip-flop e lo stato logico in cui si trova dipende strettamente dallo stato logico del relativo bit nel registro TRIS (in particolare ogni bit del registro TRIS è fisicamente implementato con un TRIS latch).Le porte di I/O 53 . RA1.STADI DI USCITA DELLE LINEE DI I/O Per rendere più adattabili i PICmicro alle diverse esigenze di utilizzo. RA2 ed RA3. RA2 e RA3 In figura 6.2 è riportato lo schema dello stadio di uscita relativo alle linee RA0. Stadio di uscita delle linee RA0. Figura 6. è necessario portare ad 1 il bit 0 del registro TRISA con l'istruzione: bsf TRISA. RA1. Microchip ha implementato diverse tipologie di stadi di uscita per le linee di I/O. Conoscendo meglio il funzionamento dei diversi stadi d'uscita sarà possibile sfruttare al meglio le loro caratteristiche ed ottimizzare il loro uso nei progetti.2: Stadio di uscita per RA0÷RA3 Funzionamento in ingresso Come già accennato. 6 .

In questa condizione è sempre possibile rileggere il valore inviato sulla linea tramite la circuiteria d'ingresso.0 è il transistor P ad entrare in conduzione. Funzionamento in uscita RA0 è una uscita se il bit 0 del registro TRISA viene portato a zero con l'istruzione: bcf TRISA. anche il Data Latch dipende dallo stato di un bit in un registro. La sua uscita negata viene inviata all'ingresso delle due porte logiche OR e AND e quindi direttamente sulla base dei transistor P ed N. indipendentemente dal valore presente all'altro ingresso. Ciò comporta che. In questa condizione il transistor P non conduce e mantiene la linea RA0 scollegata dal positivo di alimentazione. Nella figura 6.0 il transistor N entra in conduzione portando a 0 della linea RA0. Portando a 1 il bit 0 con l'istruzione: bsf PORTA.0 Questo determina la commutazione a 0 dell'uscita Q del TRIS latch (ed a 1 dell'uscita Q negata).L'uscita Q del TRIS latch è collegata all'ingresso di una porta logica di tipo OR. Allo stesso modo l'uscita negata del TRIS latch è collegata all'ingresso di una porta AND quindi l'uscita di questa varrà sempre 0 (in quanto uno dei suoi ingressi vale 0). Lo stato di RA0 può essere letto sfruttando la circuiteria d'ingresso del blocco rappresentata dal TTL input buffer e dal latch di ingresso. Come per il TRIS latch. portando a +5 volt la linea RA0. l'uscita della porta OR varrà sempre 1 (in quanto uno dei suoi ingressi vale 1). Stadio d'uscita della linea RA4 Lo stadio di uscita della linea RA4 si differenzia da tutte le altre linee di I/O in quanto condivide lo stesso pin con il TOCKI.3 viene riprodotto lo schema a blocchi dello stadio d'uscita estratto dal data sheet Microchip: 54 6 . In questa condizione anche il transistor N non conduce mantenendo la linea RA0 scollegata anche dalla massa. in particolare del registro PORTA. Portando a 0 il bit 0 del registro PORTA con l'istruzione: bcf PORTA. In questo stato il valore in uscita dalle porte OR e AND dipende esclusivamente dallo stato dell'uscita Q negata del Data Latch. Lo stato logico della linea RA0 dipenderà esclusivamente dalla circuiteria esterna a cui è collegata.Le porte di I/O .

che quando la linea RA4 viene configurata come uscita e portata a 1.Figura 6. Per essere sicuri che la linea RA4 vada a 1 è necessario collegare esternamente una resistenza di pull-up. Più avanti verrà analizzato l’uso della linea indicata sullo schema come TMR0 clock input. Questo significa. Nota Utilizzando la linea RA4 come uscita. ovvero di tutta la catena che consente di collegare al positivo la linea RA4.3: Stadio di uscita di RA4 La logica di commutazione è sostanzialmente identica al gruppo di linee RA0-3 ad eccezione dell'assenza della porta OR e del transistor P. ma rimane scollegata. 6 .Le porte di I/O 55 . in termini pratici. in realtà non viene connessa fisicamente al positivo di alimentazione. si deve collegare una resistenza di pull-up esterna per garantire il corretto livello logico alto. Tale tipo di circuiteria d'uscita viene denominata "open drain" ed è utile per applicazioni in cui sia necessario condividere uno stesso collegamento con più pin d'uscita e vi sia quindi la necessità di mettere in alta impedenza una linea d'uscita senza doverla riprogrammare come linea d'ingresso. ovvero una resistenza tra RA4 e il positivo di alimentazione.

quando premuto. 56 6 . quando viene configurata come linea di ingresso. Se tale circuiteria è costituita. le linee vengono completamente scollegate dal PIC in quanto sia il transitor P che il transistor N sono aperti. da un semplice pulsante che. ad esempio. presenta una caratteristica molto particolare. Lo stato delle linee dipende quindi esclusivamente dalla circuiteria esterna. Nella figura 6. La circuiteria di weak pull-up consente di evitare l'uso di resistenze di pull-up e può essere attivata o disattivata agendo sul bit RBPU del registro OPTION. In ingresso infatti. in corrispondenza di un cambio di stato logico.4: Stadio di uscita di RB0÷RB3 La sola linea RB0 inoltre.4 viene riprodotto lo schema a blocchi dello stadio d'uscita estratto dal data sheet Microchip: Figura 6. RB2 ed RB3 Anche per questo gruppo di linee rimane sostanzialmente invariata la logica di commutazione. un interrupt. Il meccanismo dell’interruzione verrà trattato nel capitolo 8.Stadio di uscita delle linee RB0. Essa. Esse dispongono in aggiunta una circuiteria di weak pull-up attivabile quando le linee sono programmate in ingresso. come spiegato precedentemente. collega a massa la linea di I/O. può generare. RB1. ovvero una interruzione immediata del programma in esecuzione ed una chiamata ad una subroutine speciale denominata interrupt handler.Le porte di I/O . è necessario inserire una resistenza di pull-up verso il positivo per essere sicuri che quando il pulsante è rilasciato vi sia una condizione logica a 1 stabile sulla linea d'ingresso.

Stadio di uscita delle linee RB4.5 viene riprodotto lo schema a blocchi dello stadio d'uscita estratto dal data sheet Microchip: Figura 6. Rispetto alle linee RB0÷RB3 hanno uno stadio in grado di rilevare variazioni di stato su una qualsiasi linea e di generare un interrupt. RB5. Queste linee dispongono anche della circuiteria di weak pull-up. RB6 e RB7 La circuiteria di commutazione di questo gruppo di linee è identica al gruppo RB0÷RB3.Le porte di I/O 57 . Nella figura 6.5: Stadio di uscita di RB4÷RB7 6 .

Figura 6. configurando le linee da RB4 a RB7 come linee di input. Si consideri. SW3 e SW4 rispettivamente. Lo schema elettrico utilizzato è riportato nella figura 6.ASM. SW2. Il sorgente dell'esempio è riportato nel file INPUT. Il programma di esempio prevede l’accensione di ciascuno dei led D1.Le porte di I/O . normalmente aperti. ad esempio.6: Input da tastiera Ognuno di questi pulsanti. collega a massa una linea di ingresso normalmente mantenuta a + 5 volt da una resistenza (da R6 a R9).6 ed impiega quattro pulsanti. SW3 ed SW4. denominati SW1. D3 e D4 in corrispondenza della pressione di uno dei tasti SW1. 58 6 . il pin 10 del PIC16F84A: questa linea verrà mantenuta a +5 volt finché non verrà premuto il tasto SW1 che provvederà a portare la linea ad 0 volt.USO DELLE PORTE DI I/O: INPUT DA TASTIERA Come esempio pratico di uso delle porte di I/O verrà illustrato come collegare una tastiera di quattro pulsanti al PICmicro. SW2. se premuto. D2.

6 .SW1 PORTB.Le porte di I/O 59 .RP0 11110000B TRISB configurano le linee da RB0 a RB3 come uscite per il collegamento con i led e le linee da RB4 a RB7 come ingressi per il collegamento con i quattro pulsanti (si noti che prima di accedere al registro TRISB viene impostato il banco di registri 1 portando ad 1 il bit RP0 del registro STATUS).La parte iniziale del programma esegue le stesse funzioni effettuate negli esempi già visti ed in particolare le istruzioni: bsf movlw movwf STATUS.LED1 Queste due istruzioni vengono eseguite per ogni linea collegata ad un pulsante per verificare se il pulsante è premuto e per accendere.SW1 salta la successiva: bsf PORTB. L'istruzione bcf STATUS. Più in dettaglio l’istruzione btfss PORTB. eventualmente. MainLoop clrf PORTB Questa istruzione spegne tutti i led collegati sulla PORTA B and ogni ciclo di loop in modo che possano poi essere accesi sulla base dello stato dei pulsanti. btfss bsf PORTB. il led corrispondente.RP0 effettua uno swap sul banco di registri 0 in modo da poter accedere direttamente allo stato delle linee di I/O. Il tutto viene eseguito all'interno di un singolo loop tramite l'istruzione: goto MainLoop Nel CD allegato Nella cartella \sorgenti trovate il file INPUT.ASM utilizzato in questo esempio. In caso contrario la esegue accendendo il led.LED1 solo se il pulsante SW1 è rilasciato.

.

il massimo valore che può contenere è 255 e. ma viene incrementato continuamente ad ogni ciclo macchina in modo automatico e del tutto indipendente dall’esecuzione del programma.Il contatore TMR0 ed il PRESCALER 61 .IL CONTATORE TMR0 ED IL PRESCALER IL REGISTRO CONTATORE TMR0 Il registro TMR0 è un contatore. il TMR0 non mantiene inalterato il valore che gli viene memorizzato.1: Il registro contatore TMR0 In pratica. ovvero un particolare tipo di registro il cui contenuto viene incrementato con cadenza regolare e programmabile direttamente dall'hardware del PIC. una 7 . Figura 7.7 . a differenza di altri registri. Essendo un registro ad 8 bit.

Il contatore TMR0 ed il PRESCALER . Figura 7. La catena di blocchi relativa a TMR0 diviene quella di figura 7.2: I blocchi correlati al TMR0 I blocchi Fosc/4 e T0CKI rappresentano le due possibili sorgenti di segnale per il contatore TMR0. Per analizzare le diverse modalità di conteggio. Nella figura 7. TMR0 viene azzerato automaticamente riprendendo quindi il conteggio da zero. I blocchi T0CS e PSA sono due commutatori di segnale sulla cui uscita viene presentato uno dei due segnali in ingresso in base al valore dei bit T0CS e PSA del registro OPTION. T0CKI è un segnale generato da un eventuale circuito esterno ed applicato al pin T0CKI corrispondente al pin 3 nel PIC16F84A. si supponga di impostare i bit T0CS a 0 e PSA a 1. Fosc/4 è un segnale generato internamente al PIC dal circuito di clock ed è pari alla frequenza di clock divisa per quattro.volta raggiunto tale valore. Il blocco PRESCALER è un divisore programmabile il cui funzionamento verrà illustrato nel paragrafo successivo. La frequenza di conteggio è direttamente proporzionale alla frequenza di clock applicata al chip e può essere modificata programmando opportunamente alcuni bit di configurazione.3: TMR0 regolato dal clock interno 62 7 .3: Figura 7.2 viene riportata la catena di blocchi interni al PIC che determinano il funzionamento del registro TMR0.

5 viene rappresentata la corrispondenza tra l'andamento del segnale esterno ed il valore assunto dal contatore TMR0 in entrambi i casi: Figura 7. la frequenza Fosc/4 è pari ad un quarto della frequenza di clock.Il contatore TMR0 ed il PRESCALER 63 . Impostando lo stato del bit T0CS da 0 a 1 la configurazione diviene quella di figura 7. dunque il contenuto di TMR0 viene incrementato un milione di volte al secondo.Le parti in neretto evidenziano il percorso che effettua il segnale prima di arrivare al contatore TMR0. Utilizzando un quarzo da 4Mhz si ottiene una Fosc/4 pari ad 1 MHz. Come già detto in precedenza. Tale frequenza viene inviata direttamente al registro TMR0 senza subire nessun cambiamento. La presenza della porta logica XOR (exclusive OR) all'ingresso TOCKI del PIC consente di determinare tramite il bit T0SE del registro OPTION se il contatore TMR0 deve essere incrementato in corrispondenza del fronte di discesa (T0SE=1) o del fronte di salita (T0SE=0) del segnale applicato dall'esterno. Nella figura 7. Applicando ad esempio a questo pin una frequenza pari ad 100Hz si ottiene una frequenza di conteggio pari a cento incrementi al secondo.6: 7 .4: TMR0 regolato dal clock esterno In questo caso è il segnale applicato al pin TOCKI del PIC ad essere inviato direttamente al contatore TMR0 determinandone la frequenza di conteggio.4.5: Incremento di TMR0 sul fronte di salita o di discesa IL PRESCALER Impostando a zero il bit PSA del registro OPTION il registro TMR0 viene pilotato dal segnale in uscita dal PRESCALER come mostrato nella figura 7. Figura 7.

PS2 PS1 PS0 Divisore Frequenza in uscita al prescaler (Hz) 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 2 4 8 16 32 64 128 256 500.1. Le modifiche sono state riportate nel file SEQTMR0. Esempio di uso del prescaler Come esempio di uso del TMR0 con prescaler.ASM) visto nel capitolo 5 per ottenere intervalli di accensione/spegnimento dei led di 1 secondo utilizzando TMR0.6: Pilotaggio di TMR0 attraverso il Prescaler Il PRESCALER è un divisore programmabile a 8 bit da utilizzare per diminuire la frequenza di conteggio rispetto al segnale Fosc/4 o a quello applicato a T0CKI.250 15.Il contatore TMR0 ed il PRESCALER .813 3. Le prime istruzioni hanno la funzione di programmare il PRESCALER per ottenere una frequenza di conteggio conveniente: movlw movwf 00000100B OPTION_REG 64 7 .500 31. è riportato il fattore di divisione per ciascuna combinazione dei bit PS0÷PS3 ed il valore della frequenza in uscita al PRESCALER nell’ipotesi in cui il segnale applicato abbia frequenza pari a 1MHz.1: Fattori di divisione e frequenza ottenuta con un clock di 1MHz Nella tabella 7.000 125.000 62.000 250.Figura 7.ASM. verrà modificato il sorgente del lampeggiatore sequenziale a led (SEQ.906 Tabella 7.625 7.

La frequenza di conteggio ottenuta sul TRM0 sarà pari a: F = 1Mhz / 32 = 31. Le prime istruzioni che vengono eseguite nella Delay sono: movlw movwf e movlw movwf 125 Count 6 TMR0 Le prime due memorizzano in TMR0 il valore 6 in modo che il registro TMR0 raggiunga lo zero dopo 250 conteggi (256 .ASM utilizzato in questo esempio. quindi di reinizializzarlo a 6 e decrementare il valore contenuto in Count.250 / 250 = 125 Hz Le istruzioni successive memorizzano in un registro a 8 bit (Count) il valore 125 in modo tale che. 7 . Nel CD allegato Nella cartella \sorgenti trovate il file SEQTMR0.6 = 250) ottenendo così una frequenza di passaggi per lo zero di TMR0 pari a: 31. il bit PSA a 0 per assegnare il PRESCALER al registro TRM0 e i bit di configurazione del PRESCALER a 100 per ottenere una divisione di frequenza pari a 32. si ottenga una frequenza di passaggi per lo zero del registro Count pari a: 125/125 = 1Hz Le istruzioni inserite nel loop DelayLoop si occupano quindi di controllare se TMR0 ha raggiunto lo zero. decrementando questo registro di uno per ogni passaggio per lo zero di TMR0.Il contatore TMR0 ed il PRESCALER 65 .Tali istruzioni impostano il bit T0CS a 0 per selezionare come sorgente del conteggio il clock del PIC.250 Hz La subrountine Delay dovrà utilizzare opportunamente il registro TMR0 per ottenere un ritardo pari ad un secondo. Quando Count raggiungerà anch'esso lo zero allora sarà trascorso un secondo e la subroutine potrà fare ritorno al programma chiamante.

.

rispondere al telefono e. Il cambiamento di stato su una delle linee da RB4 ad RB7 (PORTB change interrupts). riprendere dal punto di interruzione. Per fare un paragone con il mondo reale. È evidente quanto sia più efficiente gestire un evento con un interrupt piuttosto che controllare ciclicamente il verificarsi dello stesso evento attraverso il programma principale. ma.GLI INTERRUPT L'interrupt è una particolare caratteristica dei PICmicro (e dei microprocessori in generale) che consente di intercettare un evento esterno. La fine del conteggio del registro TMR0 (TMR0 overflow interrupt). La chiamata da parte di qualcuno corrisponde all'evento da gestire. 2. L'interrupt su ognuno di questi eventi può essere abilitato o disabilitato 8 . All’arrivo dello squillo. Lo squillo del telefono corrisponde alla richiesta di interrupt. all’arrivo di una telefonata. 3. Il cambiamento di stato sulla linea RB0 (External interrupt RB0/INT pin). interrompere momentaneamente il programma in corso. è possibile svolgere altri compiti in quanto. eseguire una porzione di programma specializzata per la gestione dell'evento verificatosi quindi riprendere l'esecuzione del programma principale. 4. la suoneria stessa provvederà a notificare il verificarsi dell’evento. La risposta al telefono corrisponde alla subroutine di gestione dell'interrupt. Nell’analogia con il PIC si ha che: I compiti corrispondono al programma in esecuzione.8 .Gli interrupt 67 . grazie alla suoneria. è possibile decidere di interrompere momentaneamente i compiti in esecuzione. La fine della scrittura su una locazione EEPROM (EEPROM write complete interrupt). l'interrupt può essere assimilato alla suoneria del telefono: per poter ricevere telefonate non occorre alzare continuamente la cornetta per sapere se qualcuno intende comunicare. • • • • TIPI DI EVENTO E BIT DI ABILITAZIONE Il PIC16F84A è in grado di gestire in interrupt quattro eventi diversi: 1. Gran parte degli aspetti legati alla gestione dell'interrupt vengono inoltre trattati direttamente dall'hardware interno del PIC per cui il tempo di risposta all'evento è praticamente nullo. una volta terminata la conversazione.

INTERRUPT VECTOR ED INTERRUPT HANDLER Qualunque sia l'evento abilitato. al suo manifestarsi il PIC interrompe l'esecuzione del programma in corso. Questo controllo può essere effettuato utilizzando gli Interrupt flag. • RBIF (bit 0) Se vale 1 l'interrupt è stato generato dal cambiamento di stato di una delle linee da RB4 a RB7. non è previsto alcun flag di segnalazione per l'interrupt sul 68 8 . ha generato l'interrupt e l'esecuzione della relativa parte di programma.Gli interrupt . INTERRUPT FLAG Dato che qualunque interrupt genera una chiamata alla locazione 0x04. memorizza automaticamente nello STACK il valore corrente del PROGRAM COUNTER e salta all'istruzione presente nella locazione di memoria 0x04 denominata Interrupt Vector (vettore di interrupt). nel registro INTCON sono presenti dei flag che indicano quale è l'evento che ha generato l'interrupt. • T0IF (bit 2) Se vale 1 l'interrupt è stato generato al termine del conteggio del timer TMR0. In particolare: • INTF (bit 1) Se vale 1 l'interrupt è stato generato dal cambiamento di stato sulla linea RB0. Come si può notare. Potendo abilitare più interrupt. tra gli eventi abilitati. A partire da questa locazione dovrà essere inserita la subroutine di gestione dell'interrupt denominata Interrupt Handler (gestore di interrupt). il primo compito dell'interrupt handler è la verifica di quale.indipendentemente dagli altri agendo sui seguenti bit del registro INTCON: • INTE (bit 4) se questo bit viene messo a 1 viene abilitato l'interrupt sul cambiamento di stato sulla linea RB0 • T0IE (bit 5) se questo bit viene messo a 1 viene abilitato l'interrupt sulla fine del conteggio del registro TMR0 • RBIE (bit 3) se questo bit viene messo a 1 viene abilitato l'interrupt sul cambiamento di stato su una delle linee da RB4 ad RB7 • EEIE (bit 6) se questo bit viene messo a 1 viene abilitato l'interrupt sulla fine della scrittura su una locazione EEPROM Esiste inoltre un bit di abilitazione generale degli interrupt che deve essere settato anch'esso ad uno ovvero il bit GIE (Global Interrupt Enable bit) posto sul bit 7 del registro INTCON.

SALVATAGGIO DEL CONTESTO Durante un evento di interruzione è il solo Program Counter che viene salvato automaticamente nello STACK. Normalmente è buona norma provvedere al salvataggio del contenuto dell’accumulatore W e del registro STATUS.Copia W in W_TEMP STATUS.1 W_TEMP. È compito dell’utente provvedere al salvataggio del contenuto di altri registri prima di eseguire la routine di interruzione.qui si inserisce il codice relativo alla . mentre quella di ripristino del contenuto dei registri salvati è nota come POP.Gli interrupt 69 . ovvero si è generata una interruzione e tutti i flag sono a zero. w STATUS_TEMP . l'interrupt handler deve provvedere all’azzeramento del flag altrimenti non verrà più generato l'interrupt corrispondente.fine scrittura in EEPROM dunque l'interrupt handler dovrà considerare che l'interrupt è stato generato da questo evento quando tutti i tre flag sopra citati valgono 0.Ripristino di W POP 8 .routine di servizio per l’interruzione swapf movwf swapf swapf STATUS_TEMP. Nota Non esiste un flag per la fine scrittura su EEPROM.0 .Salva STATUS in STATUS_TEMP PUSH ISR . Importante: Una volta rilevato quale flag è attivo. Di seguito è riportato un esempio di codice che provvede ad eseguire le seguenti azioni: • • • • • Salvataggio del contenuto di W nella variabile W_TEMP Salvataggio del registro STATUS nella variabile STATUS_TEMP Esecuzione della routine di interruzione (ISR) Ripristino del contenuto di W Ripristino del contenuto del registro STATUS movwf swapf movwf W_TEMP .0 .Ripristino di STATUS W_TEMP.Copia STATUS_TEMP in w STATUS . L’operazione di salvataggio dei registri è nota come PUSH. per poi ripristinarli alla fine. per cui tale evento deve essere riconosciuto per esclusione.

RITORNO DA UN INTERRUPT HANDLER Quando viene generato un interrupt il PIC disabilita automaticamente il bit GIE (Global Interrupt Enable) del registro INTCON in modo da disabilitare tutti gli interrupt mentre è già in esecuzione un interrupt handler.ASM) visto nel capitolo 3. Figura 8.ASM. Per poter ritornare al programma principale e riportare ad uno questo bit. mentre lo schema elettrico è riportato nella figura 8.1.Gli interrupt . verrà modificato il sorgente del lampeggiatore ad un led (LED. Il sorgente d'esempio è disponibile nel file INTRB. occorre utilizzare l'istruzione: RETFIE ESEMPIO PRATICO DI GESTIONE DI UN INTERRUPT Come esempio di applicazione degli interrupt.1: Lampeggiatore gestito mediante interruzioni 70 8 . per poter accendere un secondo led (LED 2) alla pressione di un pulsante.

LED2 3 nTick INTCON.ASM utilizzato in questo esempio. Il codice dell'interrupt handler. come ripetuto più volte. Nel CD allegato Nella cartella \sorgenti trovate il file INTRB.ASM. continua a far lampeggiare il LED 1 utilizzando un ritardo software introdotto dalla subroutine Delay. in questo caso.RBIF .LED 1 lampeggia esattamente come avveniva con il programma LED. ma premendo uno qualsiasi dei tasti da SW1 a SW4 il LED 2 si accende immediatamente e rimane acceso per un tempo pari a 3 lampeggi del LED 1.ASM In corrispondenza della direttiva ORG 00H che. ANALISI DEL SORGENTE INTRB. derivato dal vecchio LED.Gli interrupt 71 PORTB. il PIC è in grado di accorgersi della pressione di un tasto e di segnalarlo immediatamente sul LED 2 senza influenzare in maniera evidente la frequenza di lampeggio di LED1. per evitare che esso venga eseguito al reset è stata inserita l’istruzione di salto incondizionato. è presente una istruzione di salto incondizionato alla label Start: ORG goto 0x00 Start seguito da un'altra direttiva: ORG 0x04 e quindi dal codice della subroutine di gestione dell'interrupt: bsf movlw movwf bcf retfie Poiché l'interrupt handler deve necessariamente essere allocato a partire dall'indirizzo 0x04. quindi inserire nel registro utente nTick il numero di lampeggi raggiunto il quale il LED 2 deve spegnersi e quindi azzerare il flag RBIF per consentire alla circuiteria di generazione dell'interrupt di continuare a 8 . posiziona il programma a partire dalla locazione di indirizzo 0. Quello che accade è che mentre il loop principale. è molto semplice e si limita ad accendere il LED 2.ASM.

72 8 . quindi il bit RBIE (bit 3) che abilita. RB5. La direttiva ORG 0x04 garantisce che l’interrupt handler sia posizionato a partire dall’indirizzo 0x04. avendo collegato i pulsanti SW1. in particolare. l'interrupt su cambiamento di stato delle linee RB4÷RB7. L'istruzione RETFIE consente al PIC di tornare ad eseguire il programma interrotto dall'interrupt. SW2. Nota La routine che gestisce l’interrupt deve provvedere ad azzerare gli interrupt flag. oltre alle operazioni di accensione e spegnimento del LED 1. SW3 e SW4 proprio sulle linee di I/O RB4.funzionare. In corrispondenza di questo viene spento il LED 2. viene decrementato il contatore nTick fino al raggiungimento dello zero. RB6 ed RB7.Gli interrupt . Perchè viene generato un interrupt quando è premuto un tasto qualsiasi? Tra le prime istruzioni che esegue il PIC al reset si trovano le seguenti: movlw movwf 10001000B INTCON Con queste istruzioni viene messo ad uno il bit GIE (bit 7) che abilita in generale la circuiteria di generazione degli interrupt. Ora. Nel loop principale. con la pressione di uno di questi si impone un cambiamento di stato. quindi un interrupt.

2: Gestione di due interruzioni Eseguendo il programma si nota che mentre LED1 lampeggia con la frequenza di un secondo.ASM ed il circuito da utilizzare è riportato nella figura 8.2. LED3 lampeggia ad una frequenza più elevata (125Hz) tanto da apparire sempre acceso.ASM. LED2 si accende secondo quanto visto in precedenza. Inoltre premendo un pulsante qualsiasi. Con le modifiche che verranno apportate.ESEMPIO PRATICO DI GESTIONE DI PIÙ INTERRUPT In questo paragrafo verrà mostrato come gestire più interrupt contemporaneamente. modificando il file INTRB. Figura 8. facendo lampeggiare il LED 3 in corrispondenza di ogni fine conteggio di TMR0. 8 .ASM. Il sorgente da utilizzare è dunque DBLINT.Gli interrupt 73 . sarà in grado di gestire anche l’interruzione sulla fine conteggio del registro TMR0. il nuovo sorgente rinominato DBLINT. L'effetto finale ottenuto è l'esecuzione di tre compiti ad una velocità tale da sembrare in esecuzione parallela.

Gli interrupt . Nel CD allegato Nella cartella \sorgenti trovate il file DBLINT.Analisi del sorgente DBLINT.T0IF IntT0IF INTCON. 74 8 .ASM Le modifiche maggiori riguardano l'interrupt handler all'inizio del quale viene effettuato un controllo su quale evento abbia generato l'interrupt. Con le istruzioni: btfsc goto btfsc goto INTCON. Prima di ridare il controllo al programma principale vengono azzerati i flag T0IF e RBIF per garantire che i successivi eventi possano scaturire nuovamente gli interrupt. Quindi vengono lanciate in esecuzione le relative subroutine di gestione a partire dalle label IntT0IF e IntRBIF.ASM utilizzato in questo esempio.RBIF IntRBIF viene controllato il flag T0IF e RBIF per vedere rispettivamente se l'evento che ha scatenato l'interrupt proviene dal registro TMR0 o dalle porte RB4÷RB7.

9 .Reset 75 . WDT Wake-up (nello stato SLEEP) Figura 9. riesce a distinguere diverse tipologie di reset: 1.1: I blocchi coinvolti al reset I vari tipi di reset possono essere riconosciuti a livello software analizzando i flag TO e PD del registro STATUS in accordo alla tabella seguente: 9 . Power-on Reset (POR) 2. come la maggior parte degli altri modelli di PIC. WDT Reset (in condizioni operative normali) 4.RESET Il PIC16F84A. Impulso sul pin /MCLR in condizioni operative normali o nello stato di SLEEP 3.

Per convenzione con x sono indicati valori casuali.1 sono riportati gli stati del Program Counter (PC) e del registro STATUS dopo i vari tipi di reset. Nella tabella 9.TO PD Condition 1 0 x 0 0 1 1 1 x 0 1 0 1 0 Power-on Reset Non consentito.2: Schema a blocchi della circuiteria di reset interna al PIC16F84A. Il pin /MCLR fa capo ad un trigger di Schmitt in modo da ripulire il segnale esterno e renderlo adatto ad essere gestito dalla circuiteria interna. il PD è settato sul POR WDT Reset (during normal operation) WDT Wake-up MCLR durante il normale funzionamento MCLR durante lo SLEEP o interrupt di Wake-up dallo SLEEP Figura 9.Reset .2 è invece riportato lo stato degli altri registri del PIC a seguito delle varie tipologie di reset. con – i bit non significativi (letti come ‘0’) e con q i valori dipendenti dalla specifica condizione di reset. Per molti altri registri è invece previsto un “RESET state” per ciascun tipo di reset ovvero un valore predefinito che viene caricato automaticamente nel registro dopo una particolare operazione di reset. 76 9 . con u i valori che restano invariati durante il reset. il TO è settato sul POR Non consentito. Nella tabella 9. Non tutti i registri sono coinvolti nell’operazione di reset: alcuni registri possono contenere un valore casuale dopo un POR (Power-On-Reset) o il loro contenuto può restare invariato dopo qualsiasi altro tipo di reset.

il PIC si trova nelle giuste condizioni operative (tensione. OSCILLATOR START-UP TIMER (OST) L’Oscillator Start-Up Timer (OST) impone un ritardo di 1024 cicli di clock (riferiti all’ingresso OSC1) alla fine del ritardo imposto dal PWRT. POWER-UP TIMER (PWRT) Il Power-Up Timer (PWRT) funziona con l’oscillatore RC interno ed inserisce automaticamente un ritardo di 72ms (TPWRT) a partire dall’evento POR. può capitare che sia il 9 . il PIC viene mantenuto nello stato di reset ed il codice non viene eseguito. Per sfruttare tale impulso è buona norma mantenere a livello alto il pin /MCLR inserendo un resistore di pull-up (da 10KΩ) connesso tra /MCLR e il positivo di alimentazione. Il valore assoluto del ritardo TPWRT vale 72ms per il PIC16F84A e varia a seconda del tipo di micro impiegato. Questo assicura che. Nel caso in cui il fronte di salita di Vdd sia piuttosto lento. successivamente all’impulso di POR. prima dell’esecuzione del codice. Il PWRT può essere abilitato/disabilitato attraverso un bit di configurazione (come avviene per il WDT) in fase di programmazione del PIC. viene generato un impulso di reset interno al chip. In questo modo non sono necessarie reti RC esterne per garantire il reset all’avvio. temperatura. l’oscillatore che regola il clock sia regolarmente avviato e stabilizzato sulla giusta frequenza. viene imposto solamente se l’oscillatore è in modalità XT. ecc…) viene avviata l’esecuzione del codice. Nota Non vengono generati impulsi di reset durante il fronte di discesa della tensione di alimentazione. noto anche come TOST.7V (normalmente questo si verifica nell’istante in cui il PIC viene alimentato).2÷1.Reset 77 . Viceversa se alcuni parametri non rientrano nelle condizioni ammissibili. LP o HS e solamente in corrispondenza di un evento di Power-On-Reset o risveglio dallo stato SLEEP. Se.POWER-ON-RESET (POR) Quando sul pin di alimentazione Vdd si verifica un fronte di salita nel range di 1. Il ritardo di 1024 cicli. frequenza. Durante questo tempo il PIC viene mantenuto nella condizione di reset e questo consente alla tensione Vdd di raggiungere il valore nominale necessario alla corretta alimentazione del micro.

ritardo TPWRT sia il TOST non siano sufficienti a garantire che Vdd abbia raggiunto il valore di regime. Figura 9. R1 deve avere una valore compreso tra 100Ω e 1KΩ e la sua funzione è quella di limitare la corrente di ingresso al pin /MCLR proveniente dal condensatore nel caso in cui /MCLR venga a trovarsi accidentalmente a livello logico basso.3: Circuiteria di reset nel caso di tempi lunghi di stabilizzazione Vdd Il diodo permette al condensatore di scaricarsi velocemente in fase di spegnimento. In questo caso è necessaria una circuiteria di reset esterna come mostrato nella figura 9. Tabella 9. Per R è suggerito un valore inferiore a 40KΩ (tipicamente 10KΩ) per garantire un corretto valore “1” all’ingresso /MCLR. il diodo entra in conduzione provocando la scarica immediata del condensatore. Portando infatti Vdd a zero. Condizione Power-on Reset MCLR during normal operation MCLR during SLEEP WDT Reset (during normal operation) WDT Wake-up Interrupt wake-up from SLEEP PC 000h 000h 000h 000h PC + 1 PC + 1 STATUS 0001 1xxx 000u uuuu 0001 0uuu 0000 1uuu uuu0 0uuu uuu1 0uuu Nota: quando il risveglio (wake-up) è dovuto ad una interruzione ed il bit GIE è a 1.1: Valori di reset per il Program Counter ed il registro STATUS 78 9 . essendo C carico al valore Vdd. nel Program Counter viene caricato l’ interrupt vector (0004h).3.Reset .

------u uuuu uuuu uuuu(1) (1): quando il risveglio (wake-up) è dovuto ad una interruzione ed il bit GIE è a 1.---uuuu uuuu PC + 1(1) uuuq quuu uuuu uuuu ---u uuuu uuuu uuuu uuuu uuuu uuuu uuuu ---u uuuu uuuu uuuu ---.---uuuu uuuu PC + 1(1) uuuq quuu uuuu uuuu ---u uuuu uuuu uuuu ---0 uuuu ---. Tabella 9.---1111 1111 0000 0000 0001 1xxx xxxx xxxx ---1 1111 1111 1111 ---0 x000 ---. WDT reset in condizioni operative. (3): è il valore che verrà trasferito al latch di uscita. nel Program Counter viene caricato l’interrupt vector (0004h).2: Valori di reset per i vari registri 9 . Registro W INDF TMR0 PCL STATUS FSR PORTA(2) PORTB(3) EEDATA EEADR PCLATH INTCON INDF OPTION_REG PCL STATUS FSR TRISA TRISB EECON1 EECON2 PCLATH INTCON Indirizzo 00h 01h 02h 03h 04h 05h 06h 08h 09h 0Ah 0Bh 80h 81h 82h 83h 84h 85h 86h 88h 89h 8Ah 8Bh POR xxxx xxxx ---.Reset 79 .---uuuu uuuu 0000 0000 000q quuu uuuu uuuu ---u uuuu uuuu uuuu uuuu uuuu uuuu uuuu ---0 0000 0000 000u ---.------0 0000 0000 000x uuuu uuuu ---.Risveglio dallo stato SLEEP mediante interruzione o per WDT Time-out MCLR reset in condizioni operative o nello stato SLEEP. (2): ad ogni reset i pin della PORTA vengono configurati come ingressi.---xxxx xxxx 0000 0000 0001 1xxx xxxx xxxx ---x xxxx xxxx xxxx xxxx xxxx xxxx xxxx ---0 0000 0000 000x ---.---1111 1111 0000 0000 000q quuu uuuu uuuu ---1 1111 1111 1111 ---0 q000 ---.------0 0000 0000 000u uuuu uuuu ---.

.

spegnerà tutti i circuiti interni. ovvero 1000 volte inferiore.Il Power Down Mode 81 .IL POWER DOWN MODE INTRODUZIONE Il Power Down Mode o Sleep Mode è un particolare stato di funzionamento del PICmicro utilizzato per ridurre il consumo di corrente nei momenti in cui il PICmicro è in attesa di un evento esterno. L'ISTRUZIONE SLEEP L'istruzione SLEEP viene utilizzata per mettere il PIC in Power Down Mode (modalità a basso consumo) e ridurre di conseguenza la corrente assorbita che passerà da circa 2mA (a 5 volt con clock di funzionamento a 4Mhz) a circa 2µA. Se ad esempio il PIC gestisce un telecomando per apricancello o per TV. Appena premuto. non devono esserci ovviamente circuiti collegati alle linee di uscita del PIC che assorbono corrente. il PICmicro effettua una breve trasmissione per mettersi poi nuovamente in attesa della pressione del prossimo tasto. tranne quelli necessari a mantenere lo stato delle porte di I/O (stato logico alto. Più precisamente questi circuiti dovranno essere progettati in modo da limitare il loro assorbimento nelle condizioni di Power Down. Per ridurre il consumo di corrente in questo stato.10 . è possibile spegnere buona parte dei circuiti di funzionamento del PICmicro e riaccenderli solo in corrispondenza di un particolare evento esterno. mentre per diverse ore non è richiesta nessuna elaborazione particolare. Il tempo di utilizzo effettivo della CPU del PICmicro risulta quindi limitato ai pochi millisecondi necessari per effettuare la trasmissione. Per entrare in Power Down Mode basta inserire questa istruzione in un punto qualsiasi del programma: SLEEP Qualsiasi istruzione presente dopo la SLEEP non verrà eseguita dal PICmicro che terminerà in questo punto la sua esecuzione. Per evitare l’inutile dispendio della limitata energia dalla batteria. è evidente che per la maggior parte del tempo il PICmicro rimane in attesa che qualcuno prema un tasto. basso o alta impedenza) ed a rilevare le condizioni di "risveglio" che verranno analizzate in seguito. Un altro accorgimento 10 .

Si noti che l’Interrupt Handler in questo caso non compie alcuna azione specifica. Nel caso 3 il PICmicro si comporta come nella normale gestione di un interrupt eseguendo per primo l'interrupt handler e quindi riprendendo l'esecuzione dall'istruzione successiva alla SLEEP. basterà premere SW1 per generare un interrupt e far riprendere l'esecuzione del programma. Il sorgente utilizzato è PDM. termine delle operazioni di scrittura su EEPROM) Nei casi 1 e 2 il PICmicro viene resettato e l'esecuzione ripresa dalla locazione 0.raccomandato da Microchip è quello di collegare al positivo (Vdd) o al negativo (Vss) di alimentazione tutte le linee in alta impedenza non utilizzate compresa la linea RA4/T0CKI (pin 3). ma si limita ad azzerare i flag e restituire il controllo al programma principale. ESEMPIO DI POWER DOWN MODE In questo esempio il PICmicro entra in Power Down Mode alla pressione di un pulsante ed. Il LED 1 rimarrà acceso o spento in base al momento scelto per premere SW2. cambio di stato sulla porta B. Perché il PICmicro venga risvegliato da un interrupt devono essere abilitati opportunamente i flag del registro INTCON. Reset del PICmicro mettendo a 0 il pin MCLR (pin 4) 2.1.ASM e lo schema è riportato nella figura 10. possono essere utilizzate diverse tecniche: 1. in particolare. in corrispondenza di un interrupt sul fronte di discesa applicato al pin RB0/INT. Per effettuare l'uscita dal Power Down Mode del PICmicro.Il Power Down Mode . Premendo il tasto SW2 il programma eseguirà l'istruzione: SLEEP portando il PICmicro in Power Down Mode. Verificarsi di una situazione di interrupt (interrupt dal pin RB0/INT. In pratica il LED 1 collegato alla linea RB2 lampeggerà ad indicare l'esecuzione del programma in corso. Timeout del Watchdog Timer (se abilitato) 3. 82 10 . IL "RISVEGLIO" DEL PICMICRO Per risvegliare il PICmicro dallo stato di basso consumo.

Figura 10.Il Power Down Mode 83 .ASM utilizzato in questo esempio. 10 .1: Esempio di Power-Down Mode Nel CD allegato Nella cartella \sorgenti trovate il file PDM.

.

È possibile però assegnare il PRESCALER al Watch Dog Timer per ottenere ritardi più lunghi fino a 2. con buona probabilità il programma è bloccato quindi viene fatto automaticamente un Reset. Il periodo minimo oltre il quale la CPU viene resettata è di circa 18ms (dipende dalla temperatura e dalla tensione di alimentazione). viene inserita all'interno del programma principale. Il Watch Dog Timer è un oscillatore interno al PICmicro molto simile al TMR0. Nota Per poter utilizzare il Watch Dog Timer occorre abilitarlo mediante i flag di configurazione del programmatore o mediante la direttiva __CONFIG. ma completamente indipendente dal resto della circuiteria. il cui scopo è quello di rilevare eventuali blocchi della CPU e resettare il PICmicro per riprendere la normale esecuzione del programma. Per abilitare il Watch Dog Timer occorre abilitare in fase di programmazione il flag WDTE della word di configurazione (utilizzando la direttiva __CONFIG oppure manualmente secondo le modalità relative al programmatore in uso). una istruzione speciale: CLRWDT (CLeaR Watch Dog Timer) la quale azzera ad intervalli regolari il Watch Dog Timer impedendogli di terminare il suo conteggio.11 .IL WATCH DOG TIMER (WDT) INTRODUZIONE In questo capitolo verrà illustrato il funzionamento del Watch Dog Timer il cui scopo è quello di migliorare l'affidabilità dei circuiti basati su PICmicro. Per poter rilevare un eventuale blocco della CPU durante l'esecuzione di un programma. Se la CPU non effettua questa istruzione prima del termine del conteggio.Il watch dog timer (WDT) 85 . 11 .3 secondi.

152 s 2.ASSEGNAZIONE DEL PRESCALER AL WDT Agendo sul bit PSA del registro OPTION_REG è possibile assegnare il prescaler al Watch Dog Timer per ottenere dei tempi di ritardo di intervento maggiori.1 è riportato la corrispondenza tra i valori di questi bit e gli intervalli ottenuti. Intervenendo sui valori dei bit PS0. PS1 e PS2 dello stesso registro OPTION_REG si possono ottenere diversi intervalli di ritardo. Nella tabella 11.304 s Tabella 11. Il bit PSA deve essere impostato ad uno con l'istruzione: BSF OPTION_REG.1: Fattori di divisione impostabili per il WDT 86 11 .PSA In caso contrario il prescaler verrà assegnato al TIMER 0.Il watch dog timer (WDT) . Ovviamente assegnando il prescaler al WDT non sarà possibile assegnarlo completamente al TIMER 0 e viceversa. La scelta corretta dovrà essere fatta tenendo conto del massimo ritardo ottenibile all'interno del programma tra l'esecuzione di due istruzioni CLRWDT successive. PS2 PS1 PS0 Divisore Periodo di ritardo del WDT 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 1 2 4 8 16 32 64 128 18 ms 36 ms 72 ms 144 ms 288 ms 576 ms 1.

Trascorsi circa 2. Come prova del funzionamento del WDT. Durante la fase di programmazione è necessario abilitare il Watch Dog Timer impostando il relativo flag qualora il programmatore non riconoscesse l’impostazione dei flag di configurazione settati con la direttiva __CONFIG. si consideri lo schema di figura 11.ESEMPIO PRATICO DI USO DEL WATCH DOG TIMER Come esempio pratico di uso del Watch Dog Timer.ASM. è possibile riprogrammare il 11 .1 ed il file sorgente WDT. Premendo il tasto SW2 la CPU entra in un loop infinito (StopLoop) all’interno del quale non viene mai eseguita la CLRWDT. Figura 11.Il watch dog timer (WDT) 87 . Durante il lampeggio viene eseguita continuamente l'istruzione CLRWDT per evitare che la CPU venga resettata.3 secondi.1: Esempio di uso del WDT All’entrata in esecuzione del programma il LED 1 inizierà a lampeggiare. il Watch Dog Timer effettua automaticamente il reset della CPU ed il LED 1 inizia nuovamente a lampeggiare.

88 11 .PIC16F84A con lo stesso programma senza abilitare il WDTE mediante il programmatore (o disabilitandolo manualmente qualora risultasse abilitato).ASM utilizzato in questo esempio. In questo caso premendo il tasto SW2 il lampeggio di LED1 si blocca e non si ripristina in alcun modo.Il watch dog timer (WDT) . Nel CD allegato Nella cartella \sorgenti trovate il file WDT.

Le modalità di accesso sono notevolmente diverse dalla memoria RAM dei REGISTER FILE e devono seguire una serie di procedure particolari atte ad evitare eventuali perdite di dati in condizioni di funzionamento anomale. La memoria EEPROM è scrivibile e leggibile in condizioni di normale alimentazione e senza dover ricorrere ad alcun programmatore esterno. La EEPROM DATI è una particolare area di memoria da 64 byte nella quale possono essere scritti valori numerici che rimarranno memorizzati anche in mancanza di tensione di alimentazione.SCRITTURA E LETTURA DATI DA EEPROM In questo capitolo verrà analizzato il funzionamento della EEPROM DATI interna al PIC16F84A. Si pensi. La prima operazione da compiere è scrivere nel registro EEADR l'indirizzo della locazione di memoria che sarà oggetto di scrittura. ad esempio. • EECON1 ed EECON2 sono due registri di controllo utilizzati nelle operazioni di lettura e scrittura come descritto in seguito. Si supponga di voler scrivere il valore decimale 10 nella locazione 0 della EEPROM dati. oppure ad una chiave elettronica realizzata con un PIC che riceve alimentazione solo quando l'utente inserisce la chiave nel lettore. In tutti questi casi la EEPROM DATI integrata nel PIC16F84A garantisce un ottimo livello di sicurezza nella conservazione dei dati. ad un sistema anti intrusione in cui il PIC deve mantenere il codice di accesso anche quando il sistema è spento in modo che non sia necessaria una riprogrammazione ad ogni accensione.12 . SCRITTURA DI UN DATO SU EEPROM Vediamo ora come sia possibile scrivere un dato su una locazione EEPROM. REGISTRI SPECIALI PER L’ACCESSO ALLA EEPROM DATI Per accedere alla EEPROM DATI vengono utilizzati i seguenti registri speciali: • EEADR è il registro utilizzato per indirizzare una delle 64 locazioni di memoria EEPROM in cui si desidera effettuare una lettura o scrittura di un dato. • EEDATA è il registro che viene usato per inviare un byte alla EEPROM in scrittura oppure per ricevere un byte dalla EEPROM in lettura. Si intuisce immediatamente quanto possa essere utile questo tipo di memoria. utilizzando le 12 . unito ad una relativa facilità d'uso.Scrittura e lettura dati da EEPROM 89 .

Dato che il registro EECON1 è situato nel banco registri 1.WR L'hardware del PIC impiega un certo tempo. per programmare la cella EEPROM con il valore inviato.Si. In particolare nel registro EECON2 dovranno essere scritti in sequenza i due valori esadecimali 0x55 e 0xAA: movlw movwf movlw movwf 0x55 EECON2 0xAA EECON2 Eseguite queste operazioni preliminari è possibile avviare la scrittura settando il flag WR (WRite) del registro EECON1 con l'istruzione: bsf EECON1. continua con le istruzioni successive 90 12 . la scrittura su EEPROM avviene seguendo una precisa sequenza di operazioni di scrittura sul registro EECON2. aspetta .Scrittura e lettura dati da EEPROM .seguenti istruzioni: movlw movwf 0 EEADR Nel registro EEDATA dovrà invece essere scritto il valore da inviare alla locazione EEPROM indirizzata con il registro EEADR: movlw movwf D’10’ EEDATA Per poter abilitare l'accesso alle successive operazioni di scrittura dovrà essere portato ad uno il flag WREN (WRite ENable). Di seguito è riportato un ciclo di attesa per sospendere il programma principale fino alla fine dell’operazione di scrittura: WriteDoneLoop btfsc EECON1. contenuto nel registro di controllo EECON1.WR .Indirizza il banco 1 bsf STATUS.Abilita la scrittura bsf EECON1.WREN Per evitare scritture accidentali in caso di funzionamento anomalo del PIC dovuto a sbalzi di tensione o errori di programmazione.RP0 . Al termine dell'operazione viene automaticamente azzerato il flag WR del registri EECON1. a partire da questo momento. si dovrà indirizzare tale banco settando il bit RP0 del registri STATUS prima di accedervi: .No.Finito di scrivere ? goto WriteDoneLoop .

12 . LETTURA DI UN DATO DA EEPROM Per leggere un dato da una locazione della memoria EEPROM dovrà essere dapprima selezionato l’indirizzo della locazione da leggere scrivendolo nel registro EEADR (tale registro è nel banco 0 per cui dovrà essere selezionato tale banco prima dall’accesso al registro): bcf STATUS.Indirizza il banco 1 Il dato letto dalla locazione specificata in EEADR viene trasferito nel registro EEDATA dal quale può essere prelevato con una operazione di MOVF: bcf movf STATUS. Per scrivere un nuovo valore nella stessa cella EEPROM non è necessario effettuare operazioni di cancellazione.W il .Scrittura e lettura dati da EEPROM 91 .RP0 .RP0 EECON1.Il ciclo di attesa può essere evitato se si abilita l’interrupt relativo alla scrittura dati su EEPROM. ma è sufficiente ripetere le operazioni di scrittura.Indirizza il banco 0 movlw 0 movwf EEADR La lettura vera e propria avviene portando ad uno il flag RD (ReaD) del registro di controllo EECON1 (registro del banco 1): bsf bsf STATUS.RD .RP0 EEDATA.Indirizza il banco 0 dato letto dalla EEPROM viene trasferito Con queste istruzioni nell’accumulatore W.

.

Figura 13. I display LCD più comuni reperibili in commercio.1.ESEMPI ED APPLICAZIONI PRATICHE GESTIONE DI UN DISPLAY LCD Come esempio di applicazione pratica di un microcontrollore.Esempi ed applicazioni pratiche 93 .1: Pilotaggio di un display LCD 13 . si rimanda al testo “Display LCD” della collana “Conoscere ed Usare” di Inware Edizioni. Questo tipo di interfaccia prevede che il display sia collegato al micro tramite un bus dati da 4 o 8 linee più 3 linee di controllo e le linee di alimentazione. Lo schema elettrico del circuito è riportato in figura 13. Per approfondire le conoscenze sui display LCD alfanumerici e grafici.13 . dispongono di una un'interfaccia ideata da Hitachi che nel tempo è divenuta uno standard industriale utilizzato anche da altre case produttrici. verrà illustrata la gestione di un display a cristalli liquidi o LCD (dall'inglese Liquid Crystal Display) dotato di 2 linee di 16 caratteri ciascuna.

Questo pin deve essere collegato al negativo di alimentazione VDD LCD Power Supply. A questo pin deve essere applicata una tensione variabile da 0 a 5 volt.ASM. sul bus dati (linee DB0÷DB7). Questo pin è una linea di controllo con cui si comunica al display se si intende inviare un dato (R/W=0) oppure leggerlo (R/W=1). per regolare il contrasto del display Register Select. Pin Nome Funzione 1 2 3 GND Ground. Enable. Hello World! Il file sorgente da utilizzare è LCD1. DB2 e DB3 non saranno utilizzate.Nella tabella 13. tramite un trimmer.1 vengono descritte le funzioni di ogni singola linea disponibile per interfacciare il display. Anche la linea R/W non verrà utilizzata e sarà collegata direttamente a massa.1: I pin di un display LCD 4 5 6 7 8 9 10 11 12 13 14 RS R/W E DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 Per ridurre al massimo i collegamenti tra il PIC ed il display LCD. un comando (RS=0) oppure un dato (RS=1) Read/Write. DB1. Questo pin è una linea di controllo con cui si può abilitare il display ad accettare dati ed istruzioni dal bus dati (E=1) Data bus line 0 –Su queste linee viaggiano i dati tra il PIC e il display Data bus line 1 Data bus line 2 Data bus line 3 Data bus line 4 Data bus line 5 Data bus line 6 Data bus line 7 Tabella 13. Una volta programmato il PIC con il file compilato. 94 13 . quindi verranno collegate a massa. verrà utilizzata la modalità di collegamento dati a 4 bit che impiega solo le linee DB4. Questo pin deve essere collegato al positivo di alimentazione (+5V). Questo pin è una linea di controllo con cui si comunica al display se si sta inviando. all'accensione del circuito apparirà sul display la schermata riportata in figura 13. In questo modo la modalità di funzionamento viene impostata come sola scrittura e consente di inviare dati all'LCD. DB6 e DB7. ma non di riceverli. DB5.2. Le linee DB0.Esempi ed applicazioni pratiche . Liquid Crystal Driving Voltage.

Figura 13. Le due linee di controllo sono la linea Enable (pin 6 dell'LCD) e Register Select (pin 4 dell'LCD).ASM semplificando così al massimo la complessità del programma. per pilotare il display utilizzando solo quattro linee dati. tutte le operazioni di trasmissione di dati e comandi verso il display vengono eseguite da una serie di subroutine presenti nel file LCD1. Il PIC.2: Il risultato dell’esecuzione del programma LCD1. Nel CD allegato Nella cartella \sorgenti trovate il file LCD1. ovvero ogni byte viene scomposto in due gruppi di 4 bit. il PIC deve inviare una serie di comandi tramite le linee del bus dati (linee da DB4 a DB7). Le linee Enable (E) e Register Select (RS) dell'LCD Per poter visualizzare una scritta sul display. Nel sorgente di esempio. viene fatta una operazione di "multiplex". sarà necessario regolare il contrasto del display LCD agendo sul trimmer R2 connesso al pin 3 del display. a sua volta. Vengono inviati prima i quattro bit più significativi seguiti dai quattro bit meno significativi. come ad esempio spostare il cursore o pulire lo schermo.ASM Se sul display non è visibile alcun messaggio o sono visibili solo due righe di rettangoli neri. quindi trasmessi sul bus in sequenza. Per far questo utilizza due linee di controllo con cui comunica al display l'operazione di trasferimento che intende effettuare. 13 . Multiplex sul bus dati Sia i comandi che i dati sono rappresentati da numeri a 8 bit dunque. deve preoccuparsi di aver già inviato sul bus il comando o il dato corretto prima di portare a livello alto il segnale Enable. Con la linea Register Select (RS) il PIC segnala al display che il dato presente sul bus è un comando (RS=0) o un dato da visualizzare (RS=1). La linea Enable abilita il display a leggere il comando (o il dato) inviato sul bus dal PIC. Come dati il PIC può inviare al display direttamente i caratteri ASCII da visualizzare.Esempi ed applicazioni pratiche 95 .ASM utilizzato in questo esempio. Tramite i comandi il PIC può segnalare al display il tipo di operazione da compiere.

LCD Control lines LCD_RS LCD_E equ 2 . Segue una parte di definizione delle linee di connessione tra il PIC ed il display.Register Select equ 3 . Questa subroutine viene utilizzata sempre dalle subroutine di gestione dell'LCD per generare le temporizzazioni richieste durante la trasmissione di dati e comandi all'LCD.LCD . Le singole definizioni verranno usate all'interno delle subroutine di gestione dell'LCD al posto dei singoli numeri di identificazione delle linee di I/O. La prima chiamata a subroutine è: call LcdInit LcdInit è una subroutine che deve essere chiamata solo una volta all'inizio del programma e prima di qualsiasi altra subroutine di gestione dell'LCD.LCD .ASM Nella prima parte del file sorgente vengono definite alcune costanti: .Esempi ed applicazioni pratiche . Essa si occupa di effettuare tutte le operazioni necessarie per inizializzare correttamente l'LCD e consentire. tmpLcdRegister res 2 msDelayCounter res 2 Queste due istruzioni allocano spazio per due registri: tmpLcdRegister. alle funzioni successive.LCD data data data data line line line line DB4 DB5 DB6 DB7 Queste costanti definiscono l'associazione tra le linee del PIC (tutte connesse alla PORTA B) e le linee del display.Enable . di poter operare correttamente. Con le istruzioni seguenti: movlw call 0x00 LcdLocate viene posizionato il cursore del display sulla prima riga e prima colonna dello 96 13 .LCD data line bus LCD_DB4 LCD_DB5 LCD_DB6 LCD_DB7 equ equ equ equ 4 5 6 7 .LCD .Analizziamo il sorgente LCD1. usato dalle routine di gestione dell'LCD e msDelayCounter usato dalla subroutine msDelay che genera dei ritardi software da 1 ms per il contenuto del registro W.

LcdInit Questa subroutine si occupa di inizializzare il display LCD e di pulire lo schermo.3: Il testo può essere posizionato a partire da qualsiasi punto Per visualizzare ogni carattere della scritta vengono utilizzate le seguenti istruzioni: movlw call 'H' LcdSendData per ciascuna lettera da visualizzare. Figura 13. L'incremento della posizione del cursore avviene automaticamente. La prima istruzione carica in w il codice ASCII della lettera da visualizzare (nell’esempio la lettera ‘A’). Non richiede alcun passaggio di parametri. I quattro bit più significativi del valore caricato nel registro W con l'istruzione: movlw 0x00 contengono il numero della riga dove si vuole posizionare il cursore.schermo. 13 . Deve essere chiamata una sola volta e prima di qualsiasi subroutine di gestione dell’LCD.ASM. Cambiando tale valore nel registro W. Subroutine di gestione del display LCD Di seguito sono riportate le funzioni svolte dalle subroutine di gestione del display LCD fornite con il sorgente LCD1.3A mentre con il valore 0x12 il risultato è quello di figura 13. la routine LcdSendData preleva il dato dal registro w e lo invia al display. è possibile ottenere posizionamenti diversi.Esempi ed applicazioni pratiche 97 .3B. mentre i quattro bit meno significativi contengono il numero della colonna. I caratteri inviati successivamente verranno visualizzati a partire da questa posizione. Con il valore 0x10 ad esempio si ottiene il risultato di figura 13.

Richiede nel registro W il valore ASCII del carattere da visualizzare. LcdSendData Serve ad inviare un carattere ASCII all’LCD da visualizzare nella posizione corrente del cursore. LcdSendByte Questa funzione viene utilizzata internamente alle altre funzioni di gestione dell’LCD e si occupa di effettuare lo split di dati e comandi a 8 bit sul bus di dati. I comandi riconosciuti dall’LCD sono riportati sul data-sheet dello stesso. I bit da D0 a D3 contengono il valore di colonna (asse Y) mentre i bit da D4 a D7 il valore di riga (asse X).LcdClear Pulisce il contenuto dello schermo e riposiziona il cursore sulla prima colonna della prima riga. La numerazione delle righe parte da 0 in alto. La numerazione delle colonne parte da 0 a sinistra. 98 13 . LcdSendCommand Serve ad inviare un comando all’LCD.Esempi ed applicazioni pratiche . Non richiede alcun passaggio di parametri. Richiede il valore di riga e colonna per il posizionamento del cursore nel registro W. LcdLocate Consente di posizionare arbitrariamente il cursore all’interno dell’area visibile del display.

4. Il circuito permette di visualizzare sul display LCD i caratteri ASCII trasmessi da un PC attraverso una porta seriale tramite un normale emulatore di terminale come Hyperterminal (su Windows 95/98/ME/2000/XP).Esempi ed applicazioni pratiche 99 . Lo schema elettrico da utilizzare è riportato nella figura 13. Telix (su MS/DOS) o Minicom (su Linux).4: Visualizzazione di caratteri su LCD inviati da un PC su RS232 13 . Figura 13.GESTIONE DI UNA CONNESSIONE RS232 Introduzione Questa applicazione mostra come sia possibile dotare il PIC16F84A di una interfaccia RS232 per il collegamento alla porta seriale di un PC.

verrà inviato da quest’ultimo al modem remoto che.Esempi ed applicazioni pratiche . per cui per 100 13 . a sua volta.5: un computer (DTE) collegato al modem (DCE) ed un altro modem remoto (DCE) collegato al computer (DTE). Nel caso dell’applicazione di esempio.5: Connessione via modem tra due PC remoti Per usare la RS232 per collegare tra loro due computer (DTE) senza interporre tra loro alcun dispositivo DCE è necessario simulare le connessioni intermedie realizzando un cavo NULL MODEM (o cavo invertente). mentre il Data Terminal Equipment è un dispositivo che si occupa di generare o ricevere dati. Cos'é e a cosa serve l'RS232 Lo standard RS232 definisce una serie di specifiche per la trasmissione seriale di dati tra due dispositivi denominati DTE (Data Terminal Equipment) e DCE (Data Communication Equipment). si occupa di convertire i segnali RS232 dai +/-12 volt necessari per trasmettere e ricevere dati sulla porta seriale ai livelli TTL (0/5 volt) gestibili direttamente dalle porte del PIC. Lo standard RS232 è stato creato per connettere tra loro un terminale dati (in questo caso un computer) con un modem.4 simula un DCE. Il Data Communication Equipment è un dispositivo che si occupa di gestire una comunicazione dati. per la trasmissione di dati a distanza. è opportuno richiamare brevemente il funzionamento della comunicazione seriale RS232. Prima di iniziare l’analisi del file sorgente di questa applicazione. Nel CD allegato Nella cartella \Documentazione trovate il file max232. Per avere una connessione tra due computer remoti è quindi necessario disporre di quattro dispositivi come visibile in figura 13.pdf che è il datasheet del circuito integrato MAX232 utilizzato nello schema dell’esempio. provvederà ad inviarlo al computer connesso tramite RS232. Figura 13.L'integrato MAX232 prodotto da Maxim. i circuito di figura 13. In questo modo qualsiasi dato generato dal primo computer e trasmesso tramite RS232 al relativo modem. Ovviamente è valido anche il processo inverso.

Nella presente trattazione verrà analizzata solo la comunicazione seriale asincrona rimandando ai testi specializzati chi volesse approfondire la comunicazione seriale sincrona. Per indicare al PC ricevente che la trasmissione ha inizio. Quando nessuna trasmissione è in corso la tensione sulla linea TXD è di -12 volt corrispondente alla condizione logica 1. Dovendo trasmettere un intero byte sarà necessario inviare in sequenza ogni singolo bit in esso contenuto. La connessione RS232 più semplice prevede una linea di trasmissione (TXD) ed una di ricezione (RXD) per cui collegare in seriale due PC significa collegare la linea di trasmissione del primo con quella di ricezione del secondo e viceversa. Figura 13. Una di queste riguarda il tipo di comunicazione seriale che può essere sincrona o asincrona. la velocità di trasmissione è 9600 bit per secondo (baud). lo standard RS232 definisce una serie di specifiche elettriche e meccaniche. Se. La comunicazione seriale asincrona Per consentire la trasmissione di dati tra il PC ed il modem. Dopo lo start bit vengono trasmessi in sequenza gli otto bit componenti il codice ASCII del carattere trasmesso partendo dal bit meno significativo.6.104 ms. ad esempio. il PC trasmittente porta a +12 volt la linea TXD per un tempo pari al tempo di trasmissione di un singolo bit (corrispondente all’inverso della frequenza di trasmissione). sarà necessario un cavo dritto e non invertente. Una comunicazione seriale consiste nella trasmissione e ricezione di dati da un punto ad un altro usando una sola linea di comunicazione.il collegamento con il PC.6: Livelli di tensione RS232 per la trasmissione del carattere “A” 13 . Nel caso della lettera A (maiuscola) il valore del byte da trasmettere è 01000001. ad esempio. di voler trasmettere il carattere A usando il protocollo RS232.Esempi ed applicazioni pratiche 101 . Si supponga. Questo segnale viene denominato START BIT ed è sempre presente all'inizio della trasmissione di ogni singolo byte. Collegando un oscilloscopio sulla linea TXD del PC trasmettitore durante la trasmissione del carattere A si rileva il segnale di figura 13. la tensione della linea TXD rimarrà a +12 volt per: 1/9600=0.

il nostro circuito. Dato che i dispositivi DTE sono sempre dotati di connettore DB9 maschio. Come collegare il circuito d'esempio Come accennato il circuito d'esempio simula un dispositivo DCE ciò significa che il cavo da realizzare non dovrà essere di tipo NULL MODEM o INVERTENTE. il PC aggiunge automaticamente un ultimo bit a 1 denominato STOP BIT ad indicare l'avvenuta trasmissione dell'intero byte. ma DRITTO ovvero con i pin numerati allo stesso modo connessi tra loro. Questo tipo di cavo è identico a quelli che vengono usati per connettere al PC un modem esterno. essendo un DCE.Una volta trasmesso l'ottavo bit (bit 7). avrà un connettore DB9 femmina la cui pedinatura è riportata nella seguente tabella: Pin 1 Pin 2 Pin 3 Pin 4 Pin 5 Pin 6 Pin 7 Pin 8 Pin 9 Received Line Signal Detector (Data Carrier Detect) Received Data Transmit Data Data terminal Ready Signal Ground Data set ready Request To Send Clear To Send Ring Indicator In alcuni casi i PC sono dotati di vecchi connettori DB25 anziché DB9 e la tabella seguente riporta i pin sui quali si trovano i segnali di interesse: Pin 1 Pin 2 Pin 3 Pin 4 Pin 5 Pin 6 Pin 7 Pin 8 Pin 20 Pin 22 Protective Ground Transmit data Received data Request To send Clear To Send Data Set Ready Signal Ground Received Line Signal Detector (Data Carrier Detect) Data terminal Ready Ring Indicator Il cavo di collegamento tra il PC ed il circuito dovrà essere intestato a sua volta con un connettore femmina da un lato per poter essere inserito nella seriale del 102 13 . La stessa sequenza viene ripetuta per ogni byte trasmesso sulla linea.Esempi ed applicazioni pratiche .

Dallo schema di figura 13.PC ed un connettore maschio dall'altro per poter essere inserito nel connettore del circuito di prova. 13 . Il segnale presente sul pin 12 del MAX232 viene quindi inviato alla linea RA1 della porta A del PIC che in questo caso farà da linea di ricezione. Viceversa sul pin 17 (RA0) il PIC genera i segnali TTL da inviare al PC che vengono convertiti in segnali RS232 dal MAX232 tramite i pin 11 (ingresso TTL) e 14 (uscita RS232) quindi inviati al PC tramite il pin 2 del connettore J2. Sul pin 12 del MAX232 sarà presente un segnale a 0 volt quando sul pin 13 ci saranno +12 volt e 5 volt quando sul pin 13 ci saranno -12 volt.7: Cavo dritto per la connessione del circuito al PC Funzionamento del MAX232 Come già anticipato. ovvero un integrato in grado di convertire i segnali a +/. mentre il livello ‘0’ corrisponde ad una tensione di -12V. Figura 13. Nota Il livello logico ‘1’ su una linea RS232 corrisponde ad una tensione di +12V. Nella figura 13.12 volt tipici della RS232 in segnali a 0/5 volt gestibili dalle porte del PIC. I collegamenti interni al cavo da usare sono riportati nella figura 13.7.4 si nota che il segnale di trasmissione proveniente dal PC entra dal pin 3 del connettore DB9 femmina sul pin 13 del MAX232.8 sono riportati i segnali in arrivo dalla seriale ed i segnali che arrivano sul pin 18 del PIC (RA1).Esempi ed applicazioni pratiche 103 . nel circuito d'esempio viene usato un transceiver RS232.

Tx data RX equ 1 . Premendo qualche tasto sulla tastiera del PC si osserva come i caratteri digitati vengano visualizzati anche sul display LCD del circuito.Figura 13. 8 bit dati. In questa applicazione in realtà non viene ancora usata la linea di trasmissione in quanto il circuito miniterminale è in grado per ora solo di ricevere caratteri. Sul display apparirà il cursore lampeggiante in alto a sinistra. Alla linea 24 del file sorgente si trovano le seguenti direttive: TX equ 0 . 1 stop bit e no parità senza alcun controllo di flusso. Queste due subroutine consentono di trasmettere e ricevere byte in modalità seriale asincrona a 9600 bps. Queste due costanti vengono utilizzate rispettivamente dalle subroutine di trasmissione e ricezione di caratteri via RS232: TxChar ed RxChar. 104 13 . 1 stop bit e nessuna parità. La combinazione di tasti CTRL+L consente di pulire lo schermo dell'LCD per visualizzare nuove scritte.Esempi ed applicazioni pratiche .Rx data in cui vengono assegnate alle costanti TX e RX rispettivamente le linee di trasmissione (TX) e ricezione (RX) del PIC.8: Segnali in arrivo sulla seriale Analisi del file sorgente Il file sorgente per questa applicazione è LCDTERM. Una volta compilato il sorgente e programmato correttamente il PIC16F84A è possibile collegare al PC il circuito e fornire alimentazione. è necessario lanciare in esecuzione un programma qualsiasi di emulazione terminale e configurato per usare la porta seriale a cui è collegato il circuito ed impostando i parametri a 9600 baud. 8 data bit.ASM. Per comunicare con il circuito.

In questo caso viene chiamata la RxChar che si occuperà di leggere ogni singolo bit ricevuto. 13 . arriveranno in sequenza i bit appartenenti al dato trasmesso dal PC.5 bit Viene ora letto lo stato della linea RX ed il valore letto viene inserito nel flag di CARRY (C) del registro STATUS. secondo quanto detto sopra. Si consideri il file sorgente a partire dall’etichetta MainLoop: MainLoop btfsc goto call PORTA. la RxChar azzera il registro ShiftReg in cui verranno memorizzati i bit via via che vengono ricevuti RxChar clrf ShiftReg quindi imposta a 8 il registro BitCount usato per il conteggio del numero di bit in arrivo movlw movwf 8 BitCount a questo punto attende un periodo pari a circa 1 bit e mezzo in modo da far scorrere il tempo necessario alla trasmissione dello start bit e campionare il valore del BIT 0 circa a metà del tempo di durata.Wait 1. compattarli in un unico byte e restituire il valore del byte così ricevuto nel registro ShiftReg. Ipotizzando di voler trasmettere il carattere 'A' al PC il codice da inserire è il seguente: movlw call 'A' TxChar Per ricevere caratteri l'operazione è leggermente più complessa.Esempi ed applicazioni pratiche 105 . Quando questo avviene significa che molto probabilmente è arrivato lo START BIT dal PC e che. Una volta lanciata.9.RX MainLoop RxChar Il programma esegue un loop infinito finché non rileva uno stato logico 0 sulla linea RX.Per trasmettere un carattere sulla linea TX basta inserire nel registro W il valore da trasmettere ed effettuare una chiamata alla subroutine TxChar. Una istruzione di ROTATE RIGHT F TROUGHT CARRY (RRF) con il registro ShiftReg consente di spostare verso destra tutti i bit del registro ShiftReg ed inserire nel bit più significativo il valore appena letto dalla linea RX come riportato nella figura 13. DELAY BIT_DELAY+BIT_DELAY/2 .

L'unico carattere di controllo ammesso dal programma è il Form Feed (FF) corrispondente al codice ASCII decimale 12.F wDB e termina dopo aver letto l'ultimo bit return All’uscita della RxChar.9: Operazione di RRF su un registro f Questa lettura avviene per otto volte ad intervalli di tempo pari alla durata di un bit in modo da campionare il valore della linea RX sempre al centro del bit in ricezione. nel registro ShiftReg c’è il byte trasmesso dal PC.C goto RxShift RxBitL bcf STATUS. Se il programma riconosce tale codice. Il programma è ora in grado di controllare se il byte ricevuto è un carattere di controllo oppure un normale carattere da visualizzare su LCD. Il form feed può essere trasmesso dal PC premendo il tasto CTRL seguito dalla lettera L. provvede a ripulire il contenuto dell'LCD.Esempi ed applicazioni pratiche . attende per un periodo di tempo pari ad 1 bit DELAY BIT_DELAY La routine RxChar continua a campionare se non ha ancora letto tutti gli otto bit decfsz goto BitCount. wDB btfss PORTA.F .C D7 D6 D5 D4 D3 D2 D1 D0 Registro f Figura 13. Ecco la parte di codice che gestisce la ricezione di un Form Feed: 106 13 .C goto RxShift RxShift nop rrf ShiftReg.RX goto RxBitL RxBitH nop bsf STATUS.

W putchar Quindi torna ad attendere lo START BIT del prossimo carattere con la seguente istruzione: goto MainLoop La subroutine putchar invia il valore contenuto nel registro W al display LCD nella posizione in cui si trova il cursore carattere (xCurPos e yCurPos). In ogni caso i registri xCurPos ed yCurPos vengono aggiornati alla posizione successiva in cui poter scrivere il nuovo carattere ricevuto dal PC. In caso affermativo vengono azzerati i registri xCurPos e yCurPos che contengono la posizione corrente del cursore sul display.W STATUS.Esempi ed applicazioni pratiche 107 . Nel CD allegato Nella cartella \sorgenti trovate il file LCDTERM. il carattere ricevuto viene inviato al display con il seguente codice: movf call ShiftReg.CheckFormFeed movlw xorwf btfss goto clrf clrf call goto 12 ShiftReg. Quindi viene chiamata la subroutine LcdClear che si occupa di inviare i comandi corretti al display LCD per azzerarne il contenuto. Nel caso non sia stato trasmetto un FF dal PC.Z _CheckFormFeed xCurPos yCurPos LcdClear MainLoop _CheckFormFeed in pratica viene controllato se il valore ricevuto dalla subroutine RxChar è pari a 12. quindi si occupa di mandare il cursore sulla seconda linea se è stato raggiunto il fine riga o di riportarlo alla prima riga se si è raggiunto il fine display.ASM utilizzato in questo esempio. 13 .

10 che permette di controllare l’accensione dei led dal PC nonché leggere lo stato degli switch.10: Pilotaggio e monitoraggio delle porte I/O via RS232 Per valutare la trasmissione seriale sia in ricezione che in trasmissione si consideri il circuito di figura 13. 108 13 .UN ALTRO ESEMPIO CON L'INTERFACCIA RS232 Figura 13.Esempi ed applicazioni pratiche .

3 indicano lo stato dei pulsanti secondo la seguente tabella. legge lo stato dei bit RB4. SWITCH2.2. Tramite un semplice protocollo è possibile decidere quale dei quattro led dovrà accendersi oppure leggere lo stato di uno qualsiasi dei quattro pulsanti. 1 stop bit. Comandi di accensione LED I comandi per l’accensione dei LED sono i seguenti: 00h 01h 02h 03h Accensione LED 1 Accensione LED 2 Accensione LED 3 Accensione LED 4 Comandi di spegnimento LED I comandi per lo spegnimento dei LED sono i seguenti: 10h 11h 12h 13h Spegnimento LED 1 Spegnimento LED 2 Spegnimento LED 3 Spegnimento LED 4 Lettura stato pulsanti Per leggere lo stato di tutti i quattro pulsanti basta inviare un unico comando: 20h Lettura stato pulsanti Quando il PIC riceve questo comando dalla RS232. 8 data bit.1. 1 = SWITCH 4 premuto Per cui se ad esempio solo lo SWITCH 1 risulta chiuso. SWITCH3 e SWITCH4.Protocollo di comunicazione con il PC Il circuito è dotato di quattro LED denominati LED1. LED2. 1 = SWITCH 2 premuto 0 = SWITCH 3 rilasciato. no parity. 1 = SWITCH 3 premuto 0 = SWITCH 4 rilasciato. Il protocollo consiste in una serie di codici di controllo che il PC può trasmettere al circuito tramite comunicazione seriale. RB6 ed RB7 ed invia un unico codice al PC che riflette lo stato dei quattro pulsanti. La velocità di trasferimento è ancora 9600 baud. LED3 e LED4 e quattro pulsanti denominati SWITCH1.Esempi ed applicazioni pratiche 109 . Bit 0 Bit 1 Bit 2 Bit 3 0 = SWITCH 1 rilasciato. RB5. il codice di risposta 13 . 1 = SWITCH 1 premuto 0 = SWITCH 2 rilasciato. Di questo codice solo i bit 0.

Programma di prova Il programma di prova RS232IO.exe che è il programma DOS visto in questo esempio.sarà 0x01 (00000001 binario). Nel CD allegato Nella cartella \software trovate il file rs232io.EXE consente di provare il circuito immediatamente. Ipotizzando di aver collegato il circuito alla COM2. in questo caso. 110 13 . Il programma funziona in ambiente MS/DOS o prompt MS/DOS sotto Win 95/98.Esempi ed applicazioni pratiche . Nel CD allegato Nella cartella \sorgenti trovate il file rs232io. Se risultano premuti sia lo SWITCH 2 che il 4 il codice di risposta 0x0A (00001010 binario). per accendere il LED 1 sarà sufficiente digitare: RS232IO /COM2 /LED1=ON Per spegnere il LED 1 ed accendere il LED 4 digitare: RS232IO /COM2 /LED1=OFF /LED4=ON Per accendere solo il LED 3 senza modificare lo stato degli altri led: RS232IO /COM2 /LED3=ON Per richiedere lo stato corrente dei singoli switch con un unico comando: RS232IO /COM2 /SWITCH Il programma risponderà con qualcosa del tipo: Switch Switch Switch Switch 1: 2: 3: 4: off off ---> Active off Ad indicare.asm che è il file sorgente per la gestione del circuito illustrato in questo esempio. che solo lo SWITCH 3 risulta premuto.

si entra in modalità demo. Il time-out viene gestito attraverso il Timer0. Il giocatore ha 5 secondi a disposizione per replicare la sequenza. Nel caso in cui si verifichi una mossa errata. verranno emessi due toni a frequenza bassa e tre toni a frequenza più alta. le mosse vengono proposte in ordine inverso. ma non accettando input esterni. altrimenti verrà notificato un time-out e la mossa sarà ritenuta errata. • SW6 imposta il livello di difficoltà del gioco (velocità). L’accensione di ciascun LED è accompagnata da uno specifico tono audio. ovvero non vengono emessi i suoni. visualizzando le mosse. Per l’emissione dei toni audio è stato impiegato un buzzer piezoelettrico a pilotaggio esterno. Questo significa che il buzzer dovrà essere pilotato con una onda quadra. Il circuito è in grado di riconoscere quali tasti sono premuti all’accensione.11 e si consiglia di installare i diodi LED vicino ai relativi pulsanti per facilitare la comprensione della sequenza. in modo da poter scegliere alcune opzioni di gioco: • SW5 permette il reset del PIC quindi l’avvio di un nuovo gioco. La convenzione è la seguente: i primi toni indicano le “decine”. il gioco si avvia in “double mode” in cui le mosse vengono proposte in coppia. Lo schema elettrico è riportato nella figura 13. • Mantenendo premuto SW2 (giallo) durante l’accensione. 13 . realizza il vecchio gioco elettronico “SIMON”. Ciascuna mossa è memorizzata nella EEPROM ed occupa una locazione di memoria (quindi si hanno 63 mosse possibili). verrà notificato il massimo numero di mosse corrette eseguite. Sono previste un massimo di 63 mosse e. una volta completate correttamente. i toni successivi (di frequenza più alta) indicano le unità. • Mantenendo premuto SW1 (rosso) durante l’accensione.Esempi ed applicazioni pratiche 111 . la cui frequenza determina l’altezza del suono emesso. verrà emesso un tono a notificare l’errore e. L’alimentazione è a 5V che possono essere ottenuti mediante un regolatore integrato come già illustrato nei primi capitoli del testo.REALIZZAZIONE DEL GIOCO ELETTRONICO “SIMON” Questo esempio di applicazione. • Mantenendo premuto SW4 (blu) durante l’accensione. attraverso una serie di toni. il dispositivo notifica il successo ottenuto mediante l’emissione di una serie di toni. verrà mostrata la mossa corretta. Il gioco prevede l’accensione di quattro LED in particolari sequenze sempre più difficoltose e il giocatore deve premere i pulsanti relativi ai LED che via via vengono illuminati. Quindi se le mosse giuste sono state 23. il gioco si avvia in modalità MUTE. • Mantenendo premuto SW3 (verde) durante l’accensione.

Esempi ed applicazioni pratiche .Figura 13.11: Schema elettrico del “SIMON GAME”. 112 13 .asm che è il file sorgente dell’applicazione trattata in questo esempio. Nel CD allegato Nella cartella \sorgenti trovate il file simon.

è coinvolto nell’operazione (un campo di tre bit consente di ottenere otto combinazioni ciascuna delle quali identifica un bit all’interno del registro specificato).SET DI ISTRUZIONI LE ISTRUZIONI SEMPLICI In questo capitolo verrà descritto dettagliatamente il set di istruzioni del PIC16F84A.14 . Figura 14.1: Formato delle istruzioni 14 . all’interno del registro specificato.1.Set di istruzioni 113 . Ciascuna istruzione è una word di 14 bit ed è suddivisa in un opcode che specifica l’azione da eseguire ed uno o più operandi coinvolti nell’operazione. Le istruzioni che agiscono su un solo bit hanno un opcode di quattro bit ed utilizzano un campo b di tre bit per determinare quale bit. Si noti come le istruzioni che agiscono su un intero byte abbiano un opcode di 6 bit ed un bit d di controllo per stabilire se il risultato dell’operazione andrà nel registro specificato o nell’accumulatore W. Il formato generale per le istruzioni è riportato in figura 14.

i due cicli sono impiegati solo in caso in cui il risultato del test sia true. verranno usate le seguenti convenzioni: f b k x d Indirizzo di un registro (0x00 ÷ 0x7F) Indirizzo di un bit specifico all’interno di un registro (3 bit) Costante o etichetta Valore non rilevante (può essere indifferentemente 0 o 1) Campo di selezione del destinatario: se d=0 il risultato va in w altrimenti va in un registro (se non specificato si assume d=1) w Registro accumulatore PC Program Counter TO Bit di time-out PD bit di Power-Down Nella tabella seguente sono elencate tutte le istruzioni mnemoniche con il loro comportamento ed il numero di cicli-istruzione richiesti per l’esecuzione. salta una istruzione Chiama la subroutine all'indirizzo k Azzera il registro f Azzera il registro w Azzera il Watchdog Timer Complementa il contenuto di f Decrementa il contenuto di f Decrementa il contenuto di f e. salta una istruzione Analizza un bit di f e.b f.b f. salta una istruzione 114 14 . se a zero.Set di istruzioni .d f. se ad uno. richiedono due cicli-istruzione.d f. se il risultato è zero.La maggior parte delle istruzioni viene eseguita in un singolo ciclo-istruzione (1 ciclo-istruzione corrisponde a 4 cicli di clock quindi utilizzando ad esempio un quarzo da 4MHz il ciclo-istruzione ha una durata di 1µs).d k f.d f. Nella descrizione delle varie operazioni. Si noti che per le istruzioni di test sono indicati uno o due cicli istruzione: come già detto.d f.b k f Cicliistruzione 1 1 1 1 1 1 1 (2) 1 (2) 2 1 1 1 1 1 1 (2) Descrizione Somma k con W (w = w + k) Somma il contenuto di w con quello di f AND logico tra w e k (w = w AND k) AND logico tra w ed f Azzera un bit di f Porta ad 1 un bit di f Analizza un bit di f e.b f. Codice mnemonico ADDLW k ADDWF ANDLW ANDWF BCF BSF BTFSC BTFSS CALL CLRF CLRW CLRWDT COMF DECF DECFSZ f. Solo alcune istruzioni come le istruzioni di test (ma solo in caso in cui il risultato sia true) o istruzioni che modificano il valore del program counter.

Codice mnemonico GOTO k INCF INCFSZ IORLW IORWF MOVLW MOVF MOVWF NOP RETFIE RETLW RETURN RLF RRF SLEEP SUBLW SUBWF SWAPF XORLW XORWF k f,d f,d k f,d f,d f,d k f,d f,d k f,d k f,d f

Descrizione Salta all'indirizzo k Incrementa il contenuto di f Incrementa il contenuto di f e, se il risultato è zero, salta una istruzione OR logico tra w e k (w = w OR k) OR logico tra w ed f Carica in w il valore k (w = k) Sposta il contenuto di f Sposta il contenuto di w nel registro f Nessuna operazione Ritorna da un interrupt handler Ritorna da una subroutine con w = k Ritorna da una subroutine Scorrimento a sinistra del registro f Scorrimento a destra del registro f Mette in standby il PIC Sottrae da k il valore contenuto in w (w = k-w) Sottrae da f il valore contenuto in w Scambia in f i bit 0123 con i bit 4567 OR esclusivo tra w e k (w = w XOR k) OR esclusivo tra w e f

Cicliistruzione 2 1 1 (2) 1 1 1 1 1 1 2 2 2 1 1 1 1 1 1 1 1

Di seguito è riportata una descrizione dettagliata di ogni istruzione con il relativo esempio di utilizzo.

ADDLW
Questa istruzione (ADD Literal and W) somma la costante k al valore memorizzato nell'accumulatore W e mette il risultato nell'accumulatore. Sintassi: addlw k

Operazione equivalente: W = W + k Esempio: org start movlw addlw ... 00H 10 12

14 - Set di istruzioni

115

Dopo aver eseguito questo programma l'accumulatore W varrà 22. Note: Questa istruzione influenza i bit Z, DC e C del registro STATUS: • Z vale 1 se il risultato dell'operazione vale 0. • DC vale 1 se il risultato dell'operazione è un numero superiore a 15. • C vale 1 se il risultato è positivo ovvero se il bit 7 del registro contenente il risultato vale 0 e 1 se il risultato è negativo ovvero se il bit 7 del registro contenente il risultato vale 1.

ADDWF
Questa istruzione (ADD W and F) somma il valore contenuto nell'accumulatore W con il valore contenuto nel registro indirizzato dal parametro f. In base al valore di d, il risultato è memorizzato nell'accumulatore W (se d=0) o nello stesso registro f (se d=1). Sintassi: addlw f,d

Operazione equivalente: d = W + f (dove d può essere W o f) Esempio: add1 equ add2 equ org movlw movwf movlw movwf movf addwf 0CH 0DH 00H 10 ;Primo addendo = 10 add1 15 ;Secondo addendo = 15 add2 add1,W ;W = add1 add2,0 ;W = W + add2

Note: Questa istruzione influenza i bit Z, DC e C del registro STATUS: • Z vale 1 se il risultato dell'operazione vale 0. • DC vale 1 se il risultato dell'operazione è un numero superiore a 15. • C vale 1 se il risultato è positivo ovvero se il bit 7 del registro contenente il risultato vale 0 e 1 se il risultato è negativo ovvero se il bit 7 del registro contenente il risultato vale 1.

ANDWF
Questa istruzione (AND W with F) effettua l'AND logico tra il valore contenuto nell'accumulatore W ed il valore contenuto nel registro indirizzato dal parametro 116 14 - Set di istruzioni

f. In base al valore di d, il risultato è memorizzato nell'accumulatore W (se d=0) o nello stesso registro f (se d=1). Sintassi: andwf f,d

Operazione equivalente: d = W AND f (dove d può essere W o f) Esempio: Spesso l'AND logico viene utilizzato per mascherare il valore di alcuni bit all'interno di un registro. Ad esempio per estrarre dal numero binario 01010101B i quattro bit meno significativi al fine di ottenere il seguente valore 00000101B, basta preparare una maschera del tipo 00001111B e farne l'AND con il valore di partenza: movlw 01010101B all'indirizzo movwf 0CH mascherare movlw 00001111B andwf 0CH,0 ;Memorizza nel registro ;0CH il valore iniziale da ;Prepara la maschera di bit ;Effettua l'AND e memorizza il ;risultato nell'accumulatore W

Il risultato in W sarà 00000101B come richiesto. W = 00001111 AND f = 01010101 = --------------W = 0000010101 Note: Questa istruzione influenza il bit Z del registro STATUS: Z vale 1 se il risultato dell'operazione è 0.

ANDLW
Questa istruzione (AND Literal and W) effettua l'AND logico tra k ed il valore memorizzato nell'accumulatore W e mette il risultato nell'accumulatore. Sintassi: andlw k

Operazione equivalente: W = W AND k Esempio: org 00H start movlw 0xF4 14 - Set di istruzioni 117

b Operazione equivalente: f(b) = 0 Esempio: parm1 equ 0CH org 00H movlw 11111111B movwf parm1 bcf parm1.b Operazione equivalente: f(b) = 1 Esempio: parm1 equ 0CH org 00H movlw 00000000B movwf parm1 bsf parm1.Set di istruzioni .andlw 0x0F . Sintassi: bsf f.D0=1 Al termine del programma il registro parm1 varrà 00000001B. Note: Questa istruzione non influenza alcun bit di stato BSF Questa istruzione (Bit Set F) mette a uno il bit b del registro all'indirizzo f.0 . Sintassi: bcf f.0 . 118 14 . BCF Questa istruzione (Bit Clear F) azzera il bit b del registro all'indirizzo f. Note: Questa istruzione influenza i bit Z..Valore iniziale . Dopo aver eseguito questo programma l'accumulatore W varrà 0x04. che vale 1 se il risultato dell'operazione vale 0..Valore iniziale .D0=0 Al termine del programma il registro parm1 varrà 11111110B.

Sintassi: btfsc f.No. esce .Valore iniziale 119 . Skip if Clear) controlla il bit b contenuto nel registro all'indirizzo f e salta l'istruzione successiva se questo vale 0.Valore iniziale Note: Questa istruzione non influenza alcun bit di stato BTFSS Questa istruzione (Bit Test F. Lo stesso programma non esegue il loop se l'istruzione: movlw 11111111B .Valore iniziale viene sostituita con l'istruzione movlw 11111110B .Valore iniziale .0 goto loop . Sintassi: btfss f.Note: Questa istruzione non influenza alcun bit di stato BTFSC Questa istruzione (Bit Test F. salta una istruzione Esempio: parm1 equ 0CH org 00H movlw 11111110B movwf parm1 14 .D0 = 0 ? Si. esegue il loop Questa programma esegue un loop infinito.Set di istruzioni .b Operazione equivalente: f(b) = 0 ? Si.b Operazione equivalente: f(b) = 1 ? Si. salta una istruzione Esempio: parm1 equ 0CH org 00H movlw 11111111B movwf parm1 loop btfsc parm1. Skip if Set) controlla il bit b contenuto nel registro all'indirizzo f e salta l'istruzione successiva se questo vale 1.

Valore iniziale viene sostituita con l'istruzione: movlw 11111111B .0 loop .D0 = 1 ? Si. Nel PIC16F84A sono disponibili 8 livelli di stack. è limitato ad 8 livelli.. Note: Questa istruzione non influenza nessun bit di stato.Set di istruzioni .. esce . ovvero di istruzioni CALL all'interno di subroutine che a loro volta contengono altre CALL. esegue il loop Questa programma esegue un loop infinito. quindi scrive nel PC l'indirizzo della subroutine iniziando l'esecuzione di quest'ultima. Il parametro k può essere specificato utilizzando direttamente il valore numerico dell'indirizzo oppure la relativa label. memorizza nello STACK il valore del registro PC + 1 in modo da poter riprendere l'esecuzione dall'istruzione successiva alla CALL. 120 14 .loop btfss goto parm1. Sintassi: call Esempio: org call .LED1 return Quando la CPU del PIC incontra una istruzione CALL.Valore iniziale Note: Questa istruzione non influenza alcun bit di stato CALL Questa istruzione (CALL Subroutine) richiama in esecuzione una subroutine memorizzata all'indirizzo k. Il valore originale del PC viene ripristinato all'uscita della subroutine con l'esecuzione dell'istruzione di ritorno RETURN o RETLW. 00H ledOn k . per cui il numero massimo di CALL annidate.No.Subroutine di accensione di un led ledOn bsf PORTB. Lo stesso programma non esegue il loop se l'istruzione: movlw 11111110B .

effettua il reset del PIC. Sintassi: clrf f Operazione equivalente: f = 0 Esempio: Volendo azzerare il registro TMR0 il cui indirizzo è 0x01. sarà possibile utilizzare il nome simbolico del registro TMR0. una volta trascorso un determinato tempo. In questa modalità il PIC abilita un timer che. CLRW Questa istruzione (CLeaR W register) azzera il valore contenuto nel registro W. clrf TMR0 Note: Dopo l'esecuzione di questa istruzione il bit Z del registro STATUS viene messo a 1. la circuiteria di watchdog (dall'inglese cane da guardia) interpreterà questo come un blocco del programma in esecuzione ed effettuerà il reset per sbloccarlo. l'istruzione da eseguire sarà: clrf 0x01 Includendo il file P16F84A. Per evitare il reset. Se il timer non viene azzerato in tempo.INC all'inizio del sorgente. Sintassi: clrwdt 14 .Set di istruzioni 121 . il programma dovrà eseguire ciclicamente l'istruzione CLRWDT per azzerare il timer prima di detto tempo.CLRF Questa istruzione (CLeaR F register) azzera il valore contenuto nel registro indirizzato dal parametro f. Sintassi: clrw Operazione equivalente: W = 0 Note: Dopo l''esecuzione di questa istruzione il bit Z del registro STATUS viene messo a 1. CLRWDT Questa istruzione (CLeaR WatchDog Timer) deve essere utilizzata quando il PIC viene programmato con l'opzione Watchdog abilitata (fusibile WDTE).

In base al valore di d.. Sintassi: comf f.1 . Note: Questa istruzione influenza il bit Z del registro STATUS: Z vale 1 se il risultato dell'operazione vale 0. DECF Questa istruzione (DECrement F register) decrementa il contenuto del registro indirizzato dal parametro f. Al termine dell'esecuzione del programma il valore del registro parm1 sarà 10101010B.. COMF Questa istruzione (COMplement F) effettua il complemento del valore contenuto nel registro indirizzato dal parametro f. il risultato è memorizzato nell'accumulatore W (se d=0) o nello stesso registro f (se d=1). In base al valore di d.Esempio: org loop clrwdt goto 00H loop Note: Questa istruzione non influenza alcun bit di stato. Sintassi: decf f.d Operazione equivalente: d = f -1 (dove d può essere W o f) Esempio: Con il seguente programma viene scritto il valore 0x23 nel registro 122 14 .d Operazione equivalente: d = NOT f (dove d può essere W o f) Esempio: parm1 equ 0CH org 00H movlw 01010101B movwf parm1 comf parm1.Set di istruzioni . il risultato è memorizzato nell'accumulatore W (se d=0) o nello stesso registro f (se d=1).

Note: Questa istruzione non influenza alcun bit di stato.Decrementa il valore contenuto nel . continua Questo programma esegue per 10 volte l'istruzione decfsz ed esce quando counter = 0. Al termine dell'esecuzione il registro alla locazione 0CH conterrà il valore 0x22.counter = 0? Si esce ..b Operazione equivalente: d = f -1 (dove d può essere W o f) se d = 0 salta Esempio: counter equ 0CH org 00H movlw 10 movwf counter loop decfsz counter.counter = counter -1 ..1 . Skip if Zero) decrementa il valore del registro all'indirizzo f e se il risultato vale zero salta l'istruzione successiva.Copia nel registro 0CH il valore di W . Z vale 1 se il risultato dell'operazione vale 0. In base al valore di d. movlw movwf decf 23H 0CH OCH.registro 0CH Note: Questa istruzione influenza il bit Z del registro STATUS.Scrive in W il valore 23H . DECFSZ Questa istruzione (DECrement F. Il parametro k può essere specificato utilizzando direttamente il valore numerico dell'indirizzo oppure la relativa label. GOTO Questa istruzione (GO TO address) determina un salto del programma in esecuzione all'indirizzo k.counter = 10 .No.1 .Set di istruzioni k 123 . Sintassi: decfsz f. Sintassi: goto 14 . goto loop .all'indirizzo 0CH quindi decrementato di uno. il risultato è memorizzato nell'accumulatore W (se d=0) o nello stesso registro f (se d=1).

INCFSZ Questa istruzione (INCrement F. Sintassi: incf f.d Operazione equivalente: d = f +1 (dove d può essere W o f) Note: Questa istruzione influenza il bit Z del registro STATUS: Z vale 1 se il risultato dell'operazione vale 0.. Sintassi: incfsz f. Skip if Zero) incrementa il valore del registro all'indirizzo f e se il risultato vale zero salta l'istruzione successiva.No.counter = 0 ? Si esce . il risultato è memorizzato nell'accumulatore W (se d=0) o nello stesso registro f (se d=1).1 .counter = counter + 1 . Note: Questa istruzione non influenza alcun bit di stato.Set di istruzioni ..counter = 250 . INCF Questa istruzione (INCrement F) incrementa il contenuto del registro all'indirizzo f. In base al valore di d. goto loop .b Operazione equivalente: d = f +1 (dove d può essere W o f) se d = 0 salta Esempio: counter equ 0CH org 00H movlw 250 movwf counter loop incfsz counter. In base al valore di d.Esempio: org loop goto 00H loop Questo programma esegue un ciclo (loop) infinito. continua 124 14 . il risultato è memorizzato nell'accumulatore W (se d=0) o nello stesso registro f (se d=1).

00H 00001111B 11110000B Dopo aver eseguito questo programma l'accumulatore W varrà 11111111B.d Operazione equivalente: d = f OR W (dove d può essere W o f) Esempio: parm1 equ 0CH org 00H movlw 00001111B 14 . Sintassi: iorlw k Operazione equivalente: W = W OR k Esempio: org start movlw iorlw . Essendo counter un registro a 8 bit quando vale 255 e viene incrementato.. In base al valore di d.Questo programma carica il valore 250 nel registro counter ed esegue per 6 volte l'istruzione incfsz finché esce per counter = 0. Sintassi: iorwf f. IORLW Questa istruzione (Inclusive OR Literal with W) effettua l'OR tra il valore contenuto nell'accumulatore W ed il valore costante k.Set di istruzioni 125 . il risultato è memorizzato nell'accumulatore W (se d=0) o nello stesso registro f (se d=1). Note: Questa istruzione non influenza alcun bit di stato. IORWF Questa istruzione (Inclusive OR W with F) effettua l'OR tra il valore contenuto nell'accumulatore W ed il valore contenuto nel registro indirizzato dal parametro f.. assume nuovamente valore 0. Note: Questa istruzione influenza il bit Z del registro STATUS: Z vale 1 se il risultato dell'operazione vale 0.

Note: Questa istruzione non influenza nessun bit di stato..d Operazione equivalente: d = f (dove d può essere W o f) Esempio: L'esempio seguente copia il valore contenuto nel registro all'indirizzo 126 14 . MOVF Questa istruzione (MOVe F) copia il contenuto del registro indirizzato dal parametro f nell'accumulatore W o nello stesso registro f. • Per d = 1 il valore viene lasciato nel registro f. Sintassi: movf f.movwf movlw iorwf parm1 11111111B parm1. In questo caso l'utilità dell'istruzione sta nel fatto che viene alterato il bit Z del flag STATUS in base al valore contenuto nel registro f. Il parametro d determina la destinazione: • Per d = 0 il valore viene memorizzato nel registro W. 00H 20 Dopo aver eseguito questo programma l'accumulatore W varrà 20. Sintassi: movlw k Operazione equivalente: W = k Esempio: org start movlw .. MOVLW Questa istruzione (MOVe Literal to W) assegna all'accumulatore W il valore costante k.F Al termine dell'esecuzione il valore del registro parm1 sarà 11111111B.Set di istruzioni . Note: Questa istruzione influenza il bit Z del registro STATUS: Z vale 1 se il risultato dell'operazione vale 0.

ma è utile per inserire ritardi pari ad un ciclo-istruzione.W Note: Questa istruzione influenza il bit Z del registro STATUS: Z vale 1 se il risultato dell'operazione vale 0. movlw movwf 10H TMR0 . Sintassi: nop Esempio: Utilizzando un quarzo da 4MHz è possibile ottenere un ritardo pari ad 1µs per ogni istruzione NOP inserita nel nostro sorgente. MOVWF Questa istruzione (MOVe W to F) copia il contenuto del registro W nel registro indirizzato dal parametro f.Set di istruzioni 127 .Scrive nel registro W il valore 10H .0CH nell'accumulatore W: movf 0CH.Esegue un ritardo pari ad 1µs Note: La NOP non influenza alcun bit di stato. nop . RETFIE Questa istruzione (RET From Interrupt) deve essere inserita al termine di ogni subroutine di gestione degli interrupt per ridare il controllo al programma principale.e lo memorizza nel registro TMR0 Note: L'esecuzione della MOVWF non influenza nessun bit di stato. Sintassi: retfie Esempio: 14 . NOP Questa istruzione (No OPeration) non esegue alcuna operazione. Sintassi: movwf f Operazione equivalente: f = W Esempio: Per scrivere il valore 10H (esadecimale) nel registro TMR0 le istruzioni da eseguire sono le seguenti.

L’istruzione RETFIE determinerà quindi il ritorno al loop principale. RETURN Questa istruzione (RETURN from subroutine) deve essere inserita al termine di ogni subroutine per riprendere l'esecuzione del programma principale. mySub1 nop retlw 0CH 00H mySub1 rtc k 10 Una volta eseguito. All’arrivo di un interrupt il controllo verrà dato automaticamente al programma allocato dall'indirizzo 04H (nell'esempio intHandler)..Interrupt vector . Note: Questa istruzione non influenza alcun bit di stato (vedi anche l'istruzione RETURN).org 00H loop goto org intHandler retfie loop 04H . Note: Questa istruzione non influenza alcun bit di stato. 128 14 . A differenza dell'istruzione RETURN essa consente di passare.Ritorna dall'interrupt In questo sorgente il programma principale esegue un loop infinito. tramite l'accumulatore W. RETLW Questa istruzione (RETurn Literal to W) ritorna il controllo da una subroutine al programma principale.Set di istruzioni .Loop infinito . il valore costante k al programma principale.. questo programma memorizza nel registro rtc il valore 10 passato dalla subroutine mySub1. Sintassi: retlw Esempio: rtc equ org call movwf .

. mySub1 nop return Note: Nel PIC16F84A possono essere annidate fino ad 8 chiamate a subroutine del tipo: org call . mySub1 call return mySub2 call return mySub3 return 00H mySub1 mySub2 mySub3 Questa istruzione non influenza alcun bit di stato (vedi anche l'istruzione RETLW).... RLF Questa istruzione (Rotate Left F through carry) ruota i bit contenuti nel registro all'indirizzo f verso sinistra (ovvero dai bit meno significativi verso quelli più significativi) passando per il bit CARRY del registro STATUS come illustrato in figura: Il contenuto del bit CARRY del registro status viene spostato nel bit D0 mentre il valore in uscita dal bit D7 viene spostato nel CARRY. Il valore del parametro d determina la destinazione del risultato ottenuto al 14 .Set di istruzioni 129 .Sintassi: return Esempio: org 00H call mySub1 .

Azzera il CARRY .STATUS movlw 01010101B movwf parm1 rlf parm1. • Per d = 1 il risultato viene memorizzato nello stesso registro f Sintassi: rlf f. RRF Questa istruzione (Rotate Right F through carry) ruota i bit contenuti nel registro all'indirizzo f verso destra (ovvero dai bit più significativi verso quelli meno significativi) passando per il bit CARRY del registro STATUS.Valore iniziale Al termine del programma il registro parm1 varrà 10101010B mentre il CARRY varrà 0. • Per d = 1 il risultato viene memorizzato nello stesso registro f 130 14 .1 . Il valore del parametro d determina la destinazione del risultato ottenuto al termine della rotazione: • Per d = 0 il risultato viene memorizzato nel registro W lasciando il registro f invariato.b Operazione equivalente: d = f << 1 (dove d può essere W o f) Esempio: parm1 equ 0CH org 00H clrf C.Set di istruzioni . come illustrato in figura: Il contenuto del bit CARRY del registro status viene spostato nel bit D7 mentre il valore in uscita dal bit D0 viene spostato nel CARRY.termine della rotazione: • Per d = 0 il risultato viene memorizzato nel registro W lasciando il registro f invariato. Note: Questa istruzione influenza solo il bit CARRY del registro STATUS.

Sintassi: sublw k Operazione equivalente: W = k .Sintassi: rrf f. SUBLW Questa istruzione (SUBstract W from Literal) sottrae alla costante k il valore memorizzato nell'accumulatore W. dormire).1 .W Esempio: org start 00H 14 .STATUS movlw 01010101B movwf parm1 rrf parm1.Set di istruzioni 131 .Azzera il CARRY . Note: Questa istruzione influenza solo il bit CARRY del registro STATUS. Sintassi: sleep Esempio: org start sleep 00H Note: Questa istruzione non influenza alcun bit di stato.Valore iniziale Al termine del programma il registro parm1 varrà 00101010B mentre il CARRY varrà 1.b Operazione equivalente: d = f >> 1 (dove d può essere W o f) Esempio: parm1 equ 0CH org 00H clrf C. SLEEP Questa istruzione (go into standby mode) blocca l'esecuzione del programma in corso e porta il PIC nello stato di standby (sleep dall'inglese to sleep.

Per valori iniziali di REG1=2 e W=2 dopo l'esecuzione risulta REG1=0 e C=1 perché il risultato è sempre positivo.. In base al valore di d. dopo l'esecuzione risulta REG1=1 e C=1 in quanto il risultato è positivo. Sintassi: subwf f. Per valori iniziali di REG1=1 e W=2.d Operazione equivalente: d = f .1 dove REG1 è l'indirizzo di un qualsiasi registro specificato con la direttiva: REG1 RES 1 Per valori iniziali di REG1=3 e W=2. 132 14 . il risultato è memorizzato nell'accumulatore W (se d=0) o nello stesso registro f (se d=1). SUBWF Questa istruzione (SUBstract W from F) sottrae il valore contenuto nel registro W dal valore contenuto nel registro indirizzato dal parametro f. • C vale 1 se il risultato è positivo ovvero se il bit 7 del registro contenente il risultato vale 0 e 1 se il risultato è negativo ovvero se il bit 7 del registro contenente il risultato vale 1. DC e C del registro STATUS: • Z vale 1 se il risultato dell'operazione vale 0.Set di istruzioni .W (dove d può essere W o f) Esempio: Si consideri l'istruzione: subwf REG1. risulta REG1=FFH (ovvero -1) quindi C=0 perché il risultato è negativo.. 10 12 Dopo aver eseguito questo programma l'accumulatore W varrà 2. Note: Questa istruzione influenza i bit Z. Note: Questa istruzione influenza i bit Z. • DC vale 1 se il risultato dell'operazione è un numero superiore a 15. • C vale 1 se il risultato è positivo ovvero se il bit 7 del registro contenente il risultato vale 0 e 1 se il risultato è negativo ovvero se il bit 7 del registro contenente il risultato vale 1. DC e C del registro STATUS: • Z vale 1 se il risultato dell'operazione vale 0.movlw sublw .

. effettua l'OR esclusivo (XOR) tra il valore contenuto nell'accumulatore W ed il valore costante k. Questa istruzione influenza i bit Z del registro STATUS che varrà 1 se il risultato dell'operazione è 0. il risultato è memorizzato nell'accumulatore W (se d=0) o nello stesso registro f (se d=1). In base al valore di d. XORWF Questa istruzione (eXclusive OR W with F) effettua l'OR esclusivo (XOR) tra il valore contenuto nell'accumulatore W ed il valore contenuto nel registro indirizzato dal parametro f. 00H 10000000B 11110000B Dopo aver eseguito questo programma l'accumulatore W varrà 01110000B.d 133 . il risultato è memorizzato nell'accumulatore W (se d=0) o nello stesso registro f (se d=1). In base al valore di d..SWAPF Questa istruzione (SWAP F) scambia il valore del quattro bit più significativi (D7-D4) contenuti nel registro all'indirizzo f con i quattro bit meno significativi (D3-D0) dello stesso. Note: Questa istruzione influenza il bit Z del registro STATUS: Z vale 1 se il risultato dell'operazione vale 0.Set di istruzioni f. Sintassi: swap f. Sintassi: xorlw k Operazione equivalente: W = W XOR k Esempio: org start movlw xorlw .d Operazione equivalente: f = Swap dei bit 0123 con 4567 di f Note: Questa istruzione non influenza alcun bit di stato. XORLW Questa istruzione (eXclusive OR Literal with W). Sintassi: xorwf 14 .

Risultato.Operazione equivalente: d = f XOR W (dove d può essere W o f) Esempio: xorwf xorwf COUNTER.Salta se diverso da 57H .W = COUNTER XOR W Note: L'OR esclusivo (XOR) è un'operazione tra due bit in cui il bit risultante vale 0 se i due bit sono uguali. se il valore di REG1 e' pari a 57H . Spesso lo XOR viene utilizzato nell'assembler del PIC per effettuare la comparazione tra due valori in mancanza di un'istruzione specifica.W . risultato dello XOR vale 0.0 STATUS.Salta se uguale da 57H goto goto diverso uguale 134 14 . il valore in REG1 .W = W XOR REG1 Effettua lo XOR con .Set di istruzioni .F COUNTER.W = Valore da comparare = 57H . ovvero . Si supponga di avere un valore nel registro REG1 e di voler verificare se è uguale a 57H.Z .Salta l'istruzione seguente se il . Le istruzioni da eseguire sono le seguenti: movlw xorwf btfss 57H REG1. W = 57H .COUNTER = COUNTER XOR W .

In base al valore di d.d Sequenza equivalente: btfsc incf STATUS. Questa istruzione influenza i bit Z del registro STATUS che varrà 1 se il risultato dell'operazione è 0. ADDCF Esegue la somma del contenuto di un registro con il bit C (Carry) del registro STATUS. Sintassi: B k k Sequenza equivalente: goto 14 . In base al valore di d. Questa istruzione influenza i bit Z del registro STATUS che varrà 1 se il risultato dell'operazione è 0. il risultato è memorizzato nell'accumulatore W (se d=0) o nello stesso registro f (se d=1). Sintassi: adddcf f. Di seguito vengono descritte tali istruzioni e per ciascuna è riportatala l’equivalente sequenza di istruzioni semplici.C f.d B Salto incondizionato ad uno specifico indirizzo k. Sintassi: addcf f.DC f.d ADDDCF Esegue la somma del contenuto di un registro con il bit DC (Digit Carry) del registro STATUS. il risultato è memorizzato nell'accumulatore W (se d=0) o nello stesso registro f (se d=1).Set di istruzioni 135 .LE ISTRUZIONI SPECIALI Per facilitare la programmazione in assembler sono state previste degli speciali codici mnemonici che consentono di rendere il codice molto più comprensibile.d Sequenza equivalente: btfsc incf STATUS.

DC k BNC Salto ad uno specifico indirizzo k se il bit C (Carry) del registro STATUS vale 0.Set di istruzioni . Sintassi: BDC k Sequenza equivalente: btfsc goto STATUS.C k BNDC Salto ad uno specifico indirizzo k se il bit DC (Digit Carry) del registro STATUS vale 0. Sintassi: BNDC k Sequenza equivalente: btfss goto 136 STATUS.DC k 14 . Sintassi: BNC k Sequenza equivalente: btfss goto STATUS.BC Salto ad uno specifico indirizzo k se il bit C (Carry) del registro STATUS vale 1.C k BDC Salto ad uno specifico indirizzo k se il bit DC (Digit Carry) del registro STATUS vale 1. Sintassi: BC k Sequenza equivalente: btfsc goto STATUS.

C CLRDC Azzera il bit DC (Digit Carry) del registro STATUS. Sintassi: BZ k Sequenza equivalente: btfsc goto STATUS.Set di istruzioni 137 . Sintassi: clrc Sequenza equivalente: bcf STATUS.Z 14 . Sintassi: clrdc Sequenza equivalente: bcf STATUS.Z k BZ Salto ad uno specifico indirizzo k se il bit Z (Zero flag) del registro STATUS vale 1. Sintassi: clrz Sequenza equivalente: bcf STATUS.DC CLRZ Azzera il bit Z (Zero flag) del registro STATUS. Sintassi: BNZ k Sequenza equivalente: btfss goto STATUS.Z k CLRC Azzera il bit C (Carry) del registro STATUS.BNZ Salto ad uno specifico indirizzo k se il bit Z (Zero flag) del registro STATUS vale 0.

Sintassi: movfw f f. Questa istruzione influenza i bit Z del registro STATUS che varrà 1 se il risultato dell'operazione è 0.d Sequenza equivalente: comf incf f.d SETC Mette ad 1 il bit C (Carry) del registro STATUS.C SETDC Mette ad 1 il bit DC (Digit Carry) del registro STATUS.1 f.Z 14 . Sintassi: setz Sequenza equivalente: bsf 138 STATUS. Sintassi: negf f. Sintassi: setc Sequenza equivalente: bsf STATUS. Sintassi: setdc Sequenza equivalente: bsf STATUS.MOVFW Sposta in w il contenuto del registro f.0 Sequenza equivalente: movf NEGF Esegue l’operazione di negazione (NOT) sul registro f.Set di istruzioni . Questa istruzione influenza i bit Z del registro STATUS che varrà 1 se il risultato dell'operazione è 0.DC SETZ Mette ad 1 il bit Z (Zero flag) del registro STATUS.

SKPC
Controlla il bit C (Carry) del registro STATUS e se ad 1 salta una istruzione. Sintassi: skpc Sequenza equivalente: btfss STATUS,C

SKPDC
Controlla il bit DC (Digit Carry) del registro STATUS e se ad 1 salta una istruzione. Sintassi: skpdc Sequenza equivalente: btfss STATUS,DC

SKPNC
Controlla il bit C (Carry) del registro STATUS e se a 0 salta una istruzione. Sintassi: skpnc Sequenza equivalente: btfsc STATUS,C

SKPNDC
Controlla il bit DC (Digit Carry) del registro STATUS e se a 0 salta una istruzione. Sintassi: skpndc Sequenza equivalente: btfsc STATUS,DC

SKPNZ
Controlla il bit Z (Zero flag) del registro STATUS e se a 0 salta una istruzione. Sintassi: skpnz Sequenza equivalente: btfsc STATUS,Z

SKPZ
Controlla il bit Z (Zero flag) del registro STATUS e se ad 1 salta una istruzione. 14 - Set di istruzioni 139

Sintassi: skpz Sequenza equivalente: btfss STATUS,Z

SUBCF
Sottrae dal registro f il bit C (Carry) del registro STATUS. In base al valore di d, il risultato è memorizzato nell'accumulatore W (se d=0) o nello stesso registro f (se d=1). Questa istruzione influenza i bit Z del registro STATUS che varrà 1 se il risultato dell'operazione è 0. Sintassi: subcf f,d

Sequenza equivalente: btfsc decf STATUS,C f,d

SUBDCF
Sottrae dal registro f il bit DC (Digit Carry) del registro STATUS. In base al valore di d, il risultato è memorizzato nell'accumulatore W (se d=0) o nello stesso registro f (se d=1). Questa istruzione influenza i bit Z del registro STATUS che varrà 1 se il risultato dell'operazione è 0. Sintassi: subdcf f,d

Sequenza equivalente: btfsc decf STATUS,DC f,d

TSTF
Controlla il contenuto del registro f e, se zero, mette ad uno il bit Z (Zero flag) del registro STATUS. Sintassi: tstf f f,1

Sequenza equivalente: movf

140

14 - Set di istruzioni

15 - DIRETTIVE DELL'ASSEMBLER MPASM

Le direttive sono dei particolari comandi, utilizzabili all'interno del file sorgente, finalizzati a condizionare il funzionamento dell'assemblatore durante la compilazione. Contrariamente a quanto avviene per le istruzioni assembler, le direttive non sono tradotte in codici operativi per il micro quindi, nel file compilato, non ne rimane alcuna traccia.

CBLOCK
Questa direttiva consente di definire un blocco di costanti. Ciascuna costante è contrassegnata da una label e, se non viene specificato il parametro increment, a ciascuna label è assegnato un valore (indirizzo) che si incrementa di uno per ciascuna label specificata. Se viene specificato il parametro increment per una label, la label successiva sarà associata ad un indirizzo maggiore della precedente per una differenza pari al valore increment. Un blocco di costanti deve essere chiuso con la direttiva ENDC. Sintassi: cblock [<expr>] <label>[:increment][,<label>[:increment]] endc Esempio: cblock ;all’etichetta nome_1 sarà assegnato ; il valore 0x20 nome_1, nome_2 ;a nome_2 il valore 21 nome_3:2, nome_4 ;a nome_3 il valore 22 e a nome_4 il ;valore 24 endc 0x20

__CONFIG
Con questa direttiva è possibile definire il valore da memorizzare nella word di configurazione. Prima di utilizzare questa direttiva occorre aver specificato nel sorgente con la direttiva LIST quale PICmicro viene utilizzato. Le differenti 15 - Direttive dell'assembler MPASM 141

famiglie di PICmicro hanno la word di configurazione implementate su indirizzi diversi. Nel PIC16F84A l'indirizzo è 0x2007. E' necessario inoltre verificare che il programmatore di PICmicro utilizzato sia in grado di leggere il valore della word di configurazione dal file .HEX e di scriverlo correttamente nella giusta locazione del PICmicro. Questa funzione non sempre è disponibile specialmente nei programmatori di basso costo, per cui in questi casi è perfettamente inutile usare la direttiva __CONFIG all'interno del sorgente, ma occorre agire direttamente sui comandi messi a disposizione dal programmatore specifico. Sintassi: __CONFIG <expr> Esempio: nella figura 15.1 è riportata la struttura della word di configurazione del PIC16F84A estratta dal datasheet Microchip.

Figura 15.1: Struttura della word di configurazione

Si supponga di voler programmare il PICmicro con la protezione del codice disabilitata (CP=1), il Power-up timer abilitato (PWRTE=0), il Watch dog disabilitato (WDTE=0) e l'oscillatore settato in modo XT (FOSC1=0, FOSC0=1). La word di configurazione dovrà essere programmata con il seguente valore binario: 11111111110001 per cui la direttiva da utilizzare sarà __CONFIG 11111111110001B oppure l'equivalente esadecimale __CONFIG 0x3FF1. Il sorgente al completo sarà: PROCESSOR 142 16F84A 15 - Direttive dell'assembler MPASM

__CONFIG

0x3FF1

; Inserire qui il programma END L'assemblatore genera il seguente file .HEX: :02400E00F13F80 :00000001FF dove: :02400E00F13F80 :00000001FF è l'indirizzo dove si trova la configuration word nel PIC16F84A pari a 400E / 2 = 2007. L'indirizzo deve essere diviso in due perchè il formato .HEX a 8 bit prevede l'uso di indirizzi orientati al byte. :02400E00F13F80 :00000001FF è il valore che verrà programmato nella locazione 2007 hex. Il valore deve essere letto con i due byte invertiti, ovvero 3FF1 che corrisponde esattamente a quanto è stato inserito nel file sorgente.

DT
Questa direttiva consente di definire una tabella di valori. In fase di compilazione viene tradotta in una serie di istruzioni RETLW, una per ciascun parametro <expr> specificato. <expr> deve essere un valore ad 8 bit quindi, se si specifica una stringa di caratteri, si generano tante istruzioni RETLW una per ciascun carattere. Sintassi: [<label>] dt <expr> [,<expr>,……,<expr>] Esempio: dt dt “pippo”,0 0x03, 0xF5

Queste due righe, in fase di compilazione, verranno tradotte nelle seguenti istruzioni: retlw retlw retlw ‘p’ ‘i’ ‘p’ 143

15 - Direttive dell'assembler MPASM

retlw retlw retlw retlw retlw

‘p’ ‘o’ 0 0x03 0xF5

#DEFINE
Questa direttiva consente di definire una stringa da sostituire ad un testo specifico durante la fase di compilazione. In particolare, in fase di compilazione, ogni volta che viene incontrata la stringa <nome>, questa verrà automaticamente sostituita con <string>. Sintassi: #define <name> [<string>] Esempio: #define bcf uscita0 0x06,0 uscita0

In fase di compilazione verrà generata la seguente istruzione bcf 0x06,0

che azzera il bit 0 della PORTB (0x06 è infatti l’indirizzo di PORTB).

EQU
Definisce una costante assegnando il valore <expr> a <label>. Sintassi: <label> equ <expr> Esempio: sei equ 6

assegna il valore 6 all’etichetta sei.

ERRORLEVEL
Consente di impostare i tipi di messaggi che verranno visualizzati nei file .lst e .err prodotti dopo la fase di compilazione. Sintassi: errorlevel {0|1|2|+<msgnum>|-<msgnum>} [, …]

144

15 - Direttive dell'assembler MPASM

pdf. Ciascun avviso è infatti codificato con un numero di tre cifre.1 e 2 definiscono il tipo di avvisi in accordo alla seguente tabella: Valore Avvisi abilitati 0 1 2 Messaggi.Direttive dell'assembler MPASM 145 . Nel CD allegato Nella cartella \Documentazione trovate il file mpasm. Di seguito sono riportati alcuni avvisi con il relativo codice. 15 . mentre quello dei messaggi per 3. quello dei warnings per 2.Note: I numeri 0. Warnings ed errori Warnings ed errori Errori msgnum consente di abilitare (+) o disabilitare (-) un avviso specifico. Consente di usare un’etichetta definita in altri file come GLOBAL (si veda la direttiva GLOBAL). Codice Avviso 102 105 113 114 115 128 132 136 203 207 225 302 307 313 Error: Out of Memory Error:Cannot open file Error:Symbol not previously defined Error:Divide by zero Error:Duplicate label Error:Missing arguments Error:Unknow processor Error:Duplicate macro name Warning: Found opcode in column 1 Warning: Found label after column 1 Warning: invalid label in operand Message: Register in operand not in bank 0 Message: Setting page bits Message: CBLOCK constants will starts with value of 0 Si noti che il codice degli errori inizia per 1. EXTERN È una direttiva utilizzata quando un progetto è composto da più file. questo è il manuale dell’assembler Microchip in cui si trova la lista completa dei codici degli avvisi.

In particolare se <expr> vale 0 (false) il codice successivo verrà ignorato.riferimento alla label esterna GLOBAL È una direttiva utilizzata quando un progetto è composto da più file.esternamente al file [. <label>] extern funz .var1 e var2 sono visibili anche . Sintassi: if <expr> Esempio: if version==100 movlw 0x01 else movlw 0x0F endif 146 15 . <label>] IF È una direttiva che consente di decidere se compilare o meno una determinata parte di codice in funzione del valore assunto dall’espressione <expr>.Direttive dell'assembler MPASM . var2 . Consente di definire un’etichetta che può essere utilizzata anche in altri file come EXTERN (si veda la direttiva EXTERN). Se <expr> è diversa da zero (true) il codice successivo viene invece regolarmente compilato.Sintassi: extern <label> Esempio: [. Il codice ignorato è delimitato da una direttiva ELSE o ENDIF.la label funz è esterna al file … … call funz . Sintassi: global <label> Esempio: var1 res 1 var2 res 1 global var1.

predefinite include <pippo. Sintassi: ifdef <label> INCLUDE Permette di inserire un file sorgente esterno prima di procedere con la compilazione. altrimenti viene compilata la linea movlw 0x0F. viene esclusa dalla compilazione se l’etichetta specificata nella direttiva IFDEF non è stata precedentemente definita. Nel caso dell’esempio se version vale 100 l’istruzione movlw 0x0F non sarà fisicamente presente nel file compilato. cartella in cui si trova il file sorgente. la sezione di codice successiva delimitata da una direttiva ELSE o ENDIF. Nel primo caso il file sarà cercato in percorsi predefiniti nel seguente ordine: cartella di lavoro corrente.il file pippo.inc” .inc verrà cercato in C:\PIC\PROVE include “C:\PIC\PROVE\pippo. Sono permesse fino a sei inclusioni annidate (inclusioni di file che a loro volta includono altri file).Direttive dell'assembler MPASM 147 .inc viene cercato nelle directory .il file pippo. Si noti che con questa direttiva è possibile discriminare sezioni di codice a livello di compilazione e non di esecuzione. Il file da includere può essere specificato tra una coppia di parentesi acute o tra virgolette. cartella che contiene il file eseguibile del compilatore. Se invece il file viene specificato tra virgolette è necessario specificare anche il percorso completo per raggiungere il file.inc> 15 . IFDEF È simile alla direttiva IF con l’unica differenza che IFDEF permette solamente di controllare se una certa etichetta è stata precedentemente definita usando la #DEFINE (o mediante linea di comando all’invocazione del compilatore). Come per la IF.In questo esempio se version vale 100 viene compilata la linea di codice movlw 0x01. Sintassi: include <<file>> include “<file>” Esempio: .

semplicemente specificando la label di riferimento. RB1 ed RB2 in 148 15 . . in fase di compilazione. Sintassi: <label> macro [<arg>. Sintassi: Esempio: val1 org 0x20 .a partire dall’indirizzo 0x20 val2 org val1+0x10 .. [<label>] res <numero_locazioni> MACRO La direttiva MACRO è una delle più interessanti messe a disposizione dall'assembler MPASM.Direttive dell'assembler MPASM . Essa consente di associare una label (etichetta) ad una sequenza di istruzioni assembler in modo da poterla inserire. In altri termini buffer è una variabile di 16 byte.il codice inserito in questo punto viene allocato .ORG Definisce un indirizzo della memoria del PIC a partire dal quale verrà allocato il codice successivo.a partire dall’indirizzo 0x30 <label> ORG <expr> RES Permette di riservare un certo numero di locazioni di memoria a partire dalla locazione corrente che può essere etichettata con la <label> qualora essa venga specificata. Sintassi: Esempio: buffer res 16 A partire dall’indirizzo corrente (associato all’etichetta buffer) vengono riservate 16 locazioni di memoria. Se viene specificata l’etichetta <label> il valore dell’indirizzo specificato viene associato all’etichetta. <arg>] Esempio: Si supponga di dover mettere a zero le linee RB0...il codice inserito in questo punto viene allocato .

ma cambino di volta in volta. RB1 ed RB2.2 Con la direttiva MACRO è possibile definire una "nuova istruzione" (una macro) per definire l'insieme delle tre istruzioni assembler con un'unica etichetta.7 per azzerare RB3.diversi punti del programma.LINEA2 PORTB.LINEA3 quindi ogni volta che la macro viene richiamata.0 PORTB. LINEA3 PORTB. oppure: AZZERA 3. Si supponga ad esempio che le linee da azzerare non siano sempre le stesse. si devono specificare quali linee devono essere azzerate: AZZERA 0.1 PORTB. LINEA2. Ogni volta che è necessario compiere questa operazione dovranno essere inserite le seguenti istruzioni all'interno del sorgente: bcf bcf bcf PORTB.LINEA1 PORTB.2 per azzerare RB0. Con le macro è possibile anche specificare dei parametri.Direttive dell'assembler MPASM 149 . RB5 ed RB7.5.1.0 PORTB.2 Ogni volta che si presenta la necessità di inserire le tre istruzioni. Una macro è concettualmente diversa dall'istruzione CALL che agisce a livello di esecuzione del codice e che determina il richiamo di un gruppo di istruzioni 15 . All'inizio del sorgente sarà sufficiente scrivere: AZZERA bcf bcf bcf ENDM MACRO PORTB.1 PORTB. basterà scrivere semplicemente: AZZERA Sarà compito dell’assemblatore espandere la label AZZERA nelle tre istruzioni corrispondenti. In questo caso la macro sarà la seguente: AZZERA bcf bcf bcf ENDM MACRO LINEA1.

PROCESSOR Questa direttiva consente di specificare il tipo di PICmicro utilizzato. Questo comporta una replica nella memoria programma delle istruzioni ogni volta che la macro viene specificata nel sorgente.all'interno dell'area programma del PICmicro.pdf. (ottale) Sintassi: radix <default_radix> Esempio: radix dec Nel CD allegato Nella cartella \Documentazione trovate il file mpasm. la radice predefinita è esadecimale.Direttive dell'assembler MPASM . Sintassi: processor <processor_type> Esempio: processor 12F675 RADIX Definisce la radice predefinita per le espressioni numeriche. Il parametro <default_radix> può valere: • hex (esadecimale) • dec (decimale) • oct. Se non specificato. Le chiamate alle MACRO vengono risolte a livello di compilazione ad opera dell'MPASM che si occupa semplicemente di sostituire di volta in volta l'etichetta della MACRO con le istruzioni corrispondenti. Per funzioni complesse e nel caso sia necessario ottimizzare lo spazio occupato dal programma. 150 15 . questo è il manuale dell’assembler Microchip in cui si trova la lista completa delle direttive del compilatore. è sempre meglio ricorrere alle subroutine (vedi istruzione CALL) piuttosto che alle MACRO.

Tutta la documentazione necessaria per programmare altre famiglie di PIC è disponibile sul CD allegato al testo. Linea 6 della porta B (pin 12 su PIC16x84) utilizzata come linea CLOCK. consente di programmare i chip direttamente sulla scheda destinazione riducendo i tempi di sviluppo/produzione di schede basate sui PIC. La lunghezza dei comandi è sempre di 6 bit A . Quest’ultimo viene generato dal programmatore mentre il flusso sulla linea DATA è bidirezionale a seconda dell’operazione in corso. La programmazione ICSP viene effettuata tramite tre soli collegamenti (oltre al terminale comune) tra il programmatore ed il PIC da programmare ovvero: Piedino di master clear (pin 4 su PIC16x84) utilizzato per applicare la tensione di programmazione VPP al chip.A . MCLR RB6 RB7 La modalità di comunicazione con il PIC è di tipo seriale sincrono in cui i bit trasmessi sulla linea DATA (pin RB7) vengono scanditi dal segnale generato sulla linea di CLOCK (pin RB6).LA PROGRAMMAZIONE ICSP™ DEI PICMICRO La programmazione ICSP (In-Circuit Serial Programming) implementata da Microchip per la programmazione di alcune famiglie di PIC.La programmazione ICSP™ dei PICmicro 151 . In queste pagine viene data una breve introduzione alla programmazione ICSP per i PIC16x84. Linea 7 della porta B (pin 13 su PIC16x84) utilizzata come linea DATA. Tutte le operazioni sul PIC da programmare devono essere precedute dall’invio di un comando da parte del programmatore per comunicare al PIC l’operazione che si intende eseguire. Nella seguente figura viene riportato un esempio di trasmissione di un comando dal programmatore al PIC.

Nella seguente tabella viene riportato l’elenco dei comandi riconosciuti dai PIC16x84: Comando dal programmatore Load Configuration Load Data for Program Memory Read Data from Program Memory Increment Address Begin Programming Load Data for Data Memory Read Data from Data Memory Bulk Erase Program Memory Bulk Erase Data Memory Codice Descrizione comando 000000 Invia al PIC il prossimo dato da scrivere in memoria programma. Cancella l’intera memoria programma Cancella l’intera memoria dati 000010 000100 000110 001000 000011 000101 001001 001011 Il PIC16x84 dispone internamente di tre aree di memoria distinte programmabili dall’esterno: l’area programma (1024 byte). Legge dal PIC la locazione corrente dalla memoria dati. Volendo ad esempio scrivere nella locazione 0 della memoria programma dovrà essere inviata al PIC la sequenza: Load Data for Program Memory + valore a 14 bit Begin Programming Il comando Load Data trasferisce semplicemente il dato a 14 bit in un buffer provvisorio all’interno del PIC. Appena riceve questo comando il PIC trasmette al programmatore il valore letto. Al codice comando segue immediatamente il dato da memorizzare. Tutte le aree di memoria sono implementate su FLASH. il programmatore deve inviare al PIC uno dei comandi LOAD seguito da 14 bit contenenti il dato da memorizzare. Invia al PIC il prossimo dato da scrivere in memoria dati. Al codice comando segue immediatamente il dato da memorizzare. Al codice comando segue immediatamente il dato da memorizzare. Incrementa il puntatore alla locazione corrente nella memoria dati/configurazione/programma. il comando Begin Programming effettua la scrittura vera e propria del dato nella memoria programma. Appena riceve questo comando il PIC trasmette al programmatore il valore letto. Per poter scrivere in una qualsiasi locazione. L’indirizzo della locazione di memoria che viene scritta è contenuto in un puntatore di scrittura 152 A .eventualmente seguiti dalla trasmissione di 14 bit contenenti il valore che dovrà essere scritto. l’area dati pari (64 byte) e l’area configurazione (8 byte). Invia al PIC il prossimo valore da scrivere in memoria dati. Programma la locazione corrente. Le sole aree di programma e dati possono essere lette dall’esterno. Legge dal PIC la locazione corrente dall’area programma.La programmazione ICSP™ dei PICmicro .

La programmazione ICSP™ dei PICmicro 153 . il watchdog timer. ecc. Nel CD allegato Nella cartella \ICSP trovate tutta la documentazione relativa alla tecnica ICSP. L’area dati è un’area FLASH visibile anche dal programma in esecuzione sul PIC e la sua programmazione può essere utile per assegnare dei valori iniziali alle variabili utilizzate dal programma. L’area dati e l’area configurazione vengono programmate con le stesse modalità utilizzando il relativo comando LOAD. ma utili per determinare la modalità di funzionamento di alcuni dispositivi interni al PIC quali l’oscillatore di clock.azzerato automaticamente non appena il PIC viene messo in programmazione (MCLR=12V) ed incrementato tramite il comando: Increment Address Per programmare la locazione successiva basterà trasmettere nuovamente i seguenti comandi: Load Data for Program Memory + valore locazione 1 Begin Programming Increment Address e così via fino alla scrittura completa del programma. L’area configurazione contiene dati invisibili al programma su PIC. Per poter scrivere in una locazione di memoria non è necessario effettuare operazioni di cancellazione. A .

.

B .Tabelle 155 . La tabella successiva. In particolare è riportata la tabella dei codici ASCII in cui per ciascun carattere è illustrata la corrispondente codifica ASCII sia in forma binaria che esadecimale.TABELLE Nelle pagine che seguono sono riportate due tabelle ritenute utili in fase di sviluppo di applicazioni impieganti microcontrollori. invece. riporta la conversione da decimale a binario ed esadecimale dei numeri da 0 a 127.B .

< = > ? @ A B C D E F G H I J K HEX 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 BIN 01001100 01001101 01001110 01001111 01010000 01010001 01010010 01010011 01010100 01010101 01010110 01010111 01011000 01011001 01011010 01011011 01011100 01011101 01011110 01011111 01100000 01100001 01100010 01100011 01100100 01100101 01100110 01100111 01101000 01101001 01101010 01101011 01101100 01101101 01101110 01101111 01110000 01110001 CHAR L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ‘ a b c d e f g h i j k l m n o p q 156 B . .Tabelle .TABELLA DEI CARATTERI ASCII HEX 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 BIN 00000000 00000001 00000010 00000011 00000100 00000101 00000110 00000111 00001000 00001001 00001010 00001011 00001100 00001101 00001110 00001111 00010000 00010001 00010010 00010011 00010100 00010101 00010110 00010111 00011000 00011001 00011010 00011011 00011100 00011101 00011110 00011111 00100000 00100001 00100010 00100011 00100100 00100101 CHAR NUL SOH STX ETX EOT ENQ ACK Bell BS HT LF VT FF CR SO SI DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US Space ! “ # $ % HEX 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B BIN CHAR 00100110 & 00100111 ‘ 00101000 00101001 00101010 00101011 00101100 00101101 00101110 00101111 00110000 00110001 00110010 00110011 00110100 00110101 00110110 00110111 00111000 00111001 00111010 00111011 00111100 00111101 00111110 00111111 01000000 01000001 01000010 01000011 01000100 01000101 01000110 01000111 01001000 01001001 01001010 01001011 ( ) * + . / 0 1 2 3 4 5 6 7 8 9 : .

HEX 72 73 74 75 76

BIN 01110010 01110011 01110100 01110101 01110110

CHAR r s t u v

HEX 77 78 79 7A 7B

BIN CHAR 01110111 w 01111000 x 01111001 01111010 01111011 y z {

HEX 7C 7D 7E 7F

BIN 01111100 01111101 01111110 01111111

CHAR | } ~ DEL

TABELLA DI CONVERSIONE BINARIO/ESADECIMALE
HEX 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D BIN 00000000 00000001 00000010 00000011 00000100 00000101 00000110 00000111 00001000 00001001 00001010 00001011 00001100 00001101 00001110 00001111 00010000 00010001 00010010 00010011 00010100 00010101 00010110 00010111 00011000 00011001 00011010 00011011 00011100 00011101 DEC 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 HEX 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B BIN 00011110 00011111 00100000 00100001 00100010 00100011 00100100 00100101 00100110 00100111 00101000 00101001 00101010 00101011 00101100 00101101 00101110 00101111 00110000 00110001 00110010 00110011 00110100 00110101 00110110 00110111 00111000 00111001 00111010 00111011 DEC 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 HEX 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 BIN 00111100 00111101 00111110 00111111 01000000 01000001 01000010 01000011 01000100 01000101 01000110 01000111 01001000 01001001 01001010 01001011 01001100 01001101 01001110 01001111 01010000 01010001 01010010 01010011 01010100 01010101 01010110 01010111 01011000 01011001 DEC 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89

B - Tabelle

157

HEX 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66

BIN 01011010 01011011 01011100 01011101 01011110 01011111 01100000 01100001 01100010 01100011 01100100 01100101 01100110

DEC 90 91 92 93 94 95 96 97 98 99 100 101 102

HEX 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73

BIN 01100111 01101000 01101001 01101010 01101011 01101100 01101101 01101110 01101111 01110000 01110001 01110010 01110011

DEC 103 104 105 106 107 108 109 110 111 112 113 114 115

HEX 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F -

BIN 01110100 01110101 01110110 01110111 01111000 01111001 01111010 01111011 01111100 01111101 01111110 01111111 -

DEC 116 117 118 119 120 121 122 123 124 125 126 127 -

158

B - Tabelle

C - GLOSSARIO DEI TERMINI UTILIZZATI

.ASM file
File sorgente in formato testo contenente le istruzioni assembler che costituiscono il programma e le direttive del compilatore.

permette la programmazione micro direttamente on-board.

del

Interrupt
Meccanismo che consente l’interruzione dell’esecuzione del programma principale al verificarsi di particolari eventi, esterni o interni, al micro.

.ERR file
File prodotto dopo la fase di compilazione di un progetto. Questo file contiene eventuali avvisi e messaggi di errore generati in fase di compilazione.

Macro
Un insieme di istruzioni assembler che vengono incluse nel file sorgente prima della compilazione. Ogni macro è identificata da una etichetta in corrispondenza della quale il compilatore inserisce le relative istruzioni prima di procedere con la compilazione.

.HEX file
File ottenuto in seguito alla fase di compilazione e pronto per essere scaricato nella memoria programma del micro.

.LST file
File di testo ottenuto dopo la fase di compilazione contenente il codice macchina generato per ciascuna istruzione assembler.

Microcontroller
Chip programmabile dotato dei dispositivi di base per poter memorizzare un programma (memoria EPROM o EEPROM), per poter memorizzare dati e valori (memoria RAM), eseguire funzioni di input/output (linee di I/O, porte seriali, ecc.) e altre funzioni di ausilio (generatore di clock, contatori, ecc.). Il Microcontroller si distingue dal Microprocessore proprio per la presenza di dispositivi ausiliari all'interno dello stesso chip che contiene la CPU.

CPU
Acronimo di Central Process Unit (unità centrale di processo) è la componente che in un sistema a microprocessore esegue le istruzioni di programma.

ICSP
Acronimo di Programming. In-Circuit Tecnologia Serial che

C - Glossario dei termini utilizzati

159

il codice sarà: 00 0001 1000 1100 dove la parte in grassetto è l’opcode che identifica l'istruzione. rappresenta bit che possono assumere solo 2 valori 0 o 1 e rispecchia direttamente la modalità di memorizzazione dei numeri di un microprocessore. La notazione Esadecimale o notazione in base 16. La maggior parte delle istruzioni richiede dei parametri per cui l’opcode risulta essere una parte della stringa di bit che costituisce il codice dell’istruzione. mentre i restanti bit costituiscono il parametro da utilizzare con l'istruzione che in questo caso è l'indirizzo del registro (000 1100 = 0x0C). ad esempio. Operazioni booleane Le booleane sono operazioni logiche tra numeri binari utili in programmazione per lavorare sui bit contenuti nei registri dei PIC. lo stesso numero esadecimale 1A viene riconosciuto nelle seguenti forme: H'1A' 0x1A 1AH La notazione binaria riconosciuta in due forme: B'<binary_digit>' <binary_digit>B quindi lo stesso numero binario 01101100 viene riconosciuto nelle seguenti forme: B'01101100' 01101100B viene OPCODE L'OPerative CODE (dall'inglese codice operativo) è il valore numerico che identifica univocamente una istruzione del PIC. Ad esempio per azzerare il Register File all'indirizzo 0x0C. L'AND tra due registri viene effettuato a coppia tra i bit che occupano la stessa posizione come riportato nell'esempio seguente: 160 C . AND L'AND tra due bit segue la seguente tavola della verità: 0 0 1 1 AND AND AND AND 0 1 0 1 = = = = 0 0 0 1 Se uno dei due fattori vale 0 anche il risultato sarà pari a 0.Glossario dei termini utilizzati .Notazione BINARIA ed ESADECIMALE Notazioni utilizzate in programmazione per indicare valori numerici in alternativa alla notazione decimale. Di seguito sono elencate alcune operazioni elementari. La notazione Binaria o notazione in base 2. Nel linguaggio assembler dei PICmicro la notazione esadecimale può essere rappresentata in tre differenti forme: H'<hex_digit>' 0x<hex_digit> <hex_digit>H Quindi. rappresenta i numeri tramite cifre esadecimali che possono assumere 16 valori.

tra due bit segue la seguente tavola della verità: 0 0 1 1 OR OR OR OR 0 1 0 1 = = = = 0 1 1 1 Se uno dei due bit vale 1 anche il risultato sarà pari a 1.). L'acronimo RAM sta per Random Access Memory ovvero memoria ad accesso casuale. ecc. tutti i 161 C . o OR inclusivo. Se un bit vale 0 il suo NOT sarà 1 e viceversa. XOR Lo XOR (OR esclusivo) tra due bit segue la seguente tavola della verità: 0 0 1 1 XOR XOR XOR XOR 0 1 0 1 = = = = 0 1 1 0 Se i due bit sono uguali il risultato vale 0 in caso contrario vale 1. Lo XOR tra due registri viene effettuato a coppia tra i bit che occupano la stessa posizione come riportato nell'esempio seguente: 01010101 XOR 11110000 = -----------10100101 RESET Con il termine reset si intende l'operazione di azzeramento e riavvio del programma in esecuzione e di tutti i dispositivi interni al PIC.01010101 AND 11110000 = ---------01010000 NOT Il NOT consiste nella semplice negazione del valore di un bit. L'accesso all'interno di una memoria RAM può essere effettuato sia in lettura che scrittura ad una qualsiasi locazione di memoria specificando l'indirizzo della locazione che si desidera raggiungere. NOT 0 = 1 NOT 1 = 0 Il NOT di un registro viene effettuato negando i singoli bit come riportato nell'esempio seguente: 01010101 NOT = -------------10101010 OR L'OR. L'OR tra due registri viene effettuato a coppia tra i bit che occupano la stessa posizione come riportato nell'esempio seguente: 01010101 OR 11110000 = ----------11110101 RAM È un tipo di memoria in grado di mantenere i dati in essa memorizzati finché rimane alimentata. Al reset il programma in esecuzione viene immediatamente interrotto. Data l'estrema facilità di scrittura e lettura di una RAM essa viene normalmente utilizzata in un sistema a microprocessore per memorizzare i dati di lavoro generati dinamicamente dal programma in esecuzione (variabili.Glossario dei termini utilizzati . array.

. Tipicamente una subroutine viene inserita in un programma sia per separare logicamente la funzione dal resto del sorgente sia per risparmiare spazio in memoria scrivendo una sola volta il gruppo di istruzioni necessarie. 162 . ovvero dall'istruzione memorizzata nella locazione 0x0000 (nel PIC16F84A). EPROM Erasable Programmable Read Only Memory (memoria a sola lettura programmabile. È una memoria PROM che può essere cancellata se esposta alla luce di una lampada ad ultravioletti. FLASH Molto simile alla EEPROM.File Register interni reinizializzati e il programma riattivato in esecuzione a partire dal Reset Vector. Per questo motivo i dispositivi dotati di EPROM hanno una finestra trasparente da cui è possibile far raggiungere il chip interno al dispositivo dai raggi UV. EEPROM. Per questo motivo vengono normalmente utilizzate nei sistemi a microprocessore per contenere il programma da eseguire e.Glossario dei termini utilizzati ROM Read Only Memory (memoria a sola lettura) è una memoria già programmata che non può più essere modificata o cancellata. È una memoria ROM non ancora programmata. ROM. istruzione n return Label è un nome simbolico da subroutine che potrà essere utilizzato all'interno del sorgente per richiamarla tramite una istruzione CALL. è una memoria che può essere cancellabile e modificabile elettricamente senza l'ausilio di lampade UV. È una memoria EPROM che può essere cancellata elettricamente senza l'ausilio di lampade UV. cancellabile). PROM Programmable Read Only Memory (memoria a sola lettura programmabile).. La programmazione può essere effettuata tramite una apparecchiatura specializzata denominata programmatore di PROM. C . EPROM. in alcuni casi. L'istruzione return deve essere sempre inserita alla fine di una subroutine in modo tale che la CPU possa riprendere l'esecuzione del programma dall'istruzione successiva alla call. SUBROUTINE È un insieme di istruzioni chiamate più volte all'interno di un programma. EEPROM Electrical Erasable Programmable Read Only Memory (memoria a sola lettura programmabile. La struttura di base di una subroutine è la seguente: Label istruzione 1 istruzione 2 . i dati qualora debbano essere permanenti. cancellabile elettricamente). PROM. FLASH Sono memorie che non perdono il loro contenuto in caso di mancanza di alimentazione.

f rlf result1.del risultato in W . I file sorgente di ciascuna routine è presente nel CD allegato. . Asc0 ed Asc1. Per il corretto uso della routine dovranno essere dichiarati i registri result0.vengono aggiunte le unità 163 D .**************************************************** Ascii2Bin movlw 0x30 . CONVERSIONE DA ASCII A BINARIO La seguente routine consente di convertire il carattere ASCII di una coppia di cifre numeriche nel relativo codice binario.* Ascii2Bin . f movf result1. f addwf result1.D . C rlf result1.memorizzaz. Vengono descritti i parametri di ingresso e il registro (o i registri) in cui viene lasciato l’eventuale risultato senza scendere nell’analisi approfondita del codice. w rlf result1. w . del byte più significativo .Si inizia col byte meno significativo subwf Asc0. moltiplicazione di w per 10 movwf result1 bcf STATUS.ROUTINE ASSEMBLER DI VARIA UTILITÀ In questa sezione sono riportate alcune routine utili che possono essere usate all’interno di programmi più complessi.Routine Assembler di varia utilità .**************************************************** . Le due cifre in formato ASCII dovranno trovarsi nei registri Asc1:Asc0 ed il risultato verrà lasciato in w.memorizzaz. w movwf result0 . result1. w addwf result0.del risultato in result0 movlw subwf 0x30 Asc1. Ad esempio il codice ASCII 00111001 (corrispondente alla cifra “9”) verrà convertito in 00001001 ovvero l’espressione binaria del numero 9. w return .elaboraz.

CONVERSIONE DA BINARIO A CIFRE ASCII La seguente routine interpreta il contenuto di W come un numero binario (compreso tra 0 e 255) e lo converte nelle relative cifre ASCII che vengono lasciate nei registri Asc2:Asc1:Asc0 (Asc0 è la cifra meno significativa).* ByteToDec . f 164 D . w Asc2.**************************************************** ByteToDec movwf TempByte clrw addlw 241 movwf Asc2 addwf addwf addlw movwf swapf andlw addwf addwf sublw movwf addwf addwf addwf movf andlw addwf Asc2. . La routine. f movlw 10 bin2dec999a addwf Asc0. f Asc0. usa anche il registro TempByte in cui vengono memorizzati i risultati intermedi. w 253 Asc1 TempByte. oltre ai registri Asc2. f Asc0. f TempByte. f 251 Asc0 Asc0. f decf Asc1. f skpc goto bin2dec999a bin2dec999b addwf Asc1. w 0x0F Asc0.Routine Assembler di varia utilità .**************************************************** . w 0x0F Asc1. f Asc1. Asc1ed Asc0.

f skpc goto bin2dec999c movlw addwf addwf addwf return 0x30 Asc2. f Asc1.Routine Assembler di varia utilità 165 . f D .decf skpc goto Asc2. f bin2dec999b bin2dec999c addwf Asc2. f Asc0.

C addlw 7 addlw 0x30 movwf HtA_L swapf HexTemp.**************************************************** HexToAscii movwf HexTemp andlw 0x0f sublw 0x09 movf HexTemp.**************************************************** .* HexToAscii . . w andlw 0x0f btfss STATUS. w andlw 0x0f sublw 0x09 swapf HexTemp. Il risultato viene memorizzato nei registri HtA_L e HtA_H (L e H indicano rispettivamente la cifra meno significativa e quella più significativa del risultato). w andlw 0x0f btfss STATUS. C addlw 7 addlw 0x30 movwf HtA_H return 166 D . La routine si appoggia al registro HexTemp che dovrà essere dichiarato.CONVERSIONE DA ESADECIMALE A CIFRE ASCII La seguente routine interpreta il contenuto di W come un numero intero espresso in esadecimale e lo converte nelle rispettive cifre ASCII.Routine Assembler di varia utilità .

f n_1. w q_3. w n_4.* (n_2:n_1)*(n_4:n_3)=(q_4:q_3:q_2:q_1) . q_3. di 32 bit. f n_4. w q_4. .MOLTIPLICAZIONE TRA DUE NUMERI BINARI A 16 BIT I due fattori sono a 16 bit e devono trovarsi nei registri n_2 ed n_1 rispettivamente per il byte più significativo e meno significativo del primo fattore e in n_4 e n_3 rispettivamente per il byte più significativo e meno significativo del secondo fattore.Routine Assembler di varia utilità 167 . f m2 n_3.******************************************************* .******************************************************* Mul1616 clrf q_4 clrf q_3 clrf q_2 clrf q_1 bsf q_2.* Mul1616 . 7 m1 rrf rrf skpc goto movf addwf movf skpnc incfsz addwf m2 rrf rrf rrf rrf skpc goto return n_2. m1 f f f f D . viene lasciato nei registri q_4. Il risultato. q_2 e q_1 dove q_1 è il byte meno significativo. q_3. q_2. f q_4. q_1.

***************************************************** Div4823 DIVIDE_48by23 . .Divisor = zero.DIVISIONE TRA UN DIVIDENDO BINARIO A 48 BIT ED UN DIVISORE BINARIO A 23 BIT Il dividendo deve trovarsi nel registro Dividend che deve essere a 48 bit quindi dichiarato con la direttiva RES 6 in modo da riservare 6 locazioni di 8 bit ciascuna.***************************************************** . la routine viene interrotta lasciando in W il valore zero. w iorwf Divisor + 1. 1. esce lasciando 0 in w. 2.Routine Assembler di varia utilità . w iorwf Divisor + 2. 3. f f f f f D . Nel caso in cui la divisione sia avvenuta correttamente. clrf clrf clrf clrf movlw movwf setc Temp Temp + 1 Temp + 2 Temp2 D'48' BitCount DIVIDE_LOOP_48by23 rlf Dividend + rlf Dividend + rlf Dividend + rlf Dividend + rlf Dividend + 168 5. La routine utilizza anche i registri di appoggio BitCount e Temp in cui vengono memorizzati i risultati intermedi. Nel caso in cui il divisore sia nullo.Controllo se il divisore è nullo movf Divisor. Z retlw 0 . w btfsc STATUS. 4. la routine esce lasciando il risultato nel registro Dividend ed il valore ‘1’ in W.* Div4823 . Il divisore deve trovarsi invece nel registro Divisor che deve essere di 23 bit quindi dichiarato con la direttiva RES 3 in modo da riservare tre byte (il bit più significativo viene ignorato).

w Divisor. f Temp + 1. f Divisor. f rlf Dividend + 4. f rlf Dividend + 2. w Temp. movf btfsc incfsz addwf f 1.rlf rlf rlf rlf movf btfss goto subwf movf skpc incfsz subwf movf skpc incfsz subwf goto Dividend. f Temp + 2.Routine Assembler di varia utilità 169 . f rlf Dividend + 3. f DIVIDE_SKIP_48by23 Div48by23_add addwf Temp + 2. f goto DIVIDE_LOOP_48by23 rlf Dividend + 5. w Temp. w f Divisor. C incfsz Divisor + addwf Temp + 1. f Temp. w Dividend + 5. movf Divisor + btfsc STATUS. w Divisor + 1. C Divisor. f DIVIDE_SKIP_48by23 decfsz BitCount. f retlw 1 D . f Divisor + 1. f Divisor + 2. w Temp + 1. f rlf Dividend + 1. 0 Div48by23_add Temp + 2. w 1. f rlf Dividend. w STATUS.

3907 in esadecimale corrisponde a 0x0F43 per cui la routine controlla se TimerL ha raggiunto il valore esadecimale 0x43 e. quindi aggiornati eventualmente i registri Minuti e Ore. si avranno 3906. f STATUS.***************************************************** . Z TimerH. T0IF incf btfsc incf movlw subwf btfss goto movlw subwf btfss goto clrf clrf 170 TimerL. Ad ogni interruzione la routine di servizio incrementa le variabili di conteggio TimerL e TimerH (TimerL è la meno significativa) per cui quando il conteggio raggiunge il valore 3906. Minuti e Secondi in funzione del tempo trascorso dall’inizio dell’esecuzione del programma.GESTIONE DI ORE. w STATUS. La routine prevede il ripristino del contesto che si presume sia stato salvato secondo quanto indicato nel capitolo relativo alle interruzioni . Non potendo gestire i decimali. Z SecTest_af TimerL TimerH D . Con il quarzo a 4MHz il ciclo istruzione è di 1µs e.Routine Assembler di varia utilità . f 0x43 TimerL.* TIMER interrupt . Z SecTest_af 0x0f TimerH. La routine incrementa il valore dei registri Ore. w STATUS. poiché il timer provoca una interruzione ogni 256 cicli istruzione.25 è trascorso precisamente un secondo. Se TimerH=0x0F e TimerL=0x43 viene incrementato il registro Secondi. T0IE bcf INTCON. Per il corretto funzionamento Timer0 deve essere abilitato senza prescaler ed il PIC deve essere pilotato con un quarzo a 4MHz. controlla che TimerH sia 0x0F.25 interruzioni ogni secondo. in caso affermativo.***************************************************** TimerService bcf INTCON. MINUTI E SECONDI MEDIANTE TIMER0 Questa routine deve essere usata come routine di servizio per una interruzione causata dal Timer0. la routine controlla quando il conteggio raggiunge il valore 3907 provvedendo ad incrementare il contatore ogni 4 secondi.

incf btfsc goto btfsc goto movlw addwf Secondi. Z goto SecTest_af clrf Secondi incf Minuti. f Correctie_af movlw D'60' subwf Secondi. f movlw D'6' movwf TimerL movlw D'60' subwf Minuti. Z goto SecTest_af clrf Ore SecTest_af swapf STATUS_TEMP. w bsf INTCON.Routine Assembler di varia utilità 171 . w btfss STATUS. f movlw D'24' subwf Ore. T0IE retfie D . w btfss STATUS. f swapf W_TEMP. w btfss STATUS. w movwf STATUS swapf W_TEMP. 0 Correctie_af Secondi. Z goto SecTest_af clrf Minuti incf Ore. 1 Correctie_af 2 TimerL. f Secondi.

172 D .Interrupt da Timer0? goto ServizioTimer .DISCRIMINAZIONE DI UN INTERRUPT Questo frammento di codice può essere inserito in corrispondenza dell’interrupt vector (0x04 per il PIC16F84A) e consente di determinare l’evento che ha scatenato l’interruzione.Copia W in W_TEMP swapf STATUS.Interrupt esterno? Goto ServizioExt .si. w movwf STATUS_TEMP .si.l’interruzione è di fine . gestisci l’interruzione btfsc INTCON.si. Le istruzioni goto rimandano alle varie sezioni di codice atte alla gestione dello specifico evento.***************************************************** ServiceInterrupt movwf W_TEMP . Viene eseguito prima di tutto un salvataggio del contesto.Cambio di stato sulla PORTB? goto ServizioRB .scrittura su eeprom Nel CD allegato Nella cartella \sorgenti\utility trovate i file relativi alle routines illustrate.***************************************************** .Routine Assembler di varia utilità . . RBIF . gestisci l’interruzione btfsc INTCON. T0IF .Salva STATUS in STATUS_TEMP btfsc INTCON. quindi vengono analizzati i vari flag per capire quale evento ha scatenato l’interruzione. gestisci l’interruzione Goto ServizioEE .* Riconoscimento Interrupt . INTF .

è possibile lanciare il menu di navigazione avviando il file start. E . mediante il menu di navigazione sulla sinistra.IL CONTENUTO DEL CD L’INTERFACCIA GRAFICA Il CD allegato al presente volume è compatibile con tutti i sistemi operativi Windows e richiede un processore Pentium o superiore con almeno 32Mb di RAM. All’avvio l’interfaccia grafica si presenta come in figura e.exe situato nella directory principale del CD.Il contenuto del CD 173 .E . Se il CD non si avvia automaticamente all’inserimento. è possibile accedere alle varie sezioni del CD. La documentazione è in formato pdf e per la sua visualizzazione è necessario il software Acrobat Reader® che può essere installato cliccando sulla apposita icona ai piedi del menu di navigazione.

10.spl leggibili e modificabili mediante il software sPlan. • Microchip Line Card. sia in Pascal che in C.Il contenuto del CD . • sPlan: il programma per il disegno degli schemi elettrici. • Datasheet del MAX232. L’ambiente di sviluppo comprende l’editor ed il compilatore assembler. • Terminale RS232: è il programma usato nella realizzazione del progetto di figura 13. • Compilatori: nella sezione dei compilatori è possibile trovare tre potentissimi compilatori che permettono la stesure dei file sorgenti sia in Basic. il pdf della “In Circuit Serial Programming Guide” una guida di 250 pagine interamente dedicata alla programmazione InCircuit dei PIC. • sPrint Layout: il programma per il disegno dei circuiti stampati. Le routines di utilità riportate nel testo si trovano nella cartella \sorgenti\utility. infine.I CONTENUTI Tutta la documentazione è situata nella cartella \documentazione e contiene: • Il datasheet del PIC16F84A. 174 E . • La guida al compilatore assembler MPASM.00 dell’ambiente di sviluppo MPLAB di Microchip. La cartella \icsp contiene. Gli schemi elettrici dei progetti sono nella cartella \schemi e sono tutti in formato . Il software è contenuto nella cartella \software che contiene: • MPLAB: la versione 7. I compilatori sono in versione demo e la loro unica limitazione è la generazione di un file hex non superiore ai 2K di dimensione. Nella cartella \sorgenti sono contenuti tutti i file sorgente dei progetti trattati nel testo e dei relativi file hex.

.....6: Input da tastiera.........3: Creazione di un nuovo progetto in MPLAB........ 29 Tabella 3....3: TMR0 regolato dal clock interno ............. 8 Figura 1..................5: Memoria programma per un PIC16F84A.............1: Descrizione dei pin del PIC16F84A................ XT o LP)................... 63 F ..........2: Oscillatore al quarzo/ceramico (modalità HS. .. XT o LP)............................4: Stadio di uscita di RB0÷RB3 ................................................. 9 Figura 2..........1: Il registro contatore TMR0....1: Il PIC16F84A .............. 19 Tabella 3................................... 61 Figura 7............................................. 5 Tabella 1......................1: Selezione delle capacità per i risonatori ceramici...... 37 Figura 4.....INDICE DELLE FIGURE E DELLE TABELLE Figura 1.... 53 Figura 6...............2: Schema a blocchi di un microcontrollore di nuova generazione.............7: Lo stato della configuration word in MPLAB . 55 Figura 6...............................................................4: TMR0 regolato dal clock esterno ...............2: Register File del PIC16F84A....... 6 Figura 1..... 23 Tabella 3...6: Struttura della memoria dati ......3: Sorgente di clock esterno (modalità HS............2: Stadio di uscita per RA0÷RA3......... 20 Figura 3........... 58 Figura 7......................... 47 Figura 6........... 36 Figura 4.......5: Le operazioni per la programmazione di un PIC.............................................................................................................................................................1: Schema elettrico del lampeggiatore a LED...................................... ............................. 17 Figura 3..............1: Una panoramica della scheda easyPIC2............................. 14 Figura 2....................... 41 Figura 4..............2: Pin della PORTA dopo il caricamento di 0001111 in TRISA............. 18 Figura 3................. .................................1: Schema del lampeggiatore sequenziale .......... 13 Figura 2..............1: Le porte A e B ............4: Il program Counter e lo Stack .............. ..Indice delle figure e delle tabelle 175 ....................3: Stadio di uscita di RA4 ................ 34 Figura 3..............................................3: La ALU ed il registro accumulatore W ...... 2 Figura 1...................... 19 Figura 3...............................................4: Schema a blocchi del PIC16F84A .5: Stadio di uscita di RB4÷RB7 .............4: Oscillatore RC......................................................................... 7 Figura 1................................6: Il progetto in MPLAB............F ............ 15 Figura 3.............1: La Program Memory ed il Register File ...................................................... 43 Figura 5.. 51 Figura 6... 57 Figura 6.................................3: Pin della PORTB dopo il caricamento di 11111110 in TRISB....4: Aggiunta di un file al progetto........3: Piedinatura del PIC16F84A............. 3 Figura 1...... 11 Figura 2.. 39 Figura 4...........................................................2: Schema elettrico della parte di alimentazione .......... 56 Figura 6...................................................................................... 62 Figura 7...................................... 62 Figura 7................................................................................................... 30 Figura 3............................................2: I blocchi correlati al TMR0..........

94 Figura 13.........................1: Esempio di Power-Down Mode ............................... 70 Figura 8...............2: Schema a blocchi della circuiteria di reset interna al PIC16F84A...... 142 176 F ............................ 93 Tabella 13...........9: Operazione di RRF su un registro f............................................ 100 Figura 13.5: Incremento di TMR0 sul fronte di salita o di discesa.........2: Gestione di due interruzioni......10: Pilotaggio e monitoraggio delle porte I/O via RS232 .................. 87 Figura 13................................1: Formato delle istruzioni ......... 63 Figura 7............ 101 Figura 13..................................... 86 Figura 11..........................................2: Il risultato dell’esecuzione del programma LCD1.............. 104 Figura 13..1: I blocchi coinvolti al reset .. 73 Figura 9....5: Connessione via modem tra due PC remoti .....................6: Livelli di tensione RS232 per la trasmissione del carattere “A”............................6: Pilotaggio di TMR0 attraverso il Prescaler ............................................................................. 75 Figura 9....... 76 Figura 9. 103 Figura 13... 112 Figura 14.............. 64 Figura 8................... 97 Figura 13..................1: Fattori di divisione e frequenza ottenuta con un clock di 1MHz ... 113 Figura 15............Figura 7...1: Fattori di divisione impostabili per il WDT ...1: Lampeggiatore gestito mediante interruzioni ...............4: Visualizzazione di caratteri su LCD inviati da un PC su RS232 ..................8: Segnali in arrivo sulla seriale............... 79 Figura 10..2: Valori di reset per i vari registri ...............................1: Esempio di uso del WDT ..............ASM .Indice delle figure e delle tabelle ....... 64 Tabella 7............. 108 Figura 13.....3: Circuiteria di reset nel caso di tempi lunghi di stabilizzazione Vdd 78 Tabella 9...............7: Cavo dritto per la connessione del circuito al PC...... 78 Tabella 9............................................. 99 Figura 13......................11: Schema elettrico del “SIMON GAME”......................... 95 Figura 13. ..............1: I pin di un display LCD ...........................1: Valori di reset per il Program Counter ed il registro STATUS. 106 Figura 13.... 83 Tabella 11.1: Struttura della word di configurazione ...........................1: Pilotaggio di un display LCD ......................................3: Il testo può essere posizionato a partire da qualsiasi punto ........

Sign up to vote on this title
UsefulNot useful