Programmazione del microcontrollore PIC 16F84



Documenti analoghi
MICROCONTROLLORE PIC16F84A

Lezione 8. Figura 1. Configurazione del registro INTCON

Lezione 1 Caratteristiche principali del PIC16C84 L'hardware

INTRODUZIONE alla PROGRAMMAZIONE di MICROCONTROLLORI

CIRCUITO DI TEST E SOFTWARE UTILIZZATI

ESERCIZI SUI SISTEMI DI NUMERAZIONE

I microcontrollori. In sostanza i pic hanno le seguenti caratteristiche:

Lezione 4. Figura 1. Schema di una tastiera a matrice di 4x4 tasti

Microcontrollori. L ultima parte del corso prevede un approfondimento sui microprocessori, in particolare sul PIC 16F876.

Esercizi di verifica del debito formativo:

PROCESSOR 16F84A. ;configurazione FUSES: oscillatore XT, WDT disabilitato PWRT abilitato, CP disabilitato config 0x3FF1

A/D CON PIC 16F877. Sommario INTRODUZIONE... 2 SELEZIONARE I BANCHI... 2 ADCON ADCS1, ADCS CH2, CH1 E CH GO/DONE... 6 ADON...

introduzione I MICROCONTROLLORI

Capitolo X del Testo Ettore Panella Giuseppe Spalierno Corso di Elettronica 3 Edizioni Cupido MICROCONTROLLORE PIC 16F84

APPUNTI SUL PIC16F84

NOZIONI BASE DI ASSEMBLER PER PIC16C84

FONDAMENTI di INFORMATICA L. Mezzalira

Architettura hardware

Introduzione ai microcontrollori PIC

PUNTATORE LASER AUTOMATICO CON COMANDO VIA ETHERNET

LABORATORIO DI SISTEMI

Architettura del PIC 18F452

4 3 4 = 4 x x x 10 0 aaa

INFORMATICA 1 L. Mezzalira

SISTEMA DI SVILUPPO MC-16

Ing. Paolo Domenici PREFAZIONE

CPU. Maurizio Palesi

Esempio di moltiplicazione come somma e spostamento

CALCOLATORI ELETTRONICI A cura di Luca Orrù. Lezione n.7. Il moltiplicatore binario e il ciclo di base di una CPU

Capitolo Quarto...2 Le direttive di assemblaggio di ASM Premessa Program Location Counter e direttiva ORG

L unità di controllo. Il processore: unità di controllo. Le macchine a stati finiti. Struttura della macchina a stati finiti

PROGRAMMAZIONE ASSEMBLER

Il µcontrollore PIC 16F84

Informatica B a.a 2005/06 (Meccanici 4 squadra) PhD. Ing. Michele Folgheraiter

Powered by: Relators:

Introduzione. Corso di Informatica Applicata. Università degli studi di Cassino

Testi di Esercizi e Quesiti 1

Laboratorio di Informatica

PIC Set istruzioni. Sintassi Descrizione Microchip Operazione equivalente Effetto su STATUS

Gestione della memoria centrale

8 Microcontrollori PIC

Categorie di sistemi Digitali

MANUALE PARCELLA FACILE PLUS INDICE

Sistemi Operativi. 5 Gestione della memoria

Con il termine Sistema operativo si fa riferimento all insieme dei moduli software di un sistema di elaborazione dati dedicati alla sua gestione.

OSCILLATORI AL QUARZO: CONTASECONDI

Mon Ami 3000 Varianti articolo Gestione di varianti articoli

Input/Output. Moduli di Input/ Output. gestiscono quantità di dati differenti a velocità diverse in formati diversi. n Grande varietà di periferiche

CLASSE III A I.T.I. (ABACUS) SISTEMI DI ELABORAZIONE E TRASMISSIONE DEI DATI VERIFICA DI RECUPERO

Architettura del calcolatore

C. P. U. MEMORIA CENTRALE

Manuale Terminal Manager 2.0

Il Processore: i registri

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

Gerarchia delle memorie

Rappresentazione delle informazioni

I componenti di un Sistema di elaborazione. Memoria centrale. È costituita da una serie di CHIP disposti su una scheda elettronica

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

Introduzione. Corso di Informatica Applicata. Università degli studi di Cassino

DMA Accesso Diretto alla Memoria

Uso di base delle funzioni in Microsoft Excel

STRUTTURE DEI SISTEMI DI CALCOLO

Corso di Sistemi di Elaborazione delle informazioni

Il sistema di I/O. Hardware di I/O Interfacce di I/O Software di I/O. Introduzione

Memorie ROM (Read Only Memory)

Airone Gestione Rifiuti Funzioni di Esportazione e Importazione

Dispensa di Informatica I.1

Funzioni in C. Violetta Lonati

Introduzione alla programmazione in C

Sistema operativo: Gestione della memoria

5-1 FILE: CREAZIONE NUOVO DOCUMENTO

Corso PLC - Manuale Pratico 1

Pronto Esecuzione Attesa Terminazione

Excel. A cura di Luigi Labonia. luigi.lab@libero.it

LINGUAGGI DI PROGRAMMAZIONE

Esame di INFORMATICA

Arduino: Programmazione

Architettura di un calcolatore

Il Sistema Operativo. C. Marrocco. Università degli Studi di Cassino

Invio SMS. DM Board ICS Invio SMS

BARCODE. Gestione Codici a Barre. Release 4.90 Manuale Operativo

List p=16f84 ;Tipo di processore include "P16F84.INC" ;Definizioni di registri interni. goto Inizio

Lezione 1: L architettura LC-3 Laboratorio di Elementi di Architettura e Sistemi Operativi 10 Marzo 2014

Il memory manager. Gestione della memoria centrale

Interfacciamento con memorie Pagina 1 di 9

MANUALE UTENTE Fiscali Free

A intervalli regolari ogni router manda la sua tabella a tutti i vicini, e riceve quelle dei vicini.

Università degli Studi di Cassino Corso di Fondamenti di Informatica Codifica di dati e istruzioni. Anno Accademico 2010/2011 Francesco Tortorella

Gestione Risorse Umane Web

I CONTATORI SINCRONI

Organizzazione della memoria

ARCHITETTURE MICROPROGRAMMATE. 1. Necessità di un architettura microprogrammata 1. Cos è un architettura microprogrammata? 4

SISTEMI DI NUMERAZIONE E CODICI

Architettura degli elaboratori (A)

Compilatore risorse display grafico LCD serie IEC-line

Esempio: aggiungere j

Software di sistema e software applicativo. I programmi che fanno funzionare il computer e quelli che gli permettono di svolgere attività specifiche

Informatica. Rappresentazione dei numeri Numerazione binaria

I sistemi di numerazione

Algoritmi e strutture dati. Codici di Huffman

Transcript:

Programmazione del microcontrollore PIC 16F84

2

Indice Capitolo 1: Set di istruzioni del PIC 16F84 1.1 Descrizione sintetica 1.2 Simbologia adottata 1.3 Sintassi 1.4 Descrizione completa Capitolo 2: Variabili, registri funzionali e struttura della memoria 2.1 Struttura della memoria 2.2 Memoria RAM 2.3 Stack pointer 2.4 Memoria EEPROM 2.4.1 Lettura della EEPROM 2.4.2 Scrittura della EEPROM 2.5 Registri funzionali (SFR) Capitolo 3: Collegamenti hardware 3.1 Segnale di temporizzazione (clock) 3.1.1 Temporizzazione con il quarzo 3.1.2 Temporizzazione con un segnale esterno 3.1.3 Temporizzazione con il circuito RC esterno 3.2 Tensione di alimentazione e reset del PIC 3.3 Interrupt 3.3.1 Gestione della routine d interrupt 3.3.2 Gestione degli interrupt 3.3.3 Differenza tra CALL e interrupt 3.3.4 Vantaggi dell interrupt rispetto al polling Capitolo 4: Direttive del compilatore MPASM 4.1 Impostazioni di compilazione 4.1.1 Radix 4.1.2 Org 4.1.3 End 4.1.4 Include 4.1.5 Config 4.2 Definizione di Variabili, dati e macro 4.2.1 Cblock 4.2.2 Dt 4.2.3 De 4.2.4 Equ 4.2.5 Macro 4.3 Schema generale di un programma assembler 3

4

Capitolo 1: Set di istruzioni del PIC 16F84 1.1 Descrizione sintetica 1.2 Simbologia adottata 1.3 Sintassi 1.4 Descrizione completa 5

Istruzione Descrizione sintetica ADDLW K W = W + K ADDWF R,D D = W + R ANDLW K W = W and K ANDWF R,D D = W and R BCF R,K R(K) = 0 BSF R,K R(K) = 1 BTFSC R,K Se R(K) = 0 salta l istruzione successiva BTFSS R,K Se R(K) = 1 salta l istruzione successiva CALL L Chiama la subroutine all indirizzo L CLRF R R = 0 CLRW W = 0 CLRWDT Watchdog timer = 0 COMF R,D D = not R DECF R,D D = R 1 DECFSZ R,D D = R 1 e salta l istruzione successiva se D = 0 GOTO L Salta ad eseguire l istruzione all indirizzo K INCF R,D D = R + 1 INCFSZ R,D D = R + 1 e salta un istruzione se D = 0 IORLW K W = W or K IORWF R,D D = W or R MOVF R,D D = R MOVLW K W = K MOVWF R R = W NOP Non esegue niente OPTION Registro OPTION = W RETFIE Ritorna da un interrupt handler RETLW K Ritorna da una subroutine con W = K RETURN Ritorna da una subroutine RLF R,D Scorre verso sinistra i bit di R passando per il bit C e D = R RRF R,D Scorre verso destra i bit di R passando per il bit C e D = R SLEEP PIC in standby SUBLW K W = K W SUBWF R,D D = R W SWAPF R,D Scambia i bit 0 1 2 3 con 4 5 6 7 di R e mette in D TRIS RT RT = W XORLW K W = W ex-or K XORWF R,D D = W ex-or R 6

1.1 Simbologia adottata W: indica il registro accumulatore W. R: indica un registro qualunque del PIC, diverso da W, o una variabile definita dal programmatore. Le istruzioni con operando R non funzionano col registro W, vengono eseguite ma generano un risultato errato. F: indica il registro F utilizzato per inserire il risultato di un istruzione in un registro diverso da W. A questi registri non è possibile accedere direttamente se non utilizzando il registro F che viene gestito automaticamente dall hardware del PIC. D: indica un operando che può essere il registro F o il registro accumulatore W, se D = F il risultato dell istruzione viene messo in R. Per esempio ADDWF I,F (con I = variabile) da come risultato I = W + I, ADDWF I,W da come risultato W = W + I. K: indica un numero, se viene specificata una variabile, un registro funzionale o un etichetta anziché un numero, il compilatore gli sostituisce il suo indirizzo di RAM o di memoria programma. Per esempio BSF W,I (con I variabile allocata all indirizzo Ch) diventa BSF W,Ch. Per utilizzare il contenuto di una variabile o di un registro funzionale come K si devono utilizzare le istruzioni logiche di AND, OR, NOT o le MOV tra variabili senza utilizzare le istruzioni con il parametro K. L: indica un indirizzo numerico o un etichetta simbolica. RT: registro TRIS, cioè un registro che gestisce le porte di I/O (PORTA o PORTB). R(K): bit numero K ( 0 K 7 ) del registro R. 1.2 Sintassi Le istruzioni assembler seguono uno schema logico che permette di ricordarle facilmente. Le ultime lettere F, LW, e WF vanno lette nel seguente modo: F: result in R or W; indica che il risultato di un operazione su R viene inserito in R stesso (cioè R indica lo stesso registro di origine del dato) o in W. LW: value in W; indica che un valore viene inserito in W. WF: result in D; indica che il risultato di un operazione su R e W viene inserito in D. Esistono particolari istruzioni che non seguono questo schema logico, come la OPTION, la NOP, la CLRWDT e la TRIS. Le istruzioni, con due registri come operandi, sono sempre nel formato: ISTRUZIONE sorgente,destinazione cioè il registro dopo la virgola è quello che contiene il risultato dell istruzione dopo la sua esecuzione. 7

1.3 Descrizione completa ADDLW K Somma K a W e mette il risultato in W. Flag modificati dopo la sua esecuzione: Z = 1 se W = 0. DC = 1 se W > 15. C: o C = 1 se W(7) = 0. o C = 0 se W(7) = 1. ADDWF R,D Somma W a R e mette il risultato in D. Flag modificati dopo la sua esecuzione: Z = 1 se dopo l operazione W = 0. DC = 1 se dopo l operazione W > 15. C: o C = 1 se W(7) = 0. o C = 0 se W(7) = 1. ANDLW K Esegue l AND bit a bit tra K e W, e mette il risultato in W. Flag modificati dopo la sua esecuzione: Z = 1 se W = 0. ANDWF R,D Esegue l AND bit a bit tra R e W, e mette il risultato in D. Flag modificati dopo la sua esecuzione: Z = 1 se D = 0. BCF R,K Azzera il bit numero K ( 0 K 7 ) del registro R. BSF R,K Mette a 1 il bit numero K ( 0 K 7 ) del registro R. BTFSC R,K Salta l istruzione successiva se il bit numero K del registro R vale 0. BTFSS R,K Salta l istruzione successiva se il bit numero K del registro R vale 1. 8

CALL L Richiama una subroutine memorizzata all indirizzo L. Nello STACK viene memorizzato l indirizzo dell istruzione successiva alla CALL (PCL+1) per riprendere l esecuzione da quel punto quando nella subroutine si incontra un istruzione RETURN o RETLW. CLRF R Azzera il registro R. Flag modificati dopo la sua esecuzione: Z = 1. CLRW Azzera il registro W. Flag modificati dopo la sua esecuzione: Z = 1. CLRWDT Questa istruzione deve essere usata quando il PIC viene programmato col fusibile WDTE abilitato, cioè con la funzione Watchdog abilitata. In questa modalità il PIC attiva un timer che trascorso un determinato tempo esegue il reset del PIC. Per evitare il reset il programma deve eseguire ciclicamente l istruzione CLRWDT per azzerare il timer prima del tempo impostato. Se il timer non viene azzerato, la funzione Watchdog, interpreta l istruzione CLRWDT come un blocco del programma ed esegue un reset per sbloccarlo. COMF R,D Esegue l operazione di NOT bit a bit su R e mette il risultato in D. Flag modificati dopo la sua esecuzione: Z = 1 se D = 0. DECF R,D Mette in D il contenuto di R decrementato di uno. Flag modificati dopo la sua esecuzione: Z = 1 se D = 0. DECFSZ R,D Mette in D il contenuto di R decrementato di uno e salta l istruzione successiva se D = 0. GOTO L Salta ad eseguire l istruzione all indirizzo L. INCF R,D Incrementa il contenuto di R e mette il risultato in D. 9

Flag modificati dopo la sua esecuzione: Z = 1 se D = 0. INCFSZ R,D Mette in D il contenuto di R aumentato di uno e salta all istruzione successiva se D = 0. IORLW K Esegue l operazione di OR bit a bit tra W e K mettendo il risultato in W. Flag modificati dopo la sua esecuzione: Z = 1 se W = 0. IORWF R,D Esegue l operazione di OR bit a bit tra W e R mettendo il risultato in D. Flag modificati dopo la sua esecuzione: Z = 1 se D = 0. MOVLW K Assegna a W il valore K. MOVF R,D Assegna a D il contenuto di R. Flag modificati dopo la sua esecuzione: Z = 1 se R = 0. MOVWF R Assegna a R il contenuto di W. NOP Non esegue nessuna operazione, ma crea un ritardo di OPTION Assegna al registro OPTION il contenuto di W. 10 1 µ s a 4MHz. RETFIE Restituisce il controllo al programma principale, questa istruzione deve essere inserita nella subroutine che gestisce l interrupt per terminarne l esecuzione. La RETFIE va utilizzata quando la subroutine viene chiamata da un interrupt. RETLW K Restituisce il controllo al programma principale e inserisce in W il valore di K (passaggio di parametro), questa istruzione deve essere inserita nelle subroutine chiamate da una CALL per terminarne l esecuzione.

RETURN Restituisce il controllo al programma principale, questa istruzione deve essere inserita nelle subroutine chiamate da una CALL per terminarne l esecuzione. RLF R,D Ruota di una posizione i bit del registro R verso sinistra (da quelli meno significativi a quelli più significativi) passando per il flag di carry C. Il risultato della rotazione viene messo nel registro D. Lo stato del bit C (C = 0 o C = 1), prima dell esecuzione della RLF, viene inserito nel primo bit del registro D e fatto scorrere con gli altri. RRF R,D Ruota di una posizione i bit del registro R verso destra (da quelli più significativi a quelli meno significativi) passando per il flag di carry C. Il risultato della rotazione viene messo nel registro D. Lo stato del bit C (C = 0 o C = 1), prima dell esecuzione della RRF, viene inserito nel primo bit del registro D e fatto scorrere con gli altri. SLEEP Blocca l esecuzione delle istruzioni e mette il PIC in standby. SUBLW K Sottrae alla costante K il contenuto di W e mette il risultato in W. Flag modificati dopo la sua esecuzione: Z = 1 se dopo l operazione W = 0 DC = 1 se dopo l operazione W > 15 C: o C = 1 se W(7) = 0. o C = 0 se W(7) = 1. SUBWF R,D Sottrae alla costante K il contenuto di R e mette il risultato in D. Flag modificati dopo la sua esecuzione: Z = 1 se dopo l operazione W = 0 11

C: o C = 1 se W(7) = 0. o C = 0 se W(7) = 1. SWAPF R,D Scambia i bit 0 1 2 3 con i bit 4 5 6 7 del registro R e mette il risultato in D. TRIS RT Memorizza in uno dei registri speciali TRIS il contenuto di W. I registri TRIS determinano il funzionamento delle porte di I/O del PIC, esiste un registro TRIS per ogni porta di I/O del PIC detti TRISA e TRISB. XORLW K Esegue l operazione di EX-OR bit a bit tra W e K mettendo il risultato in W. Flag modificati dopo la sua esecuzione: Z = 1 se W = 0. XORWF R,D Esegue l operazione di OR bit a bit tra W e R mettendo il risultato in D. Flag modificati dopo la sua esecuzione: Z = 1 se D = 0. 12

Capitolo 2: Variabili, registri funzionali e struttura della memoria 2.1 Struttura della memoria 2.2 Memoria RAM 2.3 Stack pointer 2.4 Memoria EEPROM 2.4.1 Lettura della EEPROM 2.4.2 Scrittura della EEPROM 2.5 Registri funzionali (SFR) 13

2.1 Struttura della memoria I PIC hanno una RAM e una ROM di tipo Flash (16F84) o di tipo EPROM (16C84); i 16C84 possono essere programmati solo una volta perché non possono più essere cancellati e riprogrammati. La RAM, mappata da 0h a CFh, contiene i registri funzionali e le variabili, la ROM, mappata da 0h a 3FFh, contiene il programma. La RAM e la ROM sono mappate utilizzando il bus di controllo e il bus indirizzi in modo che venga attivata solo la RAM o solo la ROM quando si accede ad un registro o alla memoria del programma. Esiste anche una RAM che funziona da stack e una EEPROM, accessibile tramite dei registri, che può essere usata per salvare dei dati durante l esecuzione del programma da mantenere anche in assenza di alimentazione. 2.2 Memoria RAM Il PIC 16F84 ha una RAM di 80 byte, utilizzatile dal programmatore in lettura e scrittura, con celle composte da registri a 8 bit con un preciso indirizzo fisico (univoco per ogni registro). In mancanza di alimentazione perde i dati memorizzati. Questa memoria è mappata da 0h a 4Fh, i primi 12 byte (da 0h a Bh) sono i registri funzionali del PIC che ne determinano il modo di funzionamento, i 68 byte consecutivi (da Ch a 4Fh) sono dei registri utilizzabili dal programmatore per definire le variabili del programma. La RAM è divisa in due banchi, bank 0 e bank 1, per accedere a uno o all altro banco si deve agire sul bit 5 del registro STATUS (bit 5 = 0 bank 0, bit 5 = 1 bank 1). I 68 registri utilizzabili per definire le variabili e quasi tutti i 12 registri funzionali si trovano sia nel bank 0 che nel bank 1. Fanno eccezione solo 5 registri che si trovano solo nel bank 1: TRISA, TRISB, OPTION, e altri due che si modificano solo durante operazioni di lettura e scrittura su un particolare settore della memoria. I registri presenti sia nel bank 0 che nel bank 1 sono duplicati dinamicamente, cioè vengono aggiornati in entrambi i banchi contemporaneamente, per evitare di commutare continuamente da un banco all altro. 2.3 Stack pointer Lo stack è una RAM inaccessibile direttamente dal programmatore con struttura FIFO (First Input First Output). Lo stack ha otto celle di memoria per memorizzare otto indirizzi di memoria programma quando viene eseguita un istruzione CALL o si verifica un interrupt. Con una CALL, la CPU, passa ad eseguire un sottoprogramma localizzato nella memoria programma, al termine del quale deve tornare ad eseguire il programma principale. Per tornare ad eseguire il programma principale deve salvare nello stack l indirizzo dell istruzione successiva alla CALL ed estrarlo, sempre dallo stack, quando nel sottoprogramma c è l istruzione RETURN. Con un interrupt si procede nello stesso modo: quando si verifica un interrupt, la CPU, deve eseguire un sottoprogramma di gestione dell interrupt localizzato nella 14

memoria programma, al suo termine (quando c è l istruzione IRET) deve tornare ad eseguire il programma principale. Con uno stack di 8 celle è possibile eseguire 8 sottoprogrammi consecutivi (senza mai trovare un istruzione RETURN): un sottoprogramma può eseguire un istruzione CALL ad un altro sottoprogramma e cosi via fino ad un livello di otto sottoprogrammi chiamati. Dopo otto chiamate lo stack è completo, quindi per salvare altri indirizzi il PIC cancella i primi inseriti perdendo la possibilità di tornare al programma principale. 2.4 Memoria EEPROM La EEPROM, è accessibile tramite 4 registri funzionali detti: EECON1, EECON2 (non implementato fisicamente), EEDATA e EEADR. La funzione dei 4 registri è la seguente: EEDATA: contiene il byte da leggere o scrivere nella cella di memoria della EEPROM. EEADR: contiene l indirizzo (di dimensione pari a un byte) della cella di memoria da leggere o scrivere. EECON1: contiene i bit di controllo, vedere nel prossimo paragrafo la sua spiegazione. EECON2: viene utilizzato dall hardware del PIC nelle operazioni di lettura e scrittura, in questo registro si può solo scrivere un valore, se viene letto fornisce il valore 0h. Nel PIC 16F84 la EEPROM è di 64 byte, l intervallo di indirizzi per leggerla e scriverla va da 0h a 3Fh. 2.4.1 Lettura della EEPROM Per leggere il contenuto di una cella di memoria della EEPROM si deve inserire nel registro EEADR l indirizzo della cella e impostare a uno il bit RD del registro EECON1, il byte letto sarà disponibile al prossimo ciclo macchina nel registro EEDATA che lo mantiene fino alla prossima lettura o scrittura nella EEPROM. 2.4.2 Scrittura della EEPROM Per scrivere in una cella di memoria della EEPROM si deve impostare ad uno il bit WREN di EECON1, inserire nel registro EEADR l indirizzo della cella e in EEDATA il byte da scrivere, inoltre, si deve usare una sequenza di istruzioni per ogni byte da scrivere nella EEPROM. Questa sequenza deve scrivere 55h in EECON2, scrivere AAh sempre in EECON2 ed infine impostare ad un uno il bit WR di EECON1. Inoltre è consigliabile disabilitare gli interrupt durante la scrittura. Una sequenza tipica può essere questa: bsf STATUS,RP0 15

bcf INTCON,GIE bsf EECON1,WREN movlw 55h movwf EECON2 movlw AAh movwf EECON2 bsf EECON1,WR bsf INTCON,GIE 2.5 Registri funzionali (SFR) In generale è consigliabile accedere solo al bank 0 per usare i registri durante l esecuzione del programma, ed accedere solo al bank 1 all inizio dell esecuzione per impostare i registri TRISA, TRISB e OPTION che regolano il funzionamento del PIC e in generale non devono essere modificati durante l esecuzione del programma. I registri funzionali, detti anche special function register (SFR), sono: INDF Una scrittura in questo registro provoca una scrittura all indirizzo di RAM puntato in quel momento dal registro FSR. Questa tecnica si chiama indirizzamento indiretto della memoria. FSR Contiene l indirizzo della cella di RAM nel quale si vuole scrivere il contenuto del registro INDF. STATUS Contiene i risultati di un operazione logica o matematica. Dopo l esecuzione di un istruzione logica o matematica i bit (detti flag) di questo registro si modificano come segue: C: carry; se o C = 1 l operazione ha generato un riporto. o C = 0 l operazione non ha generato un riporto. Z: zero; se o Z = 1 l operazione ha avuto zero come risultato. o Z = 0 l operazione ha avuto un risultato diverso da zero. RP0: bank selector; se o RP0 = 0 viene selezionato il bank 0. o RP0 = 1 viene selezionato il bank 1. IRP e RP1: vanno sempre tenuti a zero. 16

OPTION È il registro che contiene i bit di impostazione del PIC, si trova nel bank 1 quindi per accedervi si deve impostare RP0 a uno: PS0, PS1 e PS2: prescaler; per impostare la demoltiplicazione si deve inserire in questi tre bit i valori compresi tra 000b a 111b. Consentono demoltiplicazioni da o 1:2 a 1:256 se assegnati a TMR0. o 1:1 a 1:128 se assegnati al Watchdog. PSA: assegnatore del prescaler; se o PSA = 1 il prescaler viene assegnato al Watchdog. o PSA = 0 il prescaler viene assegnato a TMR0. T0CS: incremento di TMR0; se o T0CS = 0 il registro TMR0 viene incrementato ad ogni istruzione eseguita. o T0CS = 1 e T0SE = 1 il registro TMR0 viene incrementato quando sul piedino RA4/T0CKI c è un fronte di discesa. o T0CS = 1 e T0SE = 0 il registro TMR0 viene incrementato quando sul piedino RA4/T0CKI c è un fronte di salita. IEG: fronte per l interrupt sul piedino RB0/INT (configurato come input in TRISB); se o IEG = 1 si genera l interrupt sul fronte di salita. o IEG = 0 si genera l interrupt sul fronte di discesa. RBPU: PORTB pull-up resistor; se o RBPU = 0 tramite resistenze interne vengono portati a positivo (resistenze di pull-up) tutti i pin della porta B che devono essere configurati come input nel registro TRISB. INTCON Governa gli interrupt, i bit RBIF, INTF e T0IF vanno a uno al verificarsi della condizione a loro associata indipendentemente dal fatto che quel tipo di interrupt sia abilitato e dall abilitazione globale degli interrupt. Quando si abilita un interrupt si devono sempre abilitare due bit: il GIE e il bit relativo al tipo di interrupt (EEIE, T0IE, INTE, RBIE). Per disabilitare gli interrupt è sufficiente impostare il GIE a zero. I bit del registro INTCON sono i seguenti: GIE: abilitazione globale interrupt; se o GIE = 1 gli interrupt sono abilitati. o GIE = 0 gli interrupt sono disabilitati. EEIE: abilitazione interrupt di fine scrittura nella RAM; se o EEIE = 1 interrupt abilitato. o EEIE = 0 interrupt disabilitato. T0IE: abilitazione interrupt di overflow su TMR0; se o T0IE = 1 interrupt abilitato. o T0IE = 0 interrupt disabilitato. 17

INTE: abilitazione interrupt del cambio di stato su RB0/INT (questo piedino deve essere impostato come input per recepire il segnale di interrupt); se o INTE = 1 interrupt abilitato. o INTE = 0 interrupt disabilitato. RBIE: abilitazione dell interrupt del cambio di stato su almeno un piedino RB4,,RB7; se o RBIE = 1 interrupt abilitato. o RBIE = 0 interrupt disabilitato. T0IF = 1 quando TMR0 passa da FFh o 0h, deve essere rimesso a zero dal programmatore, altrimenti il PIC, dopo la RETFIE torna alla locazione 4h e riesegue la GOTO alla subroutine di interrupt finché T0IF = 1. INTF = 1 quando si ha la condizione di interrupt su RB0/INT, deve essere rimesso a zero dal programmatore, altrimenti il PIC, dopo la RETFIE torna alla locazione 4h e riesegue la GOTO alla subroutine di interrupt finché INTF = 1. RBIF = 1 quando almeno uno dei piedini RB4,,RB7 cambia stato, deve essere rimesso a zero dal programmatore, altrimenti il PIC, dopo la RETFIE torna alla locazione 4h e riesegue la GOTO alla subroutine di interrupt finché RBIF = 1. EECON 1 Governa la lettura e la scrittura dei 64 byte di EEPROM, si trova nel bank 1 quindi per accedervi si deve impostare RP0 a uno. I bit 5, 6 e 7 sono sempre posti a zero, mentre gli altri sono: EEIF = 1 quando l operazione di scrittura in una cella è completa. WRER = 1 quando l operazione di scrittura in una cella è andata a buon fine. WREN: abilitazione alla scrittura sulla EEPROM; se o WREN = 1 la scrittura è consentita. o WREN = 0 la scrittura non è consentita. WR: controllo per la scrittura; va impostato a uno quando inizia la scrittura e viene resettato automaticamente quando questa termina. Via software è solo possibile settarlo. RD: controllo per la lettura; va impostato a uno quando inizia la lettura e viene resettato automaticamente quando questa è termina. Via software è solo possibile settarlo. PORTA Gestisce la porta di input/output A che ha 5 piedini (da RA4 a RA0) per scambiare i dati con l esterno. I bit del registro PORTA corrispondono ai piedini della porta A come segue: i bit 7, 6 e 5 sono fissi a zero perché non hanno corrispondenza con dei piedini fisici del PIC, mentre il bit n ( 0 n 4 ) 18

corrisponde al valore (0 o 1) da leggere o scrivere sul piedino RAn (bit 4 RA4, bit 3 RA3, etc.) PORTB Gestisce la porta di input/output B che ha 8 piedini (da RB7 a RB0) per scambiare i dati con l esterno. I bit del registro PORTB corrispondono ai piedini della porta B come segue: il bit n ( 0 n 7 ) corrisponde al valore (0 o 1) da leggere o scrivere sul piedino RBn (bit 7 RB7, bit 6 RB6, etc.) TRISA Imposta i piedini delle porta A come input o come output. I bit di TRISA corrispondono ai piedini fisici come i bit del registro PORTA. Se o Il bit corrispondente ad un piedino = 1 il piedino è un input. o Il bit corrispondente ad un piedino = 0 il piedino è un output. TRISB Imposta i piedini delle porta B come input o come output. I bit di TRISB corrispondono ai piedini fisici come i bit del registro PORTB. Se o Il bit corrispondente ad un piedino = 1 questo è un input. o Il bit corrispondente ad un piedino = 0 questo è un output. PCL Contiene l indirizzo della successiva istruzione da eseguire, che non necessariamente è la successiva a quella in esecuzione. Per esempio se l istruzione corrente è una GOTO il PCL contiene l indirizzo di memoria programma indicato dalla GOTO. Questo registro viene anche chiamato program counter. TMR0 Viene incrementato automaticamente in base ai valori assunti dai bit T0SE e T0CS del registro OPTION. T0PRE Viene incrementato automaticamente ad ogni impulso di clock, quando arriva a FFh o dopo un reset (o un POR) riparte da 0h. PCLATH Determina la selezione delle pagine di memoria programma. La memoria programma è divisa in 4 pagine da 2048 celle da 16 bit ognuna (da 0h a 7FFh, da 800h a FFFh, da 1000h a 17FFh e da 1800h a 1FFFh), per accedere a una di queste pagine si devono modificare i bit più significativi del registro PCL scrivendo il valore desiderato nel registro PCLATH. Se l esecuzione del programma porta a passare da una pagina all altra, i bit del registro PCL 19

vengono modificati automaticamente. Nei PIC con una memoria programma minore o uguale a 2048 word non è richiesta la paginazione della memoria. 20

Capitolo 3: Collegamenti hardware e interrupt 3.1 Segnale di temporizzazione (clock) 3.1.1 Temporizzazione con il quarzo (modo XT, LP e HS) 3.1.2 Temporizzazione con un segnale esterno 3.1.3 Temporizzazione con il circuito RC esterno 3.2 Tensione di alimentazione e reset del PIC 3.3 Interrupt 3.3.1 Gestione della routine d interrupt 3.3.2 Gestione degli interrupt 3.3.3 Differenza tra CALL e interrupt 3.3.4 Vantaggi dell interrupt rispetto al polling 21

3.1 Segnale di temporizzazione (clock) Il PIC, come tutti i processori, necessita di un circuito che scandisce l elaborazione dei dati e il passaggio da una istruzione alla successiva, sono supportati 4 modi di temporizzazione (segnale di clock): con un quarzo, con un quarzo high speed, con un quarzo slow speed e con un circuito RC esterno. I primi tre hanno il vantaggio della notevole stabilità in frequenza, l ultimo è il più economico. Il PIC 16F84 ha una frequenza massima di funzionamento il cui valore è serigrafato sul contenitore: ad esempio un PIC 16F84-04P può funzionare al massimo a 4 Mhz. Per farlo funzionare a 10Mhz o a 20Mhz si deve utilizzare la versione -10P o la -20P. La P indica il tipo di contenitore del circuito integrato (P = plastico). 3.1.1 Temporizzazione con il quarzo (modo XT, LP e HS) Il quarzo è un componente piezoelettrico caratterizzato da una elevata stabilità in frequenza, indispensabile per far eseguire al controllore dei conteggi di tempo precisi. Inoltre non degrada significativamente le sue prestazioni nel tempo e al variare della temperatura. Il quarzo va collegato direttamente tra il pin 15 e il pin 16 e distante al massimo 3 cm dal PIC. È consigliabile saldare il suo contenitore metallico alla massa del circuito per limitare l influenza dei disturbi. Il manuale Microchip del PIC consiglia l inserimento di due piccoli condensatori, di valore compreso tra 12 e 33 pf (22 pf è il valore commerciale ottimo), tra ciascun piedino del quarzo e la massa. Per eseguire un istruzione di un ciclo macchina il controllore impiega 1 µs con quarzo di 4 Mhz, dato che la maggior parte delle istruzioni sono eseguite in un solo ciclo macchina (poche sono eseguite in 2 cicli) risulta immediato calcolare il tempo di esecuzione di un segmento di programma. Lo schema elettrico di temporizzazione con il quarzo è il seguente: (1) Valore consigliato di 22 pf per frequenze da 2 a 20 MHz. (2) Può essere richiesta per i quarzi con taglio AT. (3) Il suo valore deve essere compreso tra 2 e 10 MΩ. 22

3.1.2 Temporizzazione con un segnale esterno Per utilizzare un segnale esterno di temporizzazione si deve impostare il tipo di oscillatore come: XT, HS o LP, e collegare il segnale al piedino OSC1. Lo schema elettrico è il seguente: 3.1.3 Temporizzazione con il circuito RC esterno Per utilizzare il circuito RC esterno, per temporizzate il PIC, si deve collegare un condensatore e una resistenza al piedino OSC1. Il condensatore Cext deve avere una capacità maggiore di 20 pf, la resistenza Rext deve avere un valore compreso tra 5 e 100 KΩ. Lo schema elettrico è il seguente: 3.2 Tensione di alimentazione e reset del PIC Il controllore va alimentato con una tensione stabilizzata di 5 V tra il pin 5 (GND) e il pin 14 (+VDD), il produttore consiglia di inserire anche un condensatore di 100 nf molto vicino ai pin di alimentazione per assorbire i disturbi ad alta frequenza (capacità di by-pass). Il pin 4 del PIC (MCLR) è un ingresso attivo a livello basso che esegue il reset del PIC: se attivato fa ripartire l esecuzione del programma dalla prima istruzione (ovvero dall indirizzo 0h della memoria programma) e resetta alcuni registri funzionali. Un reset automatico avviene anche al power-on cioè all arrivo della tensione di alimentazione. Collegando direttamente il pin 4 all alimentazione +5 V si usufruisce automaticamente della funzione POR (Power On Reset) che consiste in un impulso di reset al processore al salire dell alimentazione. Questa funzione non è reversibile, ovvero allo scendere della tensione, non viene generato il reset: MCLR è un ingresso triggerato sul fronte di salita. La casa costruttrice suggerisce di utilizzare un circuito di reset 23

esterno se la rampa di salita della tensione di alimentazione è molto lenta. In questo caso il processore potrebbe non accorgersi dello stato di power-on. Lo schema elettrico del circuito è il seguente (R < 40 KΩ): 3.3 Interrupt Un interrupt è un segnale generato da una periferica del PIC all accadere di un evento esterno. Se il PIC ha gli interrupt abilitati, all arrivo di un segnale di interrupt, l esecuzione del programma principale viene fermata e la CPU esegue una subroutine di gestione dell interrupt. Al termine della routine di interrupt il processore torna ad eseguire il programma principale al punto dov è stato interrotto; l evento interrupt al pari di una CALL determina l occupazione di una cella dello stack per salvare l indirizzo di memoria programma al punto di interruzione. La cella dello stack occupata viene liberata dall istruzione che conclude obbligatoriamente la subroutine di interrupt: RETFIE. I registri che determinano se e come usare l interrupt sono: OPTION (81h, bank 1) e INTCON (Bh, nel bank 0). Il punto 4 sulle fonti degli interrupt porta ad accedere alla memoria programma. Un esempio di utilizzo degli interrupt può essere un programma di controllo per una macchina utensile: il PIC controllerà l inserimento degli utensili, il posizionamento del pezzo in lavorazione, comandando i vari attuatori così come voluto dal programmatore. All attivarsi di un sensore che indica un pericolo per l operatore (per esempio il superamento di una barriera di protezione) la macchina deve operare per mettere in sicurezza l operatore, anziché continuare la lavorazione del pezzo. Quando arriva un interrupt, se questi sono abilitati, il PIC smette di eseguire il programma attuale per eseguire il programma di gestione dell interrupt, che in questo caso, prevedrà azioni volte alla cessazione di movimenti pericolosi per l operatore. Il sensore per inviare un segnale di interrupt deve essere collegato ad un ingresso del PIC abilitato a riceverlo. 3.1.1 Gestione della routine d interrupt All arrivo di un interrupt il PIC si porta, automaticamente, all indirizzo 4h della memoria programma dove deve trovare un istruzione GOTO che lo 24

spedisca direttamente alla prima istruzione della subroutine di gestione dell interrupt, indicata con un etichetta. Al termine di questa subroutine, all istruzione RETFIE, il processore esegue l istruzione successiva all ultima eseguita prima dell interruzione. Dopo un reset (o un POR), la CPU parte sempre dall istruzione alla cella 0h della memoria programma, quindi è necessario che nella cella 3h vi sia un istruzione GOTO all istruzione nella cella 5h. Senza questo accorgimento, ad ogni accensione, il PIC eseguirebbe la GOTO alla soubroutine senza che un interrupt ne faccia esplicita richiesta. 3.1.2 Gestione degli interrupt L interrupt può essere disabilitato, in tal caso se si verifica la condizione scatenante il PIC lo ignora. L abilitazione può essere data e revocata in ogni momento e anche più volte nel corso dello stesso programma: si può pensare ad una parte di programma molto delicata, che non deve essere interrotta per nessun motivo, quindi prima di questo segmento di programma si deve inserire il comando di disabilitazione degli interrupt. Quando si serve un interrupt, automaticamente questi vengono disabilitati, per evitare che la medesima causa scatenante generi tanti interrupt consecutivi. Essendo una sola la parte di programma dedicata, il processore non saprebbe più come gestire le richieste. Alla RETFIE gli interrupt vengono riabiliti automaticamente, nelle stesse condizioni. Il programmatore deve impostare a zero i bit T0IF, INTF e RBIF (o meglio solo quello che passa a uno quando il tipo di interrupt impostato viene attivato) altrimenti dopo la RETFIE il PIC torna alla locazione 4h e riesegue la GOTO alla subroutine di gestione dell interrupt finché quei bit non sono a zero. 3.1.3 Differenza tra CALL e interrupt La differenza con l istruzione CALL sta nel fatto che con un interrupt non si conosce il punto dove il processore ritorna, perché può essere interrotto in modo asincrono, cioè in qualunque momento, da una periferica. Con un istruzione RETURN si è certi di tornare all istruzione successiva alla CALL che ha chiamato il sottoprogramma. 3.3.4 Vantaggi dell interrupt rispetto al polling Il vantaggio dell interrupt, rispetto a una gestione polling, è quello di costringere immediatamente il processore a dedicarsi al suo problema, anziché interrogare ciclicamente ogni parametro ed eseguire la relativa azione se il parametro è fuori norma. Con la gestione in polling se il parametro ritenuto a norma impazzisce dopo il controllo, il PIC se ne accorge solo al suo ricontrollo. 25

Capitolo 4: Direttive del compilatore MPASM 4.1 Impostazioni di compilazione 4.1.1 Radix 4.1.2 Org 4.1.3 End 4.1.4 Include 4.1.5 Config 4.2 Definizione di Variabili, dati e macro 4.2.1 Cblock 4.2.2 Dt 4.2.3 De 4.2.4 Equ 4.2.5 Macro 4.3 Schema generale di un programma assembler 26

4.1 Impostazioni di compilazione RADIX Definisce la base numerica da utilizzare, cioè ogni numero non seguito da d (base decimale), h (base esadecimale, si può indicare anche con 0x davanti al numero), o (base ottale), b (base binaria) viene interpretato come numero espresso secondo la base definita da RADIX. Se la direttiva RADIX non viene utilizzata la base di default è quella esadecimale. La sintassi per la direttiva RADIX è la seguente: RADIX < base > base può assumere tre valori: hex, dec, oct. Per definire la base decimale si deve scrivere: RADIX dec. ORG Definisce l indirizzo di partenza nella memoria quando si compila il programma. Ogni volta che il compilatore trova un ORG inserisce le istruzioni o i dati compilati partendo dall indirizzo di memoria specificato dalla ORG. Nel programma ci possono essere più ORG per definire di volta in volta la posizione dei dati in memoria, in genere si usa una ORG per definire l indirizzo di partenza del programma. La sintassi per la direttiva ORG è la seguente: ORG < indirizzo > Per far partire il programma dall inizio della memoria si deve scrivere: ORG 0. END Definisce la fine del programma da compilare, quando il compilatore trova una END smette di compilare e fornisce il programma compilato. Tutte le istruzioni e le variabili dopo la END vengono ignorate dal compilatore. INCLUDE Definisce il file da includere durante la compilazione contenente la definizione dei nomi dei registri speciali associati al loro indirizzo in RAM (in questo modo si può scrivere direttamente il loro nome nel programma senza ricordarsi a quale indirizzo corrispondono), della massima memoria RAM utilizzabile (direttiva MAXRAM), delle zone di RAM riservate (direttiva BADRAM), ecc. La sintassi per la direttiva INCLUDE è la seguente: INCLUDE < nome del file da includere > 27

Per includere il file relativo al PIC 16F84 si deve scrivere: INCLUDE "P16F84.INC". CONFIG Definisce il valore da memorizzare nella word di configurazione. Prima di usare questa direttiva è necessario specificare quale PIC si sta usando con la direttiva LIST. Ogni famiglia di PIC ha la word di configurazione implementata su indirizzi diversi, per il 16F84 è all indirizzo 2007h. È necessario verificare che il programmatore di PIC sia in grado di leggere correttamente la word dal file.hex e di programmarla correttamente nel PIC. La struttura della word di configurazione è la seguente: bit 13 al bit 4: Code Protection bit (CP) o 1 = CP off. o 0 = CP on su tutta la memoria. bit 3: Power up Timer Enable bit (PWRTE ) o 1 = PWRTE off. o 0 = PWRTE on. bit 2: Watchdog Timer Enable bit (WDTE) o 1 = WDTE on. o 0 = WDTE off. bit 1 e 0: Oscillator Selection bits o 11 = oscillatore RC: oscillatore con circuito RC esterno. o 10 = oscillatore HS: oscillatore con quarzo high speed. o 01 = oscillatore XT: oscillatore con quarzo. o 00 = oscillatore LP: oscillatore con quarzo slow speed. Ipotizzando di programmare il PIC con la protezione del codice disabilitata (CP=1), il power up timer abilitato (PWRTE=0), il Watchdog disabilitato (WDTE=1) e l oscillatore in modo XT (FOSC1=0, FOSC2=1), la word di configurazione assume il valore: 11111111110001b. La direttiva risulta: CONFIG 11111111110001b o CONFIG 3FF1h. 4.2 Definizione di variabili, dati e macro CBLOCK Definisce le variabili del programma assembler. La sintassi per la direttiva CBLOCK è la seguente: CBLOCK < indirizzo di partenza > < variabile 1 > < : offset 1 >.. 28

[< variabile n > < : offset n >] ENDC < indirizzo di partenza > definisce l indirizzo di RAM dal quale iniziare a mappare le variabili, < variabile 1 > < variabile n > indicano i nomi delle variabili e < offset 1 > < offset n > indicano i byte da lasciare tra una variabile e l altra. Se < indirizzo di partenza > non viene messo il compilatore assume come indirizzo di partenza il valore 0h, se non viene messo un offset il compilatore non lascia nessun byte libero tra una variabile e la successiva. Per definire tre variabili si deve scrivere: CBLOCK 0xC ENDC somma num1 : 0x3 num2 Con questa definizione la variabile somma viene mappata all indirizzo Ch, la num1 all indirizzo Dh, e la num2 all indirizzo 10h. Un esempio di programma che usa tre variabili è il seguente: include p16f84.inc radix dec cblock 0xC ; dichiarazione variabili somma som2 endc org 0 ; istruzioni del programma movlw 10 ; W = 10 addlw 5 ; W = W + 5 = 15 movwf somma ; somma = W = 15 decf som2,som2 ; som2 = som2 1 sleep ; PIC in stanby end 29

In questo programma la variabile SOMMA, con dimensione pari a un byte, viene allocata nella RAM all indirizzo Ch, la variabile SOM2 viene allocata all indirizzo Dh. Il programma compilato per accedere alla variabile SOMMA utilizzerà l indirizzo Ch, mentre per SOM2 utilizzerà l indirizzo Dh. DT Riserva una o più word della memoria programma per memorizzare i byte di una stringa di testo (in codifica ASCII) o di un numero. I byte vengono memorizzati come delle istruzioni RETLW K (per ogni byte c è una RETLW): i bit più significativi della locazione contengono il codice operativo dell istruzione, quelli meno significativi il byte da memorizzare. Per leggere uno specifico byte si deve chiamare con una CALL l istruzione RETLW associata a quel byte. Le sintassi per la direttiva DT sono le seguenti: [< label >] DT < byte 0 > [, < byte 1 >,, < byte n >] Alcuni esempi di utilizzo di questa direttiva sono: cfr dt 5 num dt 3h, 67 msg dt Dati di prova, n dt s, k alfan dt 3, Prova, 45h Per leggere i byte memorizzati si deve eseguire una CALL all indirizzo indicato dall etichetta (label) sommando al PCL un indice per scorrere i dati successivi a quello indicato dall etichetta. La struttura del segmento di programma che legge i byte memorizzati deve eseguire una CALL, per ogni byte da leggere, a una subroutine che somma l indice al PCL e che contiene i byte dichiarati con la direttiva DT. Per leggere più byte è necessario un ciclo che incrementi l indice da sommare al PCL e che ripeta la CALL. Un programma tipico è il seguente (n e index sono due variabili): 30 < istruzioni del programma principale > movlw NB ; n = NB = numero di byte da leggere movwf n movlw BL ; index punta al primo byte da leggere (byte BL) movwf index ; se BL = 0 legge il byte 0 ciclo: call dati ; W conterrà il valore del byte n

incf index,f decfsz n goto ciclo ; index punta al prossimo byte da leggere ; se n = 0 finisce la lettura dei byte di alfan < istruzioni del programma principale > dati: ; blocco dei byte memorizzati movf index,w ; W = index addwf PCL,F ; PCL = PCL + index dt byte 0, byte 1,, byte NB-1 < istruzioni del programma principale > Il segmento di programma che legge i byte memorizzati con la DT esegue la CALL alla subroutine DATI che modifica il PCL, sommandogli il valore di INDEX, in modo che punti al byte N (N è la variabile che gestisce il ciclo). I byte sono memorizzati come delle RETLW, che quando sono eseguite, inseriscono nel registro W il valore del byte N e fanno tornare il PIC ad eseguire l istruzione successiva alla CALL che ha chiamato la subroutine DATI. In questo modo si modifica il PCL per leggere il byte voluto ma non si perde il controllo dell esecuzione del programma, perché il suo precedente valore viene salvato nello STACK ed estratto dopo la RETLW. DE Riserva uno o più byte della EEPROM per memorizzare i byte di una stringa di testo (in codifica ASCII) o di un numero. La sintassi per la direttiva DE è la seguente: ORG K [< label >] DE < byte 0 > [, < byte 1 >,, < byte n >] K è una costante che indica l indirizzo della cella di EEPROM nella quale incominciare a scrivere i byte: K = 2100h indica la prima cella. La EEPROM è di 64 byte quindi si deve fare attenzione a non uscire dal campo di indirizzi validi che va da 2100h a 2163h, in altre parole K + n 1 2163h. Con la direttiva ORG K si imposta la scrittura nella EEPROM, altrimenti i byte vengono scritti nella ROM (memoria programma). La LABEL con questa direttiva è inutile perché la EEPROM non è direttamente accessibile se non tramite quattro specifici registri. Alcuni esempi di utilizzo sono: org 2100h de 10h, 67, My program. org 2122h 31

de programma di esempio EQU Definisce una costante, ogni volta che questa viene utilizzata in un istruzione assembler, durante la fase di compilazione, viene sostituita con il valore dichiarato dalla EQU. La sintassi per la direttiva EQU è la seguente: < nome costante > EQU < valore > Ad esempio per definire la costante HIGH pari a 5 si deve scrivere: high EQU 5. MACRO Permette di associare un etichetta (label) a una sequenza di istruzioni assembler e di sostituirle al posto di questa durante la fase di compilazione. La sintassi per definire una macro è la seguente: label MACRO < parametri > < istruzioni > ENDM Per esempio: azzera MACRO bcf PORTB,0 bcf PORTB,1 bcf PORTB,2 ENDM Oppure con passaggio di parametri: azzera MACRO v1,v2 bcf PORTB,v1 bcf PORTB,v2 bcf PORTB,2 ENDM 32

Nel listato del programma l etichetta di riferimento la si deve scrivere come una normale istruzione, nel caso di passaggio di parametri vanno indicati i valori di questi: AZZERA (senza parametri) oppure AZZERA 0,1 (con passaggio di parametri). 4.3 Schema generale di un programma assembler include "p16f84.inc" radix dec FUSES _PWRTE_OFF & _CP_OFF & _WDT_OFF & _XT_OSC cblock 0xC ; Dichiarazione delle variabili endc < variabili del programma > org 0 ; Inizio della memoria programma < istruzioni del programma > sleep ; fine del programma <label_1:> < istruzioni della subroutine 1 > return <label_n:> < istruzioni della subroutine n > return end 33