Capitolo 3 Il microcontrollore PIC16F877: architettura e...

55
Capitolo 3 Il microcontrollore PIC16F877: architettura e periferiche utilizzate 40

Transcript of Capitolo 3 Il microcontrollore PIC16F877: architettura e...

Page 1: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

Capitolo 3

Il microcontrollore PIC16F877:

architettura e periferiche utilizzate

40

Page 2: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

3.1 Architettura

Il microcontrollore PIC16F877 puo presentare diversi tipi di contenitori: PDIP,

PLCC, QFP. La scelta naturalmente e caduta sul package DIP a 40 pins (figura

3.1) che e il meno costoso ed il piu facile da gestire. Le caratteristiche principali di

Figura 3.1: Pin-out del PIC16F877

questo dispositivo sono le seguenti [20]:

tutte le istruzioni hanno un singolo ciclo di clock eccetto rami di programma

che richiedono 2 cicli;

velocita operativa: DC – clock di ingresso a 20MHz

DC – ciclo istruzione 200ns;

fino a 8k x 14 words di Memoria Programma di tipo Flash

fino a 368 x 8 bytes di Memoria Dati (RAM) fino a 256 x 8 bytes di Memoria

Dati di tipo EEPROM;

capacita di gestione interrupt fino a 14 sorgenti;

stack hardware profondo 8 livelli;

modalita di indirizzamento diretto ed indiretto;

41

Page 3: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

reset Power-on (POR);

timer Power-up (PWRT) e Oscillator Stert-up Timer (OST);

timer Watchdog (WDT) con il proprio oscillatore R-C per operazioni affidabili;

protezione del codice programmabile;

funzionamento in modalita SLEEP per il risparmio energetico;

opzioni dell’oscillatore selezionabili;

memorie FLASH e EEPROM in tecnologia C-MOS a bassa potenza e alta

velocita;

In-Circuit Serial Programming attraverso 2 pins, con alimentazione singola a

5V;

il processore puo accedere in lettura e scrittura alla memoria programma;

intervallo di tensione nel quale il dispositivo puo operare: 2.0V – 5.5V;

alta corrente di Sink: 25 mA;

basso consumo energetico:

– <0.6 mA tipici @ 3V, 4MHz;

– 20µA tipici @ 3V, 32 kHz;

– <1µA corrente di standby tipica.

Le caratteristiche delle periferiche del dispositivo sono invece le seguenti:

Timer0: timer/contatore ad 8 bit con prescaler ad 8 bit;

Timer1: timer/contatore a 16 bit con prescaler, puo essere incrementato du-

rante la fase SLEEP attraverso un clock esterno;

Timer2: timer/contatore ad 8 bit con un periodo di regstro di 8 bit, prescaler

e postscaler;

due moduli Capture, Compare, PWM;

– il modulo Capture e di 16 bit, massima risoluzione 12.5 ns;

– il modulo Compare e di 16 bit, massima risoluzione 200 ns;

– massima risoluzione del PWM: 10 bit;

convertitore A/D a 10 bit multicanale;

42

Page 4: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

porta seriale sincrona (Synchronous Serial Port, SSP) con SPI (modo Master)

e I2C (Master/Slave);

porta seriale USART (Universal Synchronous Asynchronous Receiver Tran-

smitter) con indirizzi ad 8 bit piu bit di parita (9 bit totali);

porta parallela PSP (Parallel Slave Port) ad 8 bit, con i controlli esterni RD,

WR e CS (occupando solo i pin 40/44);

circuiteria di rivelazione Brown-out per il reset Brown-out (BOR).

Nella figura 3.2 a pagina seguente e rappresentato lo schema a blocchi dell’ar-

chitettura interna del PIC16F877; verranno spiegate in dettaglio le parti che sono

state fondamentali alla realizzazione di questo progetto. Andro quindi a descrivere

i blocchi principali che compongono il PIC16F877 partendo dalla memoria e dalle

linee di I/O per continuare con le periferiche necessarie ad implementare le funzioni

del nodo di sicurezza integrato: gli interrupt, il convertitore A/D, il modulo USART

ed il modulo MSSP.

3.2 Organizzazione della memoria

La memoria interna al dispositivo si puo immaginare come una sequenza di celle,

chiamate “parole” (words) tutte uguali tra loro e capaci di ospitare codici binari.

Ciascuna delle N parole che formano la memoria e individuata da un indirizzo com-

preso tra 0 e N–1. Tramite l’indirizzo si accede direttamente alla parola per leggerne

o scriverne il contenuto. La parola e la piu piccola unita di informazione indirizzabile

della memoria, la lettura lascia lascia inalterato il contenuto della parola, mentre

una nuova scrittura distrugge la precedente.

La memoria del dispositivo e costituita da tre blocchi principali:

Memoria Programma di tipo FLASH;

Memoria Dati di tipo RAM;

Memoria dati di tipo EEPROM.

Ciascun blocco ha un prorio bus, in modo da potervi accedere separatamente

durante lo stesso ciclo di clock.

43

Page 5: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

Figura 3.2: Schema a blocchi del PIC16F877

44

Page 6: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

3.2.1 Memoria Programma Flash

La memoria programma ospita il programma in codice macchina preposto al funzio-

namrnto del microcontroller. Le celle di questa memoria accettano solo istruzioni ed

eventuali valori costanti (“literal”) ma non i dati variabili che invece trovano posto

nella RAM.

Il microcontrollore inizia l’esecuzione del programma a partire dal “vettore di

reset” (reset vector) ovvero dall’istruzione memorizzata nella prima locazione di

memoria (000h). Dopo aver eseguito questa prima istruzione passa quindi all’i-

struzione successiva memorizzata nella locazione 001h e cosı via. Se non esistesse

nessuna istruzione in grado di influenzare in qualche modo l’esecuzione del program-

ma, il PICmicro arriverebbe presto ad eseguire tutte le istruzioni presenti nella sua

memoria fino all’ultima locazione disponibile. Si hanno pero a disposizione istruzioni

di salto, in grado di modificare il flusso di esecuzione del programma. Durante l’e-

secuzione di queste istruzioni esso utilizza uno speciale registro chiamato Program

Counter la cui funzione e quella di mantenere traccia dell’indirizzo che contiene

la prossima istruzione da eseguire. Questo registro viene incrementato automatica-

mente ad ogni istruzione eseguita per determinare il passaggio alla successiva. Al

momento del reset esso viene azzerato, determinando cosı l’inizio dell’esecuzione a

partire dall’indirizzo 000h. 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 di programma.

La famiglia MCU Middle-Range, della quale fa parte il dispositivo in esame,

hanno un Program Counter a 13 bit capace di indirizzare 8k x 14 bit parole di

memoria programma, infatti la larghezza del bus relativo a questa memoria e di

14 bit. Poiche tutte le istruzioni sono contenute in una parola, un dispositivo con

8k x 14 words di memoria programma ha a disposizione uno spazio sufficiente per

8k istruzioni; questo fa si che sia molto facile stabilire se la program memory puo

contenere il programma per l’applcazione desiderata.

La Program Memory e divisa in 4 pagine di 2k parole ciascuna; gli indirizzi

che delimitano le pagine sono: 0h–7FFh, 800h–FFFh, 1800h–1FFFh. La figua 3.3

mostra la mappa di questa memoria insieme allo stack hardware profondo 8 livelli.

Per saltare attraverso le pagine della Program Memory devono essere modificati

i bit piu significativi del Program Counter (PC) scrivendo il valore desiderato nel-

lo Special Function Register (SFR) PCLATH (Program Counter Latch High); se

vengono eseguiti programmi sequenziali, il PC saltera la pagina senza interventi da

parte dell’utente.

Quando si ha un reset, il Program Counter viene forzato all’indirizzo 0000h

(Reset Vector Address) e viene cancellato il contenuto del registro PCLATH.

Quando viene riconosciuto un interrupt il PC viene forzato all’indirizzo 0004h

45

Page 7: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

Figura 3.3: Mappa della Memoria Programma

46

Page 8: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

(Interrupt Vector Address) ed il PCLATH non risulta modificato. Pero non appe-

na si entra nella “Service Interrupt Routine” (ISR), il suo valore potrebbe essere

riscritto e quindi e necessario salvare il suo contenuto cosı da essere richiamato al

ritorno dall’ISR.

Il Program Counter specifica l’indirizzo dell’istruzione caricare per l’esecuzione,

ed ha una larghezza di 13 bit. Il byte basso e chiamato registro PCL. Il byte alto e

chiamato PCH, contiene i bit PC<12:8> e non e direttamente leggibile e scrivibile a

differenza del PCL: tutti gli aggiornamenti passano attraverso il registro PCLATH.

Quando viene chiamata una istruzione di CALL per effettuare chiamate sou-

broutine, come per la GOTO viene scritto un nuovo indirizzo nel Program Counter;

la differenza sostanziale consiste pero nel fatto che prima di eseguire il salto, il PIC

memorizza in un altro registro speciale, chiamato STACK, l’indirizzo di quella che

dovrebbe essere la successiva istruzione da eseguire se non si fosse incontrata la

CALL.

La memorizzazione degli indirizzi nello stack e di tipo LIFO, in cui l’ultimo

elemento inserito deve essere il primo ad uscire. Grazie a questa caratteristica e

possibile effettuare piu CALL annidate e mantenere sempre traccia del punto in

cui riprendere il flusso al momento che si incontra una istruzione di RETURN. E

importante assicurarsi che ci sia sempre una istruzione RETURN per ogni CALL

per evitare disallineamenti dello stack che in esecuzione possono provocare errori.

Lo Stack del PIC16F877 e ad 8 livelli, percio permette una combinazione di 8

programmi chiamati ed interrotti all’occorrenza, esso contiene l’indirizzo di ritorno

dalle ramificazioni nell’esecuzione del programma principale. Lo spazio dello Stack

non puo far parte di altri programmi o spazio dati ed il puntatore allo Stack non

e accessibile ne in lettura ne in scrittura. Il PC caricato sullo stack quando viene

eseguita una istruzione CALL oppure un interrupt causa una ramificazione del pro-

gramma. Lo stack e invece POPed al verificarsi dell’esecuzione di una istruzione di

RETURN, RETLW o RETFIE; quando esso e PUSHed o POPed il PCLATH non

viene modificato. Dopo che lo stack e PUSHed 8 volte, il nono PUSH sovrascrive

il valore immagazinato nel primo posto della pila, il decimo sovrascrive il secondo

e cosı via. Non ci sono bit di stato che indicano condizioni di overflow o underflow

dello stack.

Per poter indirizzare piu di 2k di memoria programma con gli 11 bit che com-

pongono le istruzione di CALL e GOTO occorre utilizzare altri 2 bit che vengono

presi dal PCLATH<4:3>, e il programmatore deve assicurare che i “bit di selezione

pagina” (page select bits) corrispondano agli indirizzi della Program Memory de-

siderata. Quando invece viene eseguita una istruzione di RETURN l’intero PC a

13 bit viene POPed dallo stack, e percio non e richiesta la manipolazione dei bit

PCLATCH<4:3>.

47

Page 9: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

3.2.2 Memoria RAM

La memoria destinata ai dati e una memoria RAM e contiene due serie di registri,

gli Special Function Register (SFR) e i General Pourpose Register (GPR).

I registri sono destinati all’esecuzione delle operazioni e allo scambio delle in-

formazioni fra la memoria e le altre unita del microcontrollore. I microcontrollori

posseggono un numero limitato di registri, ma considerato che essi fanno parte inte-

grante della RAM, sia dal punto di vista logico che fisico, si puo utilizzare la RAM

per attivarne altri e chiamarli con un nome a piacere.

Gli SFR controllano le operazioni del dispositivo, essi controllano le periferiche

e le funzioni di core, mentre i GPR costituiscono l’area generale per lo stoccaggio di

dati e le operazioni di scratch pad. La memoria dati e divisa in banchi per entrambe

le aree GPR e SFR per permettere di indirizzare piu di 96 byte di RAM General

Pourpose. Per la selezione dei banchi occorrono naturalmente dei bit di controllo

che si trovano nel registro STATUS (STATUS<6:5>, bit RP1 e RP0). La figura

3.4 mostra la mappa di organizzazione della memoria dati. Per muovere un valore

da un registro all’altro bisogna farlo passare attraverso l’accumulatore W, infatti

la differenza tra il registro W e le altre locazioni di memoria consiste nel fatto

che, per referenziarlo, l’unita logico-aritmetica non deve fornire nessun indirizzo di

memoria, ma puo accedervi direttamente. Questo significa che per tutti i movimenti

registro-registro occorrono 2 cicli di istruzione.

I registri GPR sono inizializzati all’accensione del dispositivo (Power-on Reset)

e non sono modificati dagli altri tipi di reset.

Gli SFR sono usati dalla CPU e dai moduli periferici per controllare le operazioni

del dispositivo, e sono implementati come static ram. Essi possono essere classifi-

cati in 2 gruppi, uno associato alle funzioni di “core”, l’altro correlato alle funzioni

periferiche. Qualcuno degli SFR viene inzializzato dal Power-on Reset e dagli altri

reset, mentre gli altri non ne son influenzati.

La Data Memory e partizionata in 4 banchi, ciascuno contiene “General Pourpo-

se Register” e “Special Function Register” e per muoversi attraverso essi, quando si

usa l’indirizamento diretto, bisogna porre i bit RP0 RP1 nella configurazione corri-

spondente al banco desiderato (tabella 3.1) Ciascun banco si estende per 128 byte,

le locazioni piu basse sono riservate agli SFR mentre quelle alte ai GPR. Alcuni SFR

che richiedono un elevato uso sono specchiati dal banco 0 in tutti gli altri in modo

da ridurre il codice e velocizzare l’accesso.

L’indirizzamento indiretto e un modo di indirizzare la memoria dati in cui l’in-

dirizzo di memoria nell’istruzione non e fisso. Un SFR viene usato come puntatore

alla locazione che bisogna leggere o scrivere, e poiche il puntatore e in RAM il con-

48

Page 10: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

Figura 3.4: Mappa della Memoria RAM

49

Page 11: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

RP1:RP0 Bank

00 0

01 1

10 2

11 3

Tabella 3.1: Bit di selezione dei banchi di memoria

tenuto puo essere modificato dal programma per per creare ad esempio tabelle dove

memorizzare dati. L’indirizzamento indiretto e possibile usando il registro INDF.

Ogni istruzione che utilizza INDF accede realmente al registro puntato dal “File

Select Register”, FSR. Leggendo indirettamente lo stesso registro INDF (FSR=0)

si leggera 00h, invece scrivendo indirettamente su di esso si esegue una operazione

nulla benche possono essere influenzati i bit di stato.

Concatenando il bit IRP (STATUS <7>) agli 8 bit di FSR e possibile avere un

indirizzamento a 9 bit.

3.2.3 Memoria Dati EEPROM

La EEPROM Data Memory e leggibile e scrivibile durante le normali operazioni.

Essa non e direttamente mappata nello spazio dei register file, e invece indirzzata

indirettamente attraverso gli Special Function Register. Per leggere e scrivere su

questa memoria vengono usati 4 SFR:

EECON1;

EECON2;

EEDATA;

EEADR.

EEDATA mantiene gli 8 bit del dato per la lettura e la scrittura, EEADR trat-

tiene l’indirizzo della locazione EEPROM attualmente acceduta. Il registro ad 8 bit

EEADR puo accedere a 256 locazioni di Data EEPROM.

Il registro EEADR puo essere pensato come un registro di indirizzamento indi-

retto della EEPROM. EECON1 contiene i bit di controllo, mentre EECON2 e usato

per iniziare il read/write. Il range di indirizzi comincia sempre da 0h e comprende

l’intera memoria disponibile.

La EEPROM Data memory permette di leggere e scrivere byte, un byte scritto

cancella automaticamente la locazione e scrive il nuovo dato (cancella prima di scri-

vere). Il tempo di scrittura e controllato da un timer on-chip, il write-time variera

50

Page 12: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

con la tensione e la temperatura come pure da chip a chip.

Il registro EEADR puo indirizzare fino ad un massimo di 256 bytes. I bit di

indirizzo sono decodificati, percio devono sempre essere a ‘0’ per assicurare che

l’indirizzo si trova nello spazio di memoria della Data EEPROM.

EECON1 e un registro di controllo i cui 5 bit piu bassi non son fisicamente

implementati. I tre bit piu alti non sono implementati e in letttura danno ‘0’. I

bit di controllo RD e WR iniziano la lettura e la scrittura rispettivamente. Essi

non possono essere cancellati ma solo settati via software. Vengono resettati via

hardware alla fine dell’operazione di lettura o di scrittura.

Il bit WREN,che viene resettato all’accensione, permettera l’operazione di scrit-

tura una volta settato.

Il bit WRERR viene settato quando una operazione di scrittura e interrotta da

un reset MCLR o da un reset tme-out WDT durante il normale funzionamento. In

queste situazioni, seguenti il reset, il programmatore puo controllare il bit WRERR

e riscrivere la locazione; il dato e l’indirizzo non saranno modificati nei registri

EEDATA e EEADR.

Il bit di flag interrupt EEIF viene settato quando la scrittura e completa, e dovra

essere resettato via software.

Il registro EECON2 non e un registro fisico, leggendo il suo contenuto si otterra

‘0’. Viene usato esclusivamente nelle sequenze di scrittura Data EEPROM.

Per leggere una locazione nella Data Memory, il programmatore deve scrivere l’in-

dirizzo nel registro EEADR e quindi settare il bit di controllo RD (EECON1<0>).

Il dato sara disponibile nel ciclo di istruzione successivo, nel registro EEDATA; per-

cio puo essere letto nell’istruzione seguente. EEDATA manterra questo valore fino

ad un’altra lettura o fino a che il programmatore non lo sovrascrivera (durante una

operazione di scrittura).

Per scrivere una locazione nella EEPROM, bisogna per prima cosa scrivere l’in-

dirizzo nel registro EEADR ed il dato nel registro EEDATA, e iniziare una specifica

sequenza per iniziare la scrittura di ogni byte. La scrittura non iniziera se la sequen-

za non e eseguita correttamente (scrivere 55h in EECON2, scrivere AAh in EECON2

e settare il bit WR) per ciascun byte. Bisogna inoltre disabilitare gli interrupt du-

rante questo segmento di codice, ed il bit WREN di EECON1 deve essere settato

per abilitare la scrittura in modo da prevenire scritture accidentali nella EEPROM

dovute ad una esecuzione sbagliata del codice.

Il programmatore potrebbe lasciare resettato il bit WREN, eccetto quando si

aggiorna la memoria. Il bit WR non viene cancellato via hardware. Dopo che una

sequenza di scrittura e stata iniziata, cancellando il bit WREN non si influenza il

ciclo di scrittura e WR sara inibito a meno che il bit WREN non sia settato.

51

Page 13: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

Alla fine del ciclo di scrittura, il bit WR viene cancellato via hardware e viene

settato il “EE Write Complete Interrupt Flag Bit” (EEIF), il programmatore puo

abilitare questo interrupt o interrogare questo bit. EEIF deve essere cancellato via

software.

Per proteggere la EEPROM contro scritture spurie possono essere messi in atto

vari meccanismi. All’accensione WREN e cancellato. Anche il Power-up-time (72

ms di durata) previene scritture sulla EEPROM. La “write initiate sequence” e il

bit WREN aiutano entrambi a prevenire scritture accidentali durante brown-outs,

glitchers dell’alimentazione e malfunzionamento software.

Il modulo Data EEPROM non ha una sequenza di inzializzazione come altri

moduli ma, come per la RAM general pourpose e buona idea inizializzare tutte le

locazioni della data EEPROM con uno stato conosciuto.

Per interfacciare il µC con il mondo esterno e opportuno soffermarsi sulle linee

di I/O, il cui funzionamento e descritto nel paragrafo successivo.

3.3 Porte I/O

Il PIC16F877 dispone di un totale di 33 linee di I/O organizzate in 5 porte denomi-

nate PORTA, PORTB, PORTC, PORTD, PORTE.

La PORTA dispone di 5 linee configurabili sia in ingresso che in uscita identificate

dalle sigle RA0, RA1, RA2, RA3, RA4; La PORTB dispone di 8 linee anch’esse

configurabili sia in ingresso che in uscita identificate dalle sigle RB0, RB1, RB2,

RB3, RB4, RB5, RB6, RB7; anche la PORTC e una porta di I/O bidirezionale

i cui pin sono indicati come RC7:RC0; la PORTD invece puo essere configurata

come porta I/O opuure come porta parallela slave per interfacciarsi con il bus di un

microprocessore; infine la PORTE e costituita di tre linee RE2:RE0.

La suddivisione delle linee in piu porte e dettata dai vincoli dell’architettura

interna del dispositivo che prevede la gestione di dati di lunghezza massima pari ad

8 bit.

Per la gestione delle linee di I/O da programma, il PIC dispone di 2 registri inter-

ni per ogni porta chiamati TRISA e PORTA per la porta A, TRISB e PORTB

per la porta B e cosı via per le altre porte. I registri TRIS determinano il funziona-

mento in ingresso o in uscita di ogni singola linea, i registri PORT determinano lo

stato delle linee in uscita o riportano lo stato delle linee in ingresso. Ognuno dei bit

contenuti in questi registri corrisponde univocamente ad una linea di I/O.

I pin di uso generale possono essere considerati come le piu semplici periferiche.

Essi permettono al PICmicro di controllare e monitorare altri dispositivi. Per ag-

52

Page 14: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

giungere funzionalita e flessibilita al dispositivo, alcuni pin sono multiplexati con

funzioni alternative. Queste funzioni dipendono da quali periferiche sono implemen-

tate nel dispositivo. In generale quando e attiva una periferica il pin corrispondente

non puo essere usato come un I/O generico.

Per la maggior parte delle porte, la direzione di I/O del pin (ingresso o uscita) e

controllata dal registro TRIS, data direction register. Il registro TRIS<X> controlla

la direzione di PORT<X>. Un ‘1’ nel TRIS fa si che la linea corrispondente sia un

ingresso, mentre uno ‘0’ la seleziona come uscita.

La figura seguente (figura 3.5) mostra una tipica porta di ingresso uscita. Questo

Figura 3.5: Tipica porta I/O

schema non comprende funzioni periferiche che possono essere multiplexate sul pin

di I/0. Leggendo il registro PORT si legge lo stato del pin mentre scrivendo su di

esso si scrivera il flip-flop latch della porta. Tutte le operazioni di scrittura (come

53

Page 15: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

le istruzioni BCF e BSF ) sono delle operazioni di read-modify-write, percio una

scrittura su una porta implica che il pin sia letto, il suo valore modificato, e quindi

scritto sul F/F “port data latch”.

Quando le funzioni periferiche sono multiplexate verso un pin di I/O generico,

la funzionalita del pin cambia per far fronte alle richieste del modulo periferico. Un

esempio ne e il modulo convertitore A/D, che forza il pin alla funzione perferica

quando il dispositivo viene resettato. I pin PORT possono essere multiplexati con

ingressi analogici e tensioni analogiche di riferimento (VREF ). L’operazione di cia-

scuno di questi pin e selezionata, per essere un ingresso analogico o un I/O digitale,

settando o resettando il bit di controllo nel registro ADCON1 (A/D Control Regi-

ster). Quando e selezionato come un ingresso analogico, questo pin sara letto come

‘0’. I registri TRIS controllano la direzione del pin, anche quando esso e usato come

ingresso analogico.

Nella porta A il pin RA4 e un ingresso a Trigger Di Schmitt e un uscita open

drain, tutti gli altri pin della porta hanno livelli di ingresso TTL e dei drivers di

uscita CMOS. Tutti i pin hanno bit di direzione dato (registri TRIS) che li possono

configurare come ingresso o come uscita. Settando un bit del registro TRISA si pone

il corrispondente driver di uscita in modalita ad alta impedenza. Resetando il bit,

invece, viene messo il contenuto del latch di uscita sul pin selezionato.

La porta B e una porta bidirezionale di 8 bit, ed il corrispondente registro di

direzione dati e TRISB. Anche qui settando un bit del registro TRISB si pone il

corrispondente driver di uscita nella modalita di ingresso ad alta impedenza; mentre

mettendo il bit a ‘0’ il contenuto del latch di uscita passa sul pin selezionato.

Ogni pin della porta B ha internamente un transistor di weak pull-up, cancellando

un singolo bit di controllo, il bit RBPU (OPTION<7>), e possibile accendere tutti i

pull-up. Il weak pull-up viene automaticamente spento quando la porta e configurata

come uscita. I pull-up sono disabilitati all’accensione dal “Power-on Reset”.

Quattro pin della porta B, RB7:RB4, hanno una caratteristica di interrupt su

cambiamento di stato. Soltanto i pin configurati come ingressi possono causare un

interrupt, ad esempio se qualche pin tra RB7:RB4 e configurato come un uscita viene

escluso dal confronto dell’interrupt sul cambiamento di stato. I pin di ingresso (tra

RB7:RB4) vengono comparati con il vecchio valore accumulato dall’ultima lettura

di PORTB, il disaccoppiamento prodotto da questa comparazione e mandato su

una porta OR per generare il RB Port Change Interrupt con il bit di flag RBIF

(INTCON<0>).

L’interrupt puo svegliare il dispositivo dallo SLEEP, cioe farlo tornare attivo

uscendo dalla modalita di funzionamento a basso consumo di potenza. Il pro-

grammatore, nell’interrupt service routine, puo cancellare l’interrupt nalla seguente

maniera:

54

Page 16: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

a) una lettura o una scrittura sulla PORTB terminera la condizione di disacco-

piamento;

b) cancellando il bit RBIF.

Una condizione di disaccoppiamento continuera a settare il bit di flag RBIF, ma

leggendo il registro PORTB esso terminera, e RBIF potra essere resettato.

Anche la porta C e cosituita di 8 linee bidirezionali. Ciascun pin e individual-

mente configurabile come ingresso o uscita tramite il registro TRISC. I pin della

porta C hanno in ingresso un buffer Trigger di Schmitt.

Quando si abilitano le funzioni periferiche, bisogna definire i bit del registro TRIS

per ogni pin della porta. Infatti alcune periferiche controllano i bit TRIS rendendo

i pin corrispondenti delle uscite, altre perferiche settano, invece, i pin come ingressi.

La porta D ha le stesse caratteristiche della C, ma puo essere configurata come

una porta microprocessore di 8 bit (parallel slave port) settando il bit di controllo

PSPMODE (TRISE<4>). In questo modo i buffer in ingresso sono di tipo TTL.

La porta E possiede tre pin (RE0/RD/AN5, RE1/WR/AN6 e RE2/CS/AN7)

che sono individualmente configurabili come ingressi o uscite, ed ed hanno in ingresso

un buffer Trigger di Schmitt. I pin della porta E sono multiplexati con ingressi

analogici, e quando vengono selezionati come tali, in lettura danno ’0’. Il registro

TRISE controlla la direzione dei pin RE, anche quando vengono usati come ingressi

analogici; ed in questo caso l’operatore deve assicurare che siano degli ingressi. Un

reset di accensione configura i pin come ingressi digitali.

Quando il bit PSPMODE (TRISE<4>) e settato, I pin della porta E comincia-

no il controllo degli ingressi I/O per la porta microprocessore. In questa modalita

l’utente deve assicurarsi che i bit TRISE<2:0> siano settati, e che essi siano confi-

gurati come ingressi digitali. Bisogna anche assicurare che il registro ADCON1 sia

configurato per I/O digitali, cosı che i buffer di ingresso siano TTL.

3.4 Gli Interrupt

L’interrupt e una particolare caratteristica dei microprocessori in generale che con-

sente di intercettare un evento esterno, interrompere momentaneamente il program-

ma in corso, eseguire una porzione di programma specializzata per la gestione del-

l’evento verificatosi e riprendere l’esecuzione del programma principale. Ci sono

infatti eventi che puo far comodo rilevare in un qualsiasi momento dell’esecuzione

del programma, come ad esempio l’arrivo di una comunicazione seriale, l’overflow di

55

Page 17: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

un timer, oppure un fronte su di un pin. In questi casi entrano in gioco gli interrupt:

ad un preciso evento richiesto, il controllore interrompe quello che stava facendo e

passa ad una “subroutine di interrupt”. Nel caso della seriale, tale subroutine si

incarichera di ricevere correttamente il byte trasmesso dall’esterno. Al termine della

routine di interrupt il programma riprende dal punto in cui era stato lasciato.

Il PIC16F877 ha fino a 14 sorgemti di interrupt [21]:

il cambiamento di stato sulla linea RB0 (external interrupt, INT Pin Inter-

rupt);

la fine del conteggio del registro TMR0 (TMR0 Overflow Interrupt);

il cambiamento di stato su una delle linee da RB4 a RB7 (PORTB Change

Interrupt);

il cambamento di stato del modulo Comparatore (Comparator Change Inter-

rupt);

interrupt sulla porta parallela (Parallel Slave Port Interrupt);

interrupt sulla porta seriale (USART Interrupt);

Receive Interrupt ;

Transmit Interrupt ;

la fine di una conversione A/D (A/D Conversion Complete Interrupt);

interrupt sul modulo LCD (LCD Interrupt);

la fine della scrittura su una locazione EEPROM (Data EEPROM Write

Complete Interrupt);

la fine del conteggio del timer TMR1 (Timer1 Overflow Interrupt);

interrupt sul modulo Capture/Compare (CCP Interrupt);

interrupt sulla porta seriale sincrona (SSP Interrupt).

Qualunque sia l’evento abilitato, al suo manifestarsi il PIC interrompe l’esecu-

zione del programma in corso, memorizza automaticamente nello STACK il valore

corrente del PROGRAM COUNTER e salta all’istruzione presente nella locazione

di memoria 0004h denominata Interrupt Vector. E a questo punto che nel codi-

ce bisogna inserire la subroutine di gestione degli interrupt denominata Interrupt

Handler. Potendo abilitare piu interrupt, tra i primi compiti dell’interrupt handler

56

Page 18: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

e la verifica di quale, tra gli eventi abilitati, ha generati l’interrupt e l’esecuzione

della parte di programma relativo.

Questo controllo puo essere effettuato utilizzando gli interrupt flag. Siccome

qualunque interrupt genera una chiamata alla locazione 0004h, nel registro INTCON

sono presenti dei flag che indicano qual’e l’evento che ha generato l’interrupt, ad

esempio:

INTF (INTCON<1>), se vale ‘1’ l’interrupt e stato generato dal cambiamento

di stato sulla linea RB0 (IntPin Interrupt);

TOIF (INTCON<2>), se vale ‘1’ l’interrupt e stato generato al termine del

conteggio del TMR0 (RB Port Change Interrupt);

RBIF (INTCON<0>), se vale ‘1’ l’interrupt e stato generato dal cambiamento

di stato di una delle linee RB7:RB4 (TMR0 Overflow Interrupt).

Esso contiene anche il bit di abilitazione degli interrut periferici (PEIE, Periphe-

ral Interrupt Enable bit), che abilita o disabilita l’interrupt periferico dal vectoring

quando viene rispettivamente settato o azzerato.

Lo schema logico degli interrupt del PIC16F877 e mostrato nella figura 3.6.

Il bit di abilitazione globale degli interrupt, (GIE, Global Interrupt Enable, INT-

CON<7>), abilita se settato, o disabilita, se resettato, tutti gli interrupt; esso viene

inizializzato a ‘0’ da un reset. La disabilitazione individuale di ciascun interrupt puo

essere fatta agendo sui bit corrispondenti del registro INTCON.

Una vista dettagliata dei bit di questo registro e la descrizione delle loro funzioni

si possono vedere in figura 3.7. 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 e gia in esecuzione un interrupt handler.

Per poter ritornare al programma principale e reinizializzare a ‘1’ questo bit occorre

utilizzare l’istruzione di “ritorno da un interrupt” (RETFIE), che permette cosı di

eseguire tutti gli interrupt sospesi.

Non appena nell’interrupt service routine la sorgente dell’interrupt determinata

dal polling dei flag di interrupt. Generalmete i bit di flag devono essere cancellati

dall software prima di riabilitare l’interrupt globale, onde evitare interrupt ricorsivi.

I flag individuali vengono settati senza tener conto dei corrispondenti bit maschera

o del bit GIE.

Quando viene eseguita una istruzione che cancella il bit GIE, ogni interrupt che

era in sospeso per l’esecuzione nel prossimo ciclo viene ignorata. La CPU eseguira

una NOP (nessuna operazione) nel ciclo immediatamente seguente l’istruzione che

cancella il bit GIE. Gli interrupt che erano stati ignorati sono ancora in sospeso per

essere serviti quando il bit GIE viene settato di nuovo.

57

Page 19: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

Figura 3.6: Logica degli Interrupt [20]

58

Page 20: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

Figura 3.7: Registro INTCON [20]

59

Page 21: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

Siccome il dispositivo ha degli interrupt sulle periferiche ci sono altri registri, ol-

tre al INTCON che li abilitano e che ne mantengono lo stato dei i flag: PIE1, PIE2,

PIR1, PIR2. A seconda del numero di sorgenti di interrupt periferici ci possono

essere piu Peripheral Interrupt Enable register (PIE1, PIE2). Essi contengono i bit

di abilitazione individuale, per gli interrupt periferici. Per abilitare gli interrupt

periferici deve essere resettato il bit PEIE nel registro INTCON.

La coppia di registri Peripheral Interrupt Flag (PIR1, PIR2) contengono i bit

di flag individuali per gli interrupt periferici. I bit di flag interrupt vengono settati

quando si verifica una condizione interrupt, senza tener conto dello stato dei corri-

spondenti bit di abilitazione o del GIE (INTCON<7>). Per questo il programma

dovrebbe assicurare che gli appropriati bit di flag siano cancellati (dal software) pri-

ma di abilitare un interrupt e dopo averlo servito.

La latenza di interrut e definita come il tempo che passa da un evento che genera

l’interrupt (quando il bit di flag viene settato) ed il momento in cui l’istruzione passa

all’indirizzo 0004h comincia l’esecuzione (quando questo interrupt e abillitato) [21].

Per gli interrupt sincroni (tipicamente interni) la latenza e di 3TCY . Per gli inter-

rupt asincroni (tipicamente esterni), come l’INT o i Port B Change Interrupt, la

latenza sara di 3÷ 3.75TCY (ciclo istruzione). La latenza esatta dipende da quando

si verifica l’evento dell’interrupt n relazione al ciclo istruzione.

L’interrupt esterno sul pin INT e triggerato sul fronte: sia su quello di salita se il

bit INTEDG (OPTION REG<6>) e settato, oppure di discesa se INTDG e cancel-

lato. Quando un fronte valido appare sul pin INT, il bit di flag INTF (INTCON<1>)

viene settato. Questo interrupt puo essere abilitato o disabilitato settando o cancel-

lato, rispettivamente, il bit di abilitazione INTE (INTCON<4>). Il bit INTF deve

essere cancellato via software nell’ interrupt service routine prima di riabilitarlo.

L’interupt INT puo svegliare il processore dallo SLEEP, se il bit INTE era settato

prima di entrare nello SLEEP.

Durante un interrupt, sltanto il valore del PC e salvato nello stack. Di solito i

programmatori possono voler salvare dei registri particolari durante un interrupt,

ad esempio il registro W o lo STATUS. L’azione d salvataggio dell’informazione

e comunemete chiamata PUSHing, mentre l’azione di richiamo prima del return e

detta POPing. Queste (PUSH e POP) non son istruzioni mnemoniche ma azioni

concettuali. Esse possono essere implememntati da una sequenza di istruzioni. Per

una comoda modularita del codice le linee che la implementano possono essere scritte

dentro delle macro.

60

Page 22: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

3.5 Il convertitore A/D

Una delle periferiche piu importanti dei PIC e quella relativa al convertitore A/D

(Analogico/Digitale). Il PIC 16F877 ha 8 ingressi analogici che permettono la con-

versione di un segnale di ingresso analogico, il cui valore oscilli tra 0 e VDD oppure

tra 0 ed una tensione esterna di riferimento, in un corrispondente numero digitale

a 10 bit. Essendo presente un solo modulo convertitore, gli ingressi devono essere

multiplexati da una logica interna, l’uscita del multiplexer viene inviata ad un cir-

cuito di sample and hold che a sua volta pilota il vero e proprio convertitore, che

genera il risultato per approssimazioni successive, come si puo notare in figura 3.8

e 3.11 . La figura 3.8 mostra il diagramma a bloccghi del modulo A/D. Il segnale

Figura 3.8: Diagramma a blocchi del modulo A/D

61

Page 23: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

viene comparato con la meta della tensione di riferimento e, se maggiore, il bit MSB

del risultato viene posto a ‘1’; viceversa se il segnale risulta minore, tale bit e posto

a zero. La comparazione successiva viene eseguita con la tensione di riferimento

ridotta ad un quarto ed il bit interessato e il MSB-1 ovvero il bit 8. Si procede in

questo modo (dimezzando ogni volta la tensione di comparazione) fino ad arrivare

all’LSB (bit 0). Con tale procedimento il tempo, per qualsiasi conversione e ben

definito ed equivale al tempo di 10 comparazioni. Quindi se il segnale in ingresso

vale 1 oppure 4 V il tempo di conversione sara lo stesso.

La tensione di riferimento analogica e selezionabile dal software tra la tensione

di alimentazione positiva e negativa (VDD e VSS) e il livello sui pin VREF (VREF+

sul pin AN3 e VREF− su AN2). Il convertitore A/D ha la caratteristica di poter

operare quando il dispositivo e in modalita SLEEP, a patto di aver settato il clock

A/D come derivato dall’oscillatore RC interno al convertitore.

Il modulo A/D possiede 4 registri [20]:

A/D Result Hig register (ADRESH);

A/D Result Low register (ADRESL);

A/D Control register 0 (ADCON0);

A/D Control register 1 (ADCON1).

Il registro ADCON0 controlla le operazioni del modulo A/D, mentre il registro

ADCON1 configura le funzioni dei pin della porta A; questi pin possono essere

configurati come ingressi analogici (RA3 puo essere anche un riferimento di tensione)

o come I/O digitali.

I registri ADRESH e ADRESL contengono il risultato a 10 bit della conversio-

ne A/D. Quando essa e completa il risultato viene caricato nella coppia di registri

A/D result, il bit GO/DONE (ADCON0<2>) viene cancellato e il bit di flag del-

l’interrupt A/D, ADIF, viene settato. L’insieme dei registri e dei bit associati alla

conversione analogico/digitale e riportato nella figura 3.9

Il canale di ingresso analogico deve avere il corrispondente bit del registro TRIS

selezionato come ingresso. Dopo che il modulo A/D e stato configurato, prima che

inizi la conversione deve essere acquisito il canale selezionato, e dopo che e passato il

tempo di acquisizione puo cominciare la conversione A/D che dovrebbe essere svolta

secondo i passi elencati di seguito [21]:

1. configurare il modulo A/D;

configurare i pin analogici, la tensione di riferimento e gli I/O digitali

(ADCON1);

selezionare i canali di ingresso A/D (ADCON0);

62

Page 24: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

Figura 3.9: Registri e bit associati al modulo A/D

selezionare il clock di conversione A/D (ADCON0);

accendere il modulo A/D (ADCON0);

2. configurare gli interrupt A/D;

cancellare il bit ADIF;

settare il bit ADIE;

settare il bit PEIE;

settare il bit GIE

3. aspettare il tempo di acquisizione richiesto;

4. inizio conversione;

settare il bit GO/DONE (ADOCON0);

5. aspettare il completamento della conversione A/D da uno dei seguenti eventi:

polling per controllare la cancellazione del bit GO/DONE, oppure

aspettare che si verifichi un interrupt A/D;

6. leggere il risultato della conversione nella coppia di registri ADRESH:ADRESL,

cancellare il flag ADIF se richiesto;

7. per la prossima conversione si puo tornare al passo 1. o al passo 2. a seconda

della necessita. Il tempo di conversione per ogni bit e definito come TAD.

63

Page 25: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

Prima che cominci la prossima acquisizione e richiesto un minimo di attesa di

2TAD .

La figura 3.10 mostra la sequenza di conversione e i tempi usati. Il tempo di

Figura 3.10: Cicli TAD nella conversione A/D

acquisizione e il tempo per cui il condensatore di holding del modulo A/D e connesso

al livello di tensione esterno. C’e poi il tempo di conversione di 12 TAD, che e

l’intervallo tra il settaggio del bit GO e la fine della conversione. La somma di

questi due tempi rappresenta il tempo di campionamento.

Per avere la precisione specificata del convertitore A/D bisogna che al condensa-

tore di tenuta di carica CHold sia permesso di caricarsi completamente al livello della

tensione di imgresso (figura 3.11). A questo proposito si possono fare le seguenti

Figura 3.11: Modello dell’ingresso analogico

considerazioni:

64

Page 26: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

l’impedenza della sorgente analogica e quella interna di campionamento (RSS)

influiscono direttamente sul tempo richiesto per caricare CHold;

la resistenza massima raccomandata per una sorgente analogica e 10 kW;

il tempo di acquisizione diminuisce con RS;

l’impedenza di switch RSS varia con la tensione di alimentazione VDD.

Dopo aver selezionato il canale d’ingresso analogico l’acquisizione deve essere

fatta prima di cominciare la conversione, per stabilirne la durata minima puo essere

usata l’equazione della figura 3.12. Essa assume che si utlizza un errore di 1/2 LSB

Figura 3.12: Calcolo del tempo di acquisizione

(1024 passi per la conversione) che e il massimo errore permesso perche la conver-

sione incontri la risoluzione specificata.

Il tempo di conversione A/D di ogni bit e indicato come TAD quindi la conversione

a 10 bit richiede un tempo pari a 11.5∗TAD per essere portata a termine. La sorgente

del clock di conversione A/D e selezionabile via software tra le 4 possibili scelte

appresso elencate:

2TOSC ;

8TOSC ;

32TOSC ;

oscillatore RC interno.

Per una corretta conversione il clock di conversione A/D (TAD) deve essere selezio-

nato per assicurare un minimo TAD di 1.6 µs. La figura 3.13 mostra il tempo TAD

risultante derivato dalla frequenza del dispositivo e dal clock A/D selezionato.

65

Page 27: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

Figura 3.13: TAD corrispondente alla frquenza operativa del dispositivo

I registri ADCON1 e TRIS controllano le operazioni dei pin della porta A/D,

i pin che si vuole configurare come ingressi analogici devono avere i corrispondenti

bit del registro TRIS settati (ingresso) perche se essi sono a ‘0’ verra convertito il

livello digitale di uscita (VOH oppure VOL).

Per cominciare una conversione abbiamo detto che deve essere settato il bit

GO/DONE, ma cio non puo avvenire nella stessa istruzione che accende l’A/D, a

causa del tempo di acquisizione richiesto. Se invece si cancella GO/DONE durante

la conversione questa verra interrotta, la coppia di registri che contiene il risulta-

to della conversione non sara aggiornato con quella parziale. ADRESH:ADRESL

continueranno a contenere l’ultimo valore completo o l’ultimo valore scritto in essi.

Dopo l’interruzione della conversione bisogna aspettate 2TAD prima di cominciare

una nuova acquisizione. Dopo 2TAD l’acquisizione sul canale selezionato comincia

automaticamente.

La coppia di registri ADRESH:ADRESL rappresentano la locazione dove viene

caricato il risultato a 10 bit della conversione A/D, essi hanno una larghezza com-

plessiva di 16 bit. Il modulo A/D da la flessibilita di giustificare a sinistra o a destra

i 10 bit del risutato nei 16 bit del registro risultato a seconda del valore del bit “A/D

Format Select” (ADFM). La figura 3.14 mostra l’operazione della giustificazione del

risultato A/D. I bit extra vengono caricati come ‘0’. Quando l’A/D e disabilitato

questi registri possono essere usati come registri di uso generale.

Il modulo A/D puo operare durante la modalita SLEEP, ma si richiede che la

sorgente del clock A/D sia settata su RC (ADCS1:ADCS0=‘11’). Con questa opzio-

ne il modulo A/D aspetta un “ciclo istruzione” prima di cominciare la conversione

in modo da permettere alla istruzione SLEEP di essere eseguita. La conversione

durante lo SLEEP fa si che vengano eliminati tutti i rumori interni di switching.

66

Page 28: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

Figura 3.14: Giustificazione del risultato [20]

Quando la conversione e completata il bit GO/DONE sara cancellato, e il risulta-

to caricato nel registro ADRES. Se l’interrupt A/D e abilitato, il dispositivo verra

svegliato dallo SLEEP altrimenti, il modulo A/D verra allora spento, sebbene il bit

ADON rimarra settato. Quando la sorgente del clock A/D non e RC una istru-

zione di SLEEP causa l’interruzione della conversione corrente e lo spegnimento

del modulo A/D (per risparmiare energia), sebbene il bit ADON rimarra settato.

Per permettere la conversione durante lo SLEEP bisogna assicurarsi che l’istruzione

SLEEP stia immadiatamente dopo quella che setta il bit GO/DONE.

In sistemi dove la frequenza del dispositivo e bassa, e preferito l’uso del clock

RC mentre a frequenze medie o alte, TAD puo essere derivato dall’oscillatore del

dispositivo. L’errore assoluto del convertitore, cioe la massima deviazione di una

transizione reale rispetto ad una transizione ideale per ogni codice, include la somma

di tutti i contributi: errore di quantizzazione, errore di non linearita integrale, errore

di non linearita differenziale, errore di fondo scala, errore di off–set.

L’errore assoluto del convertitore A/D e specificato esserre < ±1LSB per VDD =

VREF , ma comunque la precisione del convertitore A/D diminuisce al divergere di

VDD da VREF . Per un dato intervallo di tensioni di ingresso, il codice digitale di

uscita sara lo stesso. Questo e dovuto alla quantizzazione dell’ingresso analogico in

un codice digitale. L’errore di quantizzazione e tipicamente di 1/2 LSB ed e innato

al processo di conversione analogico/digitale; la sola strada per ridurlo e quella di

incrementare la risoluzione.

L’errore di off-set e la differenza tra la tensione ideale di ingresso relativa a 1/2

LSB e quella reale che invece provoca la transizione tra 0 e il primo LSB [11]. Gli

errori di off-set traslano l’intera funzione di trasferimento.

67

Page 29: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

L’errore di guadagno e la differenza tra la tensione ideale di ingresso che dovrebbe

generare un codice uguale al fondo scala e il vero valore che invece genera tale codice.

Questo errore altera la pendenza della curva di risposta reale rispetto a quella ideale

[11]. La differenza tra l’errore di guadagno e l’errore di fondo scala e che l’errore

full-scale non tiene conto dell’errore di off-set.

L’errore di non linearita si riferisce all’uniformita del cambiamento del codice.

Errori di non linearita possono essere calibrati fuori dal sistema.

L’errore di non linearita integrale misutra la transizione reale del codice contro

la transizione del codice adattata dall’errore di guadagno per ogni codice. La non

linearita differenziale e la massima deviazione, espressa in LSB, che si puo avere

rispetto alla transizione ideale del codice. Se la differenza e maggiore di ±1 LSB si

ha la perdita del codice di uscita [11].

Se la tensione di ingresso eccede i valori limite (VDD o VSS) per piu di 0.3 V,

allora la precisione della conversione e fuori dalle specifiche. A volte aggiunto un

filtro RC esterno con funzione di anti-aliasing. La resistenza R puo essere seleziona-

ta per assicurare che l’impedenza totale della sorgente sia mantenuta sotto i 10 kWraccomandati dalle specifiche. Ogni componente esterno connesso (attraverso alta

impedenza) ad un pin di ingresso analogico (condensatore, diodo zener, ecc.) deve

avere una corente di perdita (leakage) sul pin molto piccola.

La funzione di trasferimento ideale del convertitore A/D e definita come segue:

la prima transizione si ha quando la tensione di ingresso analogica (VAIN) e 1 LSB

(o VREF analogica/1024). Sia quella ideale che quella reale sono mostrate in figura

3.15

3.6 Modulo USART

Il modulo Universal Synchronous Asynchronous Receiver Transmitter (USART), co-

nosciuto anche come Serial Communication Interface (SCI), e uno dei due moduli

di I/O seriale che possiede il PIC16F877. Le modalita di funzionamento della perfe-

rica sono le seguenti: asincrona full-duplex (per comunicare con terminali dispositivi

periferici quali terminali CRT e PC), sincrona-master half-duplex e sincrona-slave

half-duplex (per comunicare con periferiche come circuiti intedrati A/D e D/A o

EEPROM seriali ecc.). I registri che controllano la trasmissione, la ricezione e lo

stato della periferica USART sono il TXSTA e il RCSTA, la cui funzioni sapecifiche

sono riportate nella figure 3.16 e 3.17. Per selezionare il funzionamento dei pin

RC6/TX/CK e RC7/RX/DT del PIC come USART devono essere settati i bit SPEN

(RCSTA<7>) e TRISC<7:6>. La possibilita di funzionamento full-duplex deriva

dal fatto che sono contemporaneamente presenti due sezioni, una per la trasmissione

68

Page 30: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

Figura 3.15: Funzione di trasferimento del convertitore A/D [20]

69

Page 31: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

Figura 3.16: Registro TXSTA [20]

70

Page 32: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

Figura 3.17: Registro RCSTA [20]

71

Page 33: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

ed una per la ricezione con un unico componenete in comune: il generatore di baud

rate (BRG).

Esso e l’unico componente comune alle due sezioni e serve sia per l’operativita

sincrona che per quella asincrona. E costituito dal registro SPBRG, che controlla

il funzionamento di un timer ad 8 bit, e da un divisore. Nel modo asincrono il bit

BRGH (TXSTA<2>) controlla anche il baud rate, mentre viene ignorato nel modo

sincrono.

Dati il baud rate desiderato e la frequenza dell’oscillatore FOSC , per calcolare il

corretto valore da inserire nel registro SPBRG ed i settaggi dei bit SYNC e BRG

del registro TXSTA si hanno a disposizione tre semplici formule come si puo vedere

dalla tabella 3.2, dove la X rappresenta il numero compreso tra 0 e 255 da inserire nel

registro SPBRG. Per facilitare i calcoli la Microchip offre le tabelle per le frequenze

SYNC BRGH=0 BRGH=1

(bassa velocita) (alta velocita)

0 BaudRate = FOSC/(64 ∗ (X + 1)) BaudRate = FOSC/(16 ∗ (X + 1))

(mod. asinc.)

1 BaudRate = FOSC/(4 ∗ (X + 1)) N/A

(mod. sinc.)

Tabella 3.2: Formule per il Baud Rate

di clock piu comuni e per i baud rate piu impiegati [20]. Puo essere conveniente

usare la modalita ad alto baud rate (BRGH=1) anche per bassi clock di baud,

perche l’equazione FOSC/(16 ∗ (X + 1)) puo, in alcuni casi, ridurre l’errore di baud

rate.

Come abbiamo visto nel paragrafo 2.4 la comunicazione tra il PIC ed un PC

attraverso il bus RS-485 su due fili soltanto richiede che la comunicazione sia di

tipo Half Duplex con il PC che funge da master ed il PIC16F877 da Slave. Per tale

ragione in questo paragrafo verra descritta soltanto la parte del modulo USART che

riguarda trasmissione e ricezione nella modalita “Slave Sincrona”.

3.6.1 Trasmissione nella modalita Slave Sincrona

Nella modalita sincrona il dato e trasmesso in maniera half-duplex (trasmissione

e ricezione non avvengono nello stesso momento), quando si e in trasmissione la

ricezione e inibita e viceversa. La modalita sincrona viene abilitata settando il

bit SYNC (TXSTA<4>) e settando il bit SPEN (RCSTA<7>) i bit RC6/TX/CK

e RC7/RX/DT vengono configurati risettivamente come CK (colck) e DT (linea

dato); infine la modalita slave si configura azzerando il bit CSRC (TXSTA<7>). Il

diagramma a blocchi del trasmettitore USART e mostrato in figura 3.18. Il cuore

72

Page 34: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

Figura 3.18: Schema a blocchi del trasmettitore USART [20]

di questa sezione e il transmit shift register TSR che prende i dati dal read/write

transmit buffer register TXREG, a sua volta caricato via software. Il registro TSR

non e caricato finche non viene trasmesso l’ultimo bit del dato precedente, non

appena questo avviene il TSR viene riempito con un nuovo dato dal TXREG in un

ciclo istruzione. Quest’ultimo rimane allora vuoto, cio provoca il settaggio del bit di

flag interrupt TXIF (PIR1<4>) senza tener conto dello stato del bit di abilitazione

TXIE (PIE1<4>); TXIF sara resettato al caricamento di un nuovo dato in TXREG.

Mentre il bit TXIF indica lo stato di TXREG, un altro bit TRMT (TXSTA<1>)

mostra lo stato del registro TSR; e un bit a sola lettura settato dallo svuotamento di

TSR, non e associato a nessun interrupt e non e mappato nella RAM cosı da poter

essere interrogato dal programmatore per vedere lo stato di TSR.

La trasmissione e abilitata settando il bit di abilitazione TXEN (TXSTA<5>),

ma non comincera fin quando TXREG non e stato caricato con il dato. Il primo bit

del dato verra shiftato fuori sul fronte di salita del clock sulla linea CK. Il dato in

uscita sara stabile nell’intorno del fronte di discesa del clock sincrono.

La trasmissione puo anche cominciare dopo aver caricato il registro TXREG,

cosa vantaggiosa quando si utilizzano bassi baud rate. Se durante la trasmissione

viene cancellato il bit TXEN oppure vengono azzerati CREN o SREN, essa sara

interrotta, il trasmettitore resettato e i pin DT e CK portati ad alta impedenza (per

la ricezione).

Per selezionare la trasmissione a 9 bit, deve essere settato il bit TX9 (TX-

STA<6>) e il nono bit del dato deve venir scritto in TX9D (TXSTA<0>) perche

la scrittura del dato in TXREG sia un trasferimento immediato in TSR (se questo e

vuoto). Il 9° bit deve essere scritto prima di scrivere gli 8 bit dato sul TSR, se questo

73

Page 35: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

e vuoto, altrimenti potrebbe essere caricato in TSR un 9° bit dato non corretto.

Per configurare una Synchronous Slave Transmission dovrebbero essere eseguiti

i seguenti passi [20]:

1. abilitare la synchronous slave serial port settando i bit SYNC e SPEN e

azzerando CSRC;

2. azzerare i bit Cren e SREN;

3. se si desidera l’interrupt si settano i bit: TXIE, GIE e PEIE;

4. se si desidera la trasmissione a 9 bit si setta TX9;

5. si abilita la trasmissione settando il bit TXEN che settera anche TXIF;

6. se e selezionata la trasmissione a 9 bit, il 9° bit puo essere caricato in TX9D;

7. si carica il dato in TXREG, comincia la trasmissione;

3.6.2 Ricezione nella modalita Slave Sincrona

Il diagramma del blocco ricevitore e mostrato in figura 3.19. In modalita sincrona

Figura 3.19: Schema a blocchi del ricevitore USART [20]

la ricezione e abilitata settando uno dei bit di abilitazione SREN (RCSTA<5>) o

CREN (RCSTA<5>), ed il dato viene campionato sul pin RC7/RX/DT in corri-

spondenza del fronte di discesa del clock. Se e settato il bit di abilitazione SREN,

74

Page 36: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

verra ricevuta una sola parola, mentre se e settato CREN la ricezione sara conti-

nua finche esso non verra azzerato; se sono entrambi ad ‘1’ e CREN ad avere la

precedenza.

Dopo la ricezione dell’ultimo bit il dato viene trasferito dal Receive Shift Register

(RSR) al registro RCREG, quando il trasferimento e completo viene settato il flag

di interrupt RCIF (PIR1<5>) che e un bit a sola lettura resettato dall’hardware

quando RCREG e stato letto ed e vuoto.

L’RCREG e un registro doppiamente bufferato, e cioe un FIFO a 2 livelli. Sara

quindi possibile ricevere 2 byte di dati e trasferire al RCREG FIFO un 3° byte

per iniziare lo scorrimento verso il registro RSR. All’arrivo dell’ultimo bit del 3°byte, se il registro RCREG e ancora pieno verra settato il bit Overrun Error OERR

(RCSTA<1>) e la parola in RSR persa. In questo caso il registro RCREG puo

essere letto due volte per recuperare i 2 byte nel FIFO e il bit OERR deve essere

azzerato dal programmatore resettando il receive logic bit, CREN. Se il bit OERR

e settato, il trasferimento dal registro RSR al RCREG e inibito, percio e essenziale

cancelllarlo se esso e al livello ‘1’.

Il 9° bit dato ricevuto viene bufferato allo stesso modo dei dati ricevuti. Poiche

leggendo RCREG, il bit RX9D verra caricato con un nuovo valore e necessario che il

programmatore legga il registro RCSTA prima di leggere nuovamente RCREG allo

scopo di non perdere la precedente informazione nel bit RX9D.

Per eseguire una ricezione nella modalita Slave sincrona e opportuno seguire le

seguenti istruzioni:

1. abilitare la synchronous slave serial port settando i bit SYNC e SPEN e

azzerando il bit CSRC;

2. se sono desiderati gli interrupt si settano i bit RCIE, GIE e PEIE;

3. se si vuole la ricezione a 9 bit si setta il bit RC9;

4. si abilita la ricezione settando il bit CREN;

5. il bit di flag RCIF sara settato quando la ricezione e completa e un interrupt

sara generato se il bit RCE e stato settato;

6. leggere il registro RCSTA per prendere il 9° bit (se abilitato) e vedere se c’e

stato qualche errore durante la ricezione;

7. leggere gli 8 bit del dato ricevuto dal registro RCREG;

8. se ci sono stati errori, cancellare l’errore resettando il bit CREN.

75

Page 37: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

3.7 Modulo SSP

Il modulo Synchronous Seria Port (SSP) e una interfaccia seriale utilizzabile per

comunicazioni con altre perfiferiche, tipo EEPROM seriali, registri a scorrimento,

drivers per display, convertitori A/D o microcontrollori. Il modulo SSP puo operare

in due modalita:

Serial Peripheral Interface (SPI);

Inter-Integrated Circuit (I2C)

– modalita Slave;

– controllo della rampa di I/O, rivelazione dei bit di Start e Stop per

facilitare l’implementazione software dei modi Master e Multi-master.

Per interfacciare la memoria EEPROM esterna utilizzero la modalita I2C, percio

soltanto ad essa faro riferimento nel seguito.

Il bus IIC e nato dalla Philips/Signetics per far dialogare piu dispositivi su due

soli fili, uno per il clock ed uno per il dato. I dati vengono trasferiti in modo seriale

e alla frequenza di 100 kHz o 400 kHz a seconda dei dispositivi collegati. Sul bus

IIC possono risiedere diversi master e diversi slave che interagiscono tramite un

protocollo ormai collaudato. Concettualmente, un master inizia un dialogo con uno

slave indicandolo con un indirizzo, i successivi trasferimenti di dati sono in funzione

dei due dialoganti.

Per cominciare e terminare la comunicazione bisogna generare le condizioni di

START e di STOP. Si ha uno START quando il dato passa da livello alto a basso

mentre la linea del clock e alta. Si ha invece una condizione di STOP quando il dato

passa da basso ad alto con il clock a livello alto. Per indirizzare i dispositivi sono

disponibili indirizzi a 7 o a 10 bit il cui formato e specificato piu avanti nelle figure

3.28 e 3.29. Insieme all’indirizzo viene inoltre passata allo slave l’indicazione se

trattasi dell’invio di un dato o di un comando. Tutti i dati devono necessariamente

essere trasmessi con blocchi di 8 bit e non esiste un limite al numero di byte che e

possibile trasmettere durante un dialogo. Dopo ogni byte ricevuto, il modulo slave

genera un segnale di acknowledge (ACK), cioe di avvenuta ricezione portando bassa

la linea dei dati.

Se cio non avviene, allora il Master deve subito interrompere il dialogo in corso

con tale modulo. Questo meccanismo viene usato quando lo slave non ha piu infor-

mazioni da inviare oppure ha altri compiti piu urgenti da svolgere. In questo caso

lo slave deve liberare la linea SDA portandola ad alta impedenza per permettere

al master di generare la condizione di STOP che abbiamo gia descritto. Al master

e inoltre consentito generare la condizione di STOP anche durante un impulso di

acknowledge da parte dello slave per terminare rapidamente un dialogo.

76

Page 38: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

Se durante un colloquio lo slave ha necessita di ritardare la trasmissione di un

byte, ad esempio perche si deve calcolare un certo risultato oppure perche attende

a sua volta un segnale da un’altra perfiferica, e sufficiente che forzi a basso livello la

linea del clock, portando cosı il master in uno stato di attesa (wait) indeterminata.

Il dialogo riprende quando lo slave decide di liberare la linea SCL.

Per mezzo di questo protocollo che permette la messa in attesa del master anche

durante il passaggio di un singolo bit, possiamo dire che in determinati momenti si

invertono le funzioni dei due dialoganti. Quando uno slave si guasta e, per coinci-

denza setta bassa la sua linea SCL, si blocca tutto il circuito fino a quando non si

provvedera alla riparazione fisica.

Vediamo adesso in dettaglio le caratteristiche e il modo di funzionamento dei

registri e degli altri componenti che operano nella modalita IIC

La periferica SPI-IIC e stata realizzata tenendo conto di tutte le caratteristi-

che necessarie ad un dispositivo di tipo slave, mentre per ovvie ragioni (diversita

di impiego da programma a programma) nella funzionalita master offre supporto

hardware per lo sviluppo di rapidi comandi software per una veloce gestione del

modulo. La periferica IIC offre sia lo standard a 100 kHz sia quello a 400 kHz come

pure il formato di indirizzamento a 7 e a 10 bit. Due pin sono impiegati dei dati

(SCL e SDA) e devono essere configurati in input o in output dal programmatore

attraverso i bit corrispondenti nel registro di configurazione della porta dedicata.

In registri utilizzati da questo modulo sono 5:

SSP Control Register (SSPCON);

SSP Control Register2 (SSPCON2);

SSP Status Register (SSPSTAT);

Serial Receive/Transmit Buffer (SSPBUF);

SSP Shift Register (SSPSR) — non direttamente accessibile;

SSP Address Register (SSPADD).

Una visione dettagliata dei registri SSPCON, SSPCON2 e SSPSTAT si triva nelle

figure 3.20 3.21 3.22. Il registro SSPCON permette il controllo delle operazioni

del bus, per abilitare le funzioni del modulo SSP bisogna settare il bit SSP Enable,

SSPEN (SSPCON<5>) e 4 bit di selezione modo (SSPCON<3:0>) permettono di

selezionare una delle seguenti modalita:

IIC Slave mode (indirizzo a 7 bit);

IIC Slave mode (indirizzo a 10 bit);

77

Page 39: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

Figura 3.20: Registro SSPSTAT [20]

78

Page 40: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

Figura 3.21: Registro SSPCON [20]

79

Page 41: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

Figura 3.22: Registro SSPCON2 [20]

80

Page 42: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

IIC Master mode, clock=OSC/4 (SSPADD+1)

Prima di selezionare uno dei modi IIC, i pin SCL e SDA devono essere programmati

come ingressi settando i bit TRIS appropriati, per poi selezionare la modalita IIC

portando ad ‘1’ il bit SSPEN.

Il registro SSPSTAT contiene informazioni sullo stato del trasferimento dati, esse

comprendono il rilevamento dei bit di START e di STOP, l’informazione se il byte

ricevuto e un dato o un indirizzo o se il prossimo byte rappresenta la parte finale di

un indirizzo a 10 bit, se il trasferimento e in lettura o in scrittura.

Il registro SSPBUF e quello sul quale viene scritto o da cui viene letto il dato

trasferito. Il SSPSR shifta il dato dentro o fuori il dispositivo. Nelle operazioni di

ricezione i registri SSPBUF e SSPSR creano un ricevitore dopiamente bufferato, la

qual cosa permette di cominciare la ricezione del prossimo byte rima della lettura

dell’ultimo dato ricevuto. Quando viene ricevuto un byte completo, viene trasferito

nel registro SSPBUF e viene settato il bit di flag SSPIF. Se viene ricevuto un altro

byte completo prima che il bit SSPOV (SSPCON<6>) venga settato, il byte nel

registro SSPSR viene perduto.

Il registro SSPADD mantiene l’indirizzo dello slave. Nel modo a 10 bit bisogna

che l’utente scriva il byte alto nell’indirizzo (1111 0 A9 A8 0). Seguendo l’indirizzo

del byte alto bisogna caricare il byte basso all’indirizzo (A7:A0).

3.7.1 Modalita master

La modalita master viene supportata dalla generazione di un interrupt ad ogni

condizione di START o di STOP. I bit di START (S) e di STOP (P) sono azzerati

da un reset oppure quando il modulo SSP viene disabilitato. Il possesso del bus

puo essere preso quando il bit P e settato oppure quando il bus e in “IDLE” e sia

P che S sono a ’0’. Per quel che riguarda le linee SCL e SDA, in modalita master

i corrispondenti pin di uscita sono sempre a basso livello come valore sulla porta, e

per modificarli in ‘1’ si deve impostare ad ‘1’ (ricezione) il bit corrispondente alla

direzione di quel pin. In pratica e stato realizzato un sistema che quando vale ‘1’

impedisce di far scorrere corrente attraverso un’eventuale linea tenuta a basso livello.

L’interrupt e generato dalle condizioni di START, STOP, byte trasferito; e poiche

e possibile implementare sia la modalita master che la modalita slave, il software

dovra discriminare la sorgente dell’interrupt.

Quando si fa lavorare il PIC come master, sia i tempi che il dialogo vengono

interamente gestiti dal programmatore. Se invece occorresse inserire il PIC in un

circuito che ha gia il modulo master i problemi non sarebbero certamente pochi, pri-

mo fra tutti il continuo dialogo con il master preesistente per capire se il dispositivo

e quello indirizzato oppure no, con evidente perdita di tempo e di risorse.

81

Page 43: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

Il diagramma a blocchi del modlo SSP nel caso che funzioni nella modalita IIC

master e mostrato nella figura 3.23.

Figura 3.23: Schema a blocchi del modulo SSP (IIC Master Mode) [20]

Il modo master viene abilitato settando e azzerando gli appropriati bit SSPM nel

registro SSPCON e settando il bit SSPEN. Appena il modo master viene abilitato

il programmatore ha a disposizione 6 opzioni:

rivendicare una condizione di START su SDA e SCL;

rivendicare una condizione di START ripetuto su SDA e SCL;

scrivere sul registro SSPBSUF iniziando la trasmissione di un dato o di un

indirizzo;

generare una condizione di STOP su SDA e SCL;

configurare la porta IIC per ricevere un dato;

generare una condizione di acknowledge alla fine della ricezione di un byte

dato.

Il modulo SSP, quando configurato come IIC Master Mode non permette di

accodare gli eventi, ad esempio il programmatore non puo iniziare una condizione di

82

Page 44: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

START e immediatamente scrivere sul registro SSPBUF per iniziare la trsmissione,

prima che la condizione di START sia completata. In questo caso il SSPBF non

sara scritto, e il bit NCOL sara settato, indicando che una scrittura sul SSPBUF

non c’e stata.

Il dispositivo master genera tutti gli impulsi del clock seriale e le condizioni di

START e STOP. Un trasferimento e terminato con una condizione di STOP o con

una condizione di START ripetuta. Poiche la condizione di START ripetuta segna

l’inizio di un prossimo trasferimento seriale, il bus IIC non verra rilasciato.

Nella modalita Master Transmit il dato seriale viene posto in uscita attraverso

SDA, mentre SCL manda in uscita il clock. Il primo byte trasmesso contiene l’indi-

rizzo dello slave ricevente, (7 bit) ed il bit Read/Write (R/W ). In questo caso il bit

R/W sara uno ‘0’ logico. Dopo che ciascun byte e stato trasmesso viene ricevuto

un bit di acknowledge. Le condizioni di START e di STOP sono degli output che

servono ad indicare l’inizio e la fine di un trasferimento seriale.

Nella modalita Master Receiver il primo byte trasmesso contiene l’indirizzo slave

del dispositivo trasmittente (7 bit) e il bit R/W . In questo caso il bit R/W sara un

‘1’ logico. Cosı il primo byte trasmesso e un indirizzo slave a 7 bit seguito da un ‘1’

ad indicare il bit di ricezione.

Il baud rate generator e usato per settare la frequenza di clock SCL tra 100

kHz, 400 kHz o 1 MHz per le operazioni IIC. Il valore del baud rate generator e

contenuto nei 7 bit piu bassi del registro SSPADD. Il baud rate generator comincera

automaticamente a contare su una scrittura sul SSPBUF. Appena l’operazione e

completa (i.e. trasmissione dell’ultimo bit dato seguita da ACK) il clock interno

fermera automaticamente il conteggio e il pin SCL rimarra nell’ultimo stato.

Una tipica sequenza che si potrebbe seguire e la seguente:

a) il programmatore genera una condizione di START settandil bit di abilitazione

dello START, SEN (SSPCON2<0>);

b) SSPIF e settato. Il modulo SSP aspettera il tempo richiesto allo START prima

che ogni altra operazione abbia luogo;

c) il programmatore carica il SSPBUF con l’indirizzo da trsmettere;

d) l’indirizzo viene shiftato fuori dal pin SDA fino a che tutti tutti gli 8 bit non

sono trasmessi;

e) il modulo SSP shifta nel bit ACK del dispositivo slave, e scrive il suo valore nel

registro SSPCON2 (SSPCON2<6>);

f) il modulo SSP genera un interrupt alla fine del 9° ciclo di clock settando il bit

SSPIF;

g) l’utente carica il SSPBUF con 8 bit di dati;

83

Page 45: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

h) il dato e shiftato fuori dal pin SDA fino a che tutti glil vengono trasmessi;

i) il modulo SSP shifta nel bit ACK del dispositivo slave, e scrive il suo valore nel

registro SSPCON2 (SSPCON2<6>);

j) il modulo SSP genera un interrupt alla fine del 9° coclo di clock settando il bit

SSPIF;

k) il programmatore genera una condizione di STOP settando lo “stop enable bit”,

PEN (SSPCON2<2>);

l) un interrupt viene generato appena la condizione di STOP e completa.

3.7.2 Baud Rate Generator

Nella modalita IIC, il valore per il BRG e messo nei 7 bit piu bassi del registro

SSPADD (figura 3.24).

Figura 3.24: Schema a blocchi del baud rate generator [20]

Quando il BRG e ricaricato con questo valore, comincia a contare verso il basso

fino a 0 e si ferma quando e terminato un caricamento successivo. Nel modo master

il BRG viene ricaricato automaticamente. Se sta avendo luogo una arbitrazione

del clock, per esempio, il BRG sara ricaricato fino a quando il pin SCL non verra

campionato alto (figura 3.25).

84

Page 46: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

Figura 3.25: Temporizzazioni del baud rate generator con arbitrazione del clock [20]

3.7.3 Temporizzazione della condizione di Start

Per iniziare una condizione di START il programmatore setta lo “Start condition

enable bit”, SEN (SSPCON2<0>). Se i pin SDA e SCL sono campionati alti, il

baud rate generator e ricaricato con il contenuto di SSPADD<6:0>, e comincia il

suo conteggio. Se SCL e SDA sono entrambi campionati alti quando il BRG finisce

il conteggio (TBRG), il pin SDA e portato basso. L’azione dell’SDA portato basso

mentre SCL e alto rappresenta la condizione di START, e causa il settaggio del bit

S (SSPSTAT<3>). In seguito a questo, il baud rate generator e ricaricato con il

contenuto di SSPADD<6:0> e ricomincia il suo conteggio. Quando il BRG termina

il conteggio (TBRG) il bit SEN (SSPCON2<0>) sara automaticamente cancellato

dall’hardware ed esso e sospeso lasciando la linea SDA bassa. La condizione di

START e completa.

Se all’inizio della condizione di START i pin SDA e SCL sono gia campionati

bassi, o se durante la condizione di START la linea SCL e campionata bassa, si

ha una collisione di bus: il bit di “Bus Collision Interrupt Flag”, BCLIF, viene

settato, la condizione di START e terminata e il modulo IIC viene resettato nello

stato IDLE.

Se il programmatore scrive il SSPBUF quando e in progressione una sequenza di

START, viene settato il bit il bit WCOL e il contenuto del buffer rimane inalterato.

Poiche non e permesso l’accodamento degli eventi, la scrittura sui 5 bit bassi di

SSPCON2 e disabilitata finche la condizione di START e completa.

85

Page 47: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

Figura 3.26: Temporizzazione del 1° bit di start [20]

3.7.4 Temporizzazione della “condizione di start ripetuta”

Una condizione di START Ripetuta si ha quando il bit RSEN (SSPCON2<1>) e

programmato alto e il modulo logico IIC e nello stato IDLE. Quando il bit RSEN

e settato, il pin SCL e rivendicato basso, il baud rate generator e caricato con il

contenuto di SSPADD<5:0> e comincia il conteggio. Il pin SDA e liberato (portato

alto) per un conteggio del BRG (TBRG). Quando il baud rate generator finisce,

se SDA e campionato alto, il pin SCL sara rivendicato (portato alto). Quando

il pin SCL e campionato alto il baud rate generator e ricaricato con il contenuto

di SSPADD<6:0> e comincia il conteggio. SDA e SCL devono essere campionati

alti per un TBRG. Questa azione e allora seguita da una rivendicazione del pin SDA

(SDA=0) per un TBRG mentre SCL e alto. Dopo di cio, il bit RSEN (SSPCON2<1>)

sara automaticamente cancellato e il baud rate generator non ricaricato, lasciando

il pin SDA basso. Il bit S (SSPSTAT<3>) sara settato non appena vine rilevata

una condizione di START sui pin SDA e SCL. Il bit SSPIF non sara settato fino a

quando il baud rate generator viene spento.

Se RSEN e programmato mentre qualche altro evento e in progressione, non

produrra effetti. Una collisione di bus durante durante una condizione di START

ripetuta puo accadere se:

SDA e campionato basso quando SCL va da basso ad alto;

SCL va basso prima che SDA sia rivendicato basso. Questo puo indicare che

un altro Master e in attesa di trasmettere un dato ‘1’.

Immediatamente dopo il settaggio del bit SSPIF, il programmatore puo scrivere il

SSPBUF con 7 bit indirizzo nel modo a 7 bit, o il primo indirizzo di default nel

modo a 10 bit. Dopo che i primi 8 bit sono trasmessi ed un ACK ricevuto, il pro-

grammatore puo allora trasmettere degli addizionali 8 bit di indirizzo (modo 10 bit)

86

Page 48: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

o 8 bit di dato (modo 7 bit).

Figura 3.27: Forma d’onda di una condizione di start ripetuta [20]

3.7.5 Trasmissione nella modalita Master

La trasmissione di un byte dato, un indirizzo a 7 bit o la meta di un indirizzo a

10 bit e compiuto scrivendo semplicemente un valore sul registro SSPBUF. Questa

azione settera il bit “Buffer Full Flag”, BF, e permettera al baud rate generator

di cominciare il conteggio e iniziare la prossima trasmissione. Ciascun bit dell’in-

dirizzo/dato sara shiftato fuori dal pin SDA dopo il fronte di caduta di SCL che

e mantenuto basso per un conteggio di roll-over del baud rate generator (TBRG).

Quando il pin SCL e liberato alto, esso e mantenuto cosı per TBRG, il dato sul pin

SDA deve rimanere stabile per questa durata e qualche hold time dopo il prossimo

fronte di discesa di SCL. Dopo che l’ottavo bit e shiftato fuori (il fronte di discesa

dell’ottavo clock), il flag BF viene cancellato e il Master libera SDA permettendo

al dispositivo Slave attualmete indirizzato di rispondere con un bit ACK durante il

tempo del nono bit, se c’e un accopiamento di indirizzi o se il dato e propriamente

ricevuto. Lo stato di ACK viene scritto nel bit ACKDT sul fronte di discesa del

nono clock.

Se il master riceve un acknowledge, il “acknowledge status bit”, ACKSTAT, viene

cancellato, altrimenti il bit viene settato. Dopo il nono clock il bit SSPIF e settato e

il master clock (baud rate generator) e sospeso fino a che il prossimo byte dato viene

caricato nel SSPBUF lasciando SCL basso e SDA immutato (figura 3.28). Dopo la

scrittura in SSPBUF, ciascun bit di indirizzo sara shiftato fuori sul fronte di discesa

di SCL fino a che tutti i 7 bit indirizzo e il bit R/W non sono completati. Sul fronte

di discesa dell’ottavo clock il master de-rivendichera il pin SDA permettendo allo

87

Page 49: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

slave di rispondere con un acknowledge. Sul fronte di discesa del nono clock il master

campionera il pin SDA per vedere se l’indirizzo e stato recepito dallo slave. Lo stato

del bit ACK e caricato nel bit di stato ACKSTAT (SSPCON2<6>). Dopo il fronte

di discesa del nono clock di trasmissione dell’indirizzo, il bit SSPIF e settato, il flag

BF e cancellato, e il baud rate generator e spento fin quando un altra scrittura sul

SSPBUF ha luogo, mantenendo SCL basso e permettendo ad SDA di flottare.

Nel modo trasmettitore, il bit BF (SSPSTAT<0>) e settato quando la CPU

scrive sul SSPBUF e e cancellato quando tutti gli 8 bit sono shiftati fuori.

Se il programmatore scrive il SSPBF quando una trasmissione e gia in progressio-

ne (i.e. SSPSR sta ancora shiftando fuori un byte dato), allora WCOL viene settato

e il contenuto del buffer rimane inalterato (la scrittura non avviene). WCOL deve

essere cancellato via software.

In trasmissione, il bit ACKSTAT (SSPCON2<6>) e cancellato quando lo Slave

ha inviato un acknowledge (ACK = 0), ed e settato quando lo Slave non restituisce

l’acknowledge (ACK = 1). Uno Slave invia un acknowledge quando ha recepito il

suo indirizzo (compresa una chiamata generale), oppure quando ha ricevuto il suo

dato senza errori.

3.7.6 Ricezione nella modalita Master

La ricezione nel modo master e abilitata programmando il “receive enable bit, RCEN

(SSPCON2<3>).

Il modulo SSP deve essere nello stato IDLE prima che il bit CREN sia settato,

oppure RCEN non verra considerato. Il baud rate generator comincia il suo con-

teggio, e su ogni rollover, lo stato del pin SCL cambia (da alto a basso e da basso

ad alto), e il dato viene shiftato nel SSPSR. Dopo il fronte di discesa dell’ottavo

clock, il “receive enable flag” e automaticamente azzerato, il contenuto del SSPSR

viene caricato nel SSPBUF, il flag BF settato, il flag SSPIF settato e il baud rate

generator e sospeso dal conteggio mantenendo SCL basso. L’SSP e adesso nello

stato IDLE, aspettando il prossimo comando. quando il buffer e letto dalla CPU, il

BF viene automaticamente cancellato. L’utente puo allora inviare un acknowledge

alla fine della ricezione settando il bit di “acknowledge sequence enable” ACKEN

(SSPCON2<4>) figura 3.29.

Nelle operazioni di ricezione il bit BF viene settato quando vengono caricati un

byte indirizzo o dato in SSPBUF dal registro SSPSR, viene azzerato quando viene

letto il registro SSPBUF. Il bit SSPOV viene settato quando vengono ricevuti 8

bit nel registro SSPSR, e il bit BF e gia settato da una precedente ricezione. Se il

programmatore scrive il registro SSPBUF quando una ricezione e gia in atto (i.e.

SSPSR sta ancora shiftando in un byte dato), allora il bit WCOL verra settato ed

88

Page 50: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

Figura 3.28: Temporizzazione della trasmissione a 7 o a 10 bit [20]

89

Page 51: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

Figura 3.29: Temporizzazione della ricezione a 7 bit [20]

90

Page 52: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

il contenuto del buffer rimarra inalterato (non si ha scrittura).

3.7.7 Temporizzazione di una sequenza di Acknoweledge

Una sequenza di acknowledge e abilitata settando il bit di abilitazione sequenza di

acknowledge ACKEN (SSPCON2<4>). Quando questo bit e settato il pin SCL

e portato basso e il contenuto del acknowledge data bit e presentato sul bit SDA.

Se il programmatore vuole generare un acknowledge allora il bit ACKDT potrebbe

essere cancellato, altrimenti il programmatore potrebbe settare il bit ACK prima di

cominciare una sequenza di acknowledge. Il baud rate generator allora conta per una

periodo di rollover (TBRG) e il pin SCL viene derivendicato (tirato alto). Quando il

pin SCL viene campionato alto (arbitrazione di clock) il baud rate generator conta

per TBRG. Il pin SCL e allora tirato basso. Dopo cio il bit ACKEN e automati-

camente cancellato, il baud rate generator e spento e il modulo SSP va nel modo

IDLE (figura 3.30).

Figura 3.30: Forma d’onda della sequenza di acknowledge [20]

Se il programmatore scrive il SSPBUF quando e in atto una sequenza di ackno-

ledge il bit WCOL verra settato ed il contenuto del buffere sara inalterato.

91

Page 53: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

3.7.8 Temporizzazione della condizione di Stop

Un bit di STOP e rivendicato sul pin SDA alla fine di una ricezione/trasmissione

settando il bit “Stop sequence enable” PEN (SSPCON2<2>). Alla fine di una

trasmissione ricezione la linea SCL e mantenuta bassa dopo dopo il fronte di discesa

del 9° clock. Quando il bit PEN e settato il master rivendichera la linea SDA bassa.

Quando la linea SDA e campionata bassa il baud rate generator e ricaricato e conta

verso il basso fino a 0, finito il conteggio il pin SCL sara portato alto ed un TBRG

(conteggio di rollover del BRG) dopo il pin SDA sara derivendicato.

Quando il pin SDA e campionato alto mentre SCL e alto, il bit P (SSPSTAT<4>)

viene settato. Un TBRG dopo il bit PRN e cancellato e il bit SSPIF e settato (figura

3.31). Ogni volta che il firmware decide di prendere il controllo del bus esso stabilira

per prima cosa se il bus e occupato testando i bit S e P nel registro SSPSTAT. Se il

bus e occupato allora la CPU puo essere interrotta (notified) quando e rilevato un

bit di STOP (i.e. il bus e libero).

Figura 3.31: Condizione di STOP in ricezione o in trasmissione [20]

3.7.9 Arbitrazione del clock

Una arbitrazione di clock si ha quando il master, durante una ricezione/trasmissione,

o una condizione di START o di STOP ripetuto derivendica il pin SCL (SCL puo

92

Page 54: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

flottare alto), allora il baud rate generator (BRG) viene sospeso dal conteggio fino

a quando SCL e effettivamente campionato alto. In questo caso il BRG e caricato

con il contenuto di SSPADD<6:0> e comincia il conteggio. Cosı si assicura che il

tempo alto del SCL sara sempre almeno un conteggio di rollover del BRG nel caso

che il clock sia mantenuto basso da un dspositivo esterno (figura 3.32).

Figura 3.32: Arbitrazione di clock nella modalita trasmettitore master [20]

3.7.10 Considerazioni sulla connessione del bus I2C

Un dispositivo puo essere collegato al bus IIC secondo la modalita mostrata in

figura 3.33 Per dispositivi bus IIC standard-mode, il valore dei resistori RP e RS

nella figura dipende dai seguenti parametri:

tensione di alimentazione;

capacita del bus;

numero di dispositivi connessi (corrante di ingresso + corrente di dispersione

(leakage)).

La tensione di alimentazione limita il minimo valore del resistore Rp dovuto

allo specificato limite della corrente di sink di 3 mA a VOLMAX = 0.4V per le

rappresentazioni di uscita specificate. Per esempio con una tensione di alimentazione

VDD = 5V ± 10% e VOLMAX = 0.4V a 3 mA, RPmin = (5.5 − 0.4)/0.003 = 1.7kΩ.

Il margine di rumore desiderato di 0.1VDD per il livello basso, limita il massimo

valore di RS. I resistori sono opzionali e usati per migliorare la suscettibilita ESD.

93

Page 55: Capitolo 3 Il microcontrollore PIC16F877: architettura e ...hobbytron.altervista.org/pic/architettura877.pdf · (Interrupt Vector Address) ed il PCLATH non risulta modificato. Per`o

Figura 3.33: Esempio di un dispositivo sul bus IIC [20]

La capacita del bus e la capacita e la capacita totale del filo, delle connessioni e dei

pin, questa capacita limita il massimo valore di RP dovuto allo spaecificato tempo

di salita.

Dopo aver concluso l’analisi delle priferiche del PIC16F877 di particolare interes-

se per il progetto del nodo di sicurezza ci si pota occupare, nel seguente capitolo, della

sua programmazione dando una breve descrizione della programmazione assembly e

delle istruzioni specifiche del dispositivo.

94