Il µcontrollore PIC 16F84 - Eledea · 2009-01-09 · PIC 16F84 D. Ch. 1 Il µcontrollore PIC 16F84 Microchip Tecnology Il grande successo dei microcontrollori ha indotto tutte le
Post on 13-Sep-2018
232 Views
Preview:
Transcript
PIC 16F84
D. Ch. 1
Il µcontrollore PIC 16F84
Microchip Tecnology
Il grande successo dei microcontrollori ha indotto tutte le grandi case costrutrici di
semiconduttori come la Intel, la Philips Semiconductors, la Nec, la Texas Instruments, La
Amtel, la Zilog, la Microchip Tecnology e altre, ad offrire sul mercato una vasta gamma di
µC.
I microcontrollori si distinguono per il parallelismo di memoria (8, 16, 32
bit), per il set istruzioni più o meno esteso, per la complessità circuitale interna che può
comprendere comparatori, convertitori A/D, generatori di segnali PWM, per la potenza di
calcolo come i DSP (digital signal processor) progettati per elaborare grandi quantità di
segnali (audio, immagini) in brevissimo tempo.
I PIC “Programmable Integrated Controller” sono la famiglia di µC prodotti dalla
Microchip Tecnology.
Il PIC 16F84 è un microcontrollore di fascia medio-bassa con un parallelismo di 8 bit, di
facile impiego e soprattutto ricco di letteratura.
PIC 16F84
D. Ch. 2
I microcontrollori
I µcontrollori sono dei sistemi single chip completi di CPU,
Memoria, Porte di I/O, Contatori, Timer ecc.
Sono stati concepiti per applicazioni industriali di controllo.
Il programma, una volta messo a punto, risiede all’interno
del chip.
I microcontrollori sono praticamente dei completi microelaboratori integrati su un unico
chip.
Sono ormai impiegati in tutte le moderne applicazioni elettroniche che vanno dagli
“elettrodomestici intelligenti” all’automobilismo, dagli apparati per le telecomunicazioni
alla robotica, dagli apparati elettromedicali alla alta fedeltà, alla elaborazione dei segnali
audio e video, alla sicurezza.
Vengono detti “embedded” perché, una volta programmati per una particolare applicazione,
vengono incorporati nell’apparecchio che devono controllare. Hanno praticamente
rimpiazzato i soffisticati circuiti di controllo analogici e digitali.
PIC 16F84
D. Ch. 3
Il PIC 16F84:
• ha CPU “RISC”
• ha struttura “Harvard”
• ha semplice modalità di indirizzamento
.
A differenza dei classici microprocessori con struttura di tipo “Von
Neumann” (aventi un’unica memoria, come già visto nella prima parte del corso) il PIC ha
la strutture di tipo “Harvard” (Università dove è stato creato) caratterizzato dal fatto che la
memoria dati e la memoria istruzioni sono diverse e separate e ciascuna con il proprio bus;
in questo modo la CPU può operare una singola istruzione ma su dati multipli o anche
istruzioni multiple su dati multipli.
Il PIC 16F84 ha un parallelismo di memoria di 8 bit ossia è capace di
trattare 8 bit con un solo accesso in memoria ed è un microcontrollore con CPU RISC
(Reduced Instruction Set Computing) dotata di un set di sole 37 istruzioni tutte della stessa
lunghezza, ciascuna di 14 bit di cui 35 comuni a tutti i PIC e 2 proprie del 16F84;
Anche i modi di indirizzamento sono pochi e semplici (diretto ed indiretto) e di
conseguenza è sufficiente un semplice hardware di decodifica.
Tutto questo fa si che il PIC abbia una grande velocità operativa.
PIC 16F84
D. Ch. 4
Il vero fattore velocizzante della operatività del PIC è la modalità di lavoro in “pipeline”
(Metodo che consente l'elaborazione di nuovi dati senza necessità di attendere che i dati
precedentemente inviati termino la loro elaborazione).
Le istruzioni del PIC oltre che poco numerose sono anche molto brevi; durano tutte 8 cicli
T(ad eccezione delle istruzioni si salto). Di questi, i primi 4 cicli sono utilizzati per il
caricamento del codice operativo (fase di fetch) mentre i 4 successivi sono dedicati alla fase
di execute (l’esecuzione del microprogramma).
Al fine di raddoppiare la velocità di esecuzione del programma, grazie anche all’architettura
che lo consente, si fa in modo che nelle istruzioni consecutive le fasi operative si
sovrapongano creando il “pipeline flow”. Praticamente, mentre si esegue l’execute di una
istruzione si esegue contemporaneamente anche il fetch dell’istruzione successiva. Così
facendo ogni istruzione dura solo 4 cicli T anziché 8 ( nel caso di un clock di 20 MHz ogni
istruzione durerà appena 200 ns mentre nelle nostre applicazioni dove utilizziamo un clock
di 4MHz ogni istruzione dura 1 µs).
PIC 16F84
D. Ch. 5
T_Fetch = T_ ExecuteSeparazione dei
canali dei dati e
delle istruzioni
Pipelining
(sovrapposizione del fetch di
un’istruzione e del execute
della precedente.)
velocizzazione
velocizzazionePoche istruzioni
Pochi modi di
indirizzamento
Hw di
decodifica
semplice
RIEPILOGANDO:
In questa slide sono sintetizzati i motivi grazie ai quali il PIC ha una
velocità operativa superiore ai comuni microprocessori.
PIC 16F84
D. Ch. 6
Schema a blocchi interno del PIC
L’architettura interna del PIC è quella di un µcontrollore completo. Si distinguono:
•L’ALU: unità centrale
•I Registri:
�W: Accumulatore, a 8 bit coinvolto nelle istruzioni di trasferimento.
�STACK:Registro LIFO a 8 livelli; il programmatore può creare fino a 8 subroutinenidificate.
�PC: Program Counter, a 13 bit con i quali è possibile indirizzare 8K locazioni di Memoria Programma (in effetti sono ridondanti per il PIC 16F84 visto che esso ha solo 1K di Memoria Programma). Il PC è composto da due registri: PCL di 8 bit e PCH di 5 bit; nel registro PCH non si può accedere direttamente (come nel PCL) ma bisogna coinvolgere il registro PCLATH ( vedi slide n. 12).
•La Memoria:
�EEPROM Programma: a 14 bit (1024 locazioni)
�EEPROM dati a 8 bit (64 locazioni)
�RAM a 8 bit suddivisa in
•22 Registri speciali (11 + 11)
•68 Registri dati di uso generale
•Le Porte :
�Port A (5 linee)
�Port B (8 linee)
Le linee delle porte sono configurabili sia in input che in output, sono compatibili TTL e possono erogare / assorbire fino ad un massimo di 25 mA.
•Timing generation: Circuiteria sia per la generazione di clock all’interno del PIC sia per la ricezione di un clock dall’esterno.
•RTCC: (Real Time Counter/ Clock) fa riferimento al registro TMR0 a 8 bit ( vedi slide n. 12).
PIC 16F84
D. Ch. 7
Il pinout del PIC 16F84
(18 pin di cui ben 13 disponibili per l’I/O)
Fig. (α )
Fig. ( β )
Il PIC 16F84 è un integrato a 18 pin di cui ben 13 sono dedicati all’ I/O.
In figura (α) è riportato lo schema funzionale mentre in figura (β) è riportato in pinout del
PIC. Si distinguono:
•il PortA (5pin),
•il PortB (8 pin),
•i 2 pin di alimentazione e massa (VDD e GND),
•il master Reset (MCLR) attivo basso e
•due pin (OSC1 e OSC2) dedicati al clock; fra questi due pin si collega l’oscillatore esterno.
PIC 16F84
D. Ch. 8
Descriviamo ora la funzione dei pin dell’integrato:
•OSC1/ CLKIN e OSC1/ CLKOUT: sono pin rispettivamente di ingresso e di uscita; fra
questi solitamente va collegato un’oscillattore a quarzo esterno che unitamente
all’amplificatore interno al PIC costituisce il generatore di clock del sistema.
Oltre il quarzo (4MHz o di high speed fino a 20MHz), come oscillatore esterno è possibile
anche l’utilizzo di una rete RC o anche di un risonatore ceramico fino a 200 kHz.
•Il MCLR (Master Reset): è un pin di input ed è attivo basso. Ogni volta che viene attivato
carica il Program Counter con l’indirizzo 000H da dove poi riparte il programma.
•RA0 – RA4: sono le 5 linee di I/O del Port A e possono essere utilizzate sia in input che in
output;
In particolare, fare attenzione su RA4 quando viene utilizzata in out bisogna inserire un
resistore di pull up esterno perché è un pin “open drain”. RA4 inoltre può essere utilizzata
anche come ingresso per il clock del Registro TMR0.
•RB0 – RB7: sono le 8 linee di I/O del PORT B e possono essere utilizzate sia in input che
in output;
In particolare, RB0 può essere utilizzata anche come linea di input di interrupt;
In particolare anche RB4 – RB7 possono essere utilizzate come input di interrupt ma attive
“edge triggered” (attive sul cambiamento di stato).
(vedi registro INTCON, slide 13).
PIC 16F84
D. Ch. 9
EEPROM (1K)
Memoria di Programma
14 bit
1k
Banco
0
Banco
1
RAM
64 locazioni
EEPROMDati
8 bit
LA MEMORIA DEL PIC 16F84
La memoria del PIC 16F84 è organizzata in 3 blocchi:
a) Una Memoria Programma di tipo EEPROM a 16 bit con 1024 locazioni dove tra altro
sono contenuti i codici operativi di due istruzioni chiave: “RESET” nella locazione
000H e “INTERRUPT” nella locazione 004H;
b) Una Memoria RAM a 8 bit di 90 locazioni dislocate in uno spazio di 256 locazioni
totali (da 00h a FFh) e divisa in due blocchi detti Banchi (Banco 0 e Banco 1).
L’organizzazione della RAM prevede 22 Registri speciali (11 per ogni Banco) e 68
Registri di uso generale. Dei Registri speciali ci occuperemo dettagliatamente più
avanti.
c) Infine esiste una terza memoria a 8 bit di 64 locazioni, di tipo EEPROM utilizzata
esclusivamente come Memoria Dati.
PIC 16F84
D. Ch. 10
LA MEMORIA RAM
La memoria RAM, come gia detto, è organizzata in 2 Banchi consecutivi, qui rappresentati
affiancati.
Per selezionare il Banco su cui si vuole lavorare bisogna coinvolgere i bit RP1 ed RP0 del
Registro STATUS: 00 seleziona il Banco 0 mentre 01 seleziona il Banco 1;
in effetti nel PIC 16F84 il bit RP1 è sempre a 0 per cui è sufficiente impostare solo RP0
(vedi slide n. 29).
PIC 16F84
D. Ch. 11
I Registri Speciali del Banco 0:
Il Registro TMR0 è un registro contatore che può funzionare in modalità timer oppure in modalità counter:
•In modalità counter esso conta gli impulsi applicati dall’esterno al pin RA4/T0CKI del portA. Si può anche inizializzare TMR0 ad un valore desiderato e poi farlo incrementare fino a creare un overflow; questo overflow può essere utilizzato per generare un interrupt(vedi registro INTCON, slide 15).
•Nella modalità timer il TMR0 conta gli impulsi di un segnale interno avente frequenza pari ad ¼ del segnale del clock. E’ possibile dividere ulteriormente questa frequenza per 2, per 4,… per 256 per ottenere impulsi del timer lunghi; questa funzione prende il nome Prescaler.Il Prescaler si attiva attraverso i bit PS2 PS1 PS0 del registro OPTION.
I Registri PORTA e PORTB contengono il valore dei vari pin delle Porte. Se i pin sono configurati come ingressi essi assumono il valore della periferica collegata mentre se i pin sono configurati come uscite il loro valore è stabilito dal programma.
I pin di questi registri possono essere trattati sia singolarmente sia come un’unica parola
Il Registro STATUS, appartiene sia al banco 0 che al banco 1; è utilizzato per la selezione del Banco 0 o Banco 1
Il Registro INTCON appartiene sia al banco 0 che al banco 1; viene utilizzato esclusivamente per la gestione degli interrupt.
I Registri EEDATA e EEADR abilitano la memoria dati
I Registri PCLATH (5 bit) e PCL (8 bit) contengono i 13 bit (i 5 alti + gli 8 bit bassi) del Program Counter.
I Registri FSR e INDF sono utilizzati nell’indirizzamento indiretto.
PIC 16F84
D. Ch. 12
Alcuni Registri Speciali del Banco 1:
Il PIC 16F84 per gestire le linee di I/O utilizza una coppia di registri per ciascuna Porta: tali
registri sono TRIS A e PORT A per la porta A e TRIS B e PORT B per la porta B (di ogni
coppia però uno risiede nel banco 0 e uno nel banco 1)
I Registri TRIS A e TRIS B sono utilizzati per configurare le porte A e B (o i loro singoli
bit) in ingresso o in uscita:
Mettere un pin di questi registri a 0 implica configurare il corrispondente pin della porta
come uscita mentre mettere un pin a 1 implica configurare il corrispondente pin della
porta come ingresso;
p.e. TRIS B: 00010011 configura B4, B1 e B0 come input mentre tutti gli altri saranno
configurati come out. (in tal caso se volessimo collegare un LED lo collegheremo su B7 o
su B6 o su B5 oppure su B3 o su B2).
I Registri EECON1 e EECON2 abilitano la memoria dati.
Il Registro OPTION viene utilizzato prevalentemente per programmare il funzionamento
del registro TMR0.
PIC 16F84
D. Ch. 13
Il Registro STATUS:
il bit RP0 è utilizzato per la selezione del Banco 0 o del Banco 1;
IRP e RP1 sono sempre a 0;
TO: è attivo basso, manda il WDT in time out; (*)
PD: attivo basso, si attiva quando viene eseguita una istruzione di sleep; (**)
Z: flag di zero, si attiva (a 1) quando il risultato di un’operazione aritmetica o logica è zero;
DC: indica se c’è riporto o prestito sul bit meno significativo;
C: indica se c’è riporto o prestito sul bit più significativo.
(*) La funzione WDT (Watchdog time) rileva eventuali blocchi della CPU, resetta il PIC e
lo riavvia per farlo riprendere la normale esecuzione del programma.
(**) Lo Sleep Mode o Power Down Mode è uno stato di funzionamento in Stand by in cui
gran parte della circuiteria del PIC viene disalimentata in attesa di uno sporadico evento
esterno (si pensi alla premuta di un tasto del telecomando); il PDM è utile per limitare il
consumo di energia che farebbe scaricare la pila durante i lunghi tempi di inattività del PIC.
PIC 16F84
D. Ch. 14
* *** ***** ***
Il Registro INTCON viene utilizzato esclusivamente per la gestione degli interrupt.
Nel PIC 16F84 esistono 3 possibili modalità di attivazione di interrupt:
a) l’overflow del TMR0: viene abilitata attraverso il pin TOIE;
b) l’attivazione del segnale RB0/INT: viene abilitata attraverso il pin INTE;
c) i segnali (cambio del livello) delle linee RB4, RB5, RB6, e RB7: viene abilitata
attraverso il pin RBIE;
Esistono anche 3 pin “FLAG” che segnalano l’avvenuta interrupt (e che devono essere
azzerati via software prima di uscire dalla subroutine di gestione):
TOIF segnala l’avvenuta interrupt da RMR0;
INTF segnala l’avvenuta interrupt da RB0/INT;
RBIF segnala l’avvenuta interrupt da RB4÷RB7.
GIE: se attivo (1) abilita gli interrupt (qualsiasi tipologia). Questo pin viene disattivato (0)
automaticamente subito dopo il verificarsi del interrupt affinchè sia possibile che
avvenga un nuovo interrupt; a questo è preposta l’istruzione RETFIE che chiude ogni
subroutine di gestione di un interrupt.
EEIE: abilita la scrittura in memoria dati.
PIC 16F84
D. Ch. 15
Il Registro OPTION viene utilizzato prevalentemente per programmare il
funzionamento del registro TMR0; infatti a questo sono dedicati ben 6 bit del registro
(PS0, PS1, PS2, PSA, TOSE e TOCS).
PS2, PS1, PS0 selezionano il rapporto di prescaler ( il divisore di fT);
PSA stabilisce se il prescaler verrà utilizzato da TMR0 oppure da watch dog timer (WDT);
TOSE stabilisce se TMR0 funzionerà con il fronte positivo oppure negativo del clock;
TOCS stabilisce se come clock del registro TMR0 sarà utilizzato il fronte di un segnale
esterno applicato a RA4/TOCK1 oppure il clock interno al pic.
INTEDG stabilisce se l’interrupt RB0/INT sarà abilitata con il fronte positivo oppure
negativo;
RBPU abilita o disabilita i resistori di pull-up interni della porta B.
PIC 16F84
D. Ch. 16
LE ISTRUZIONI DEL PIC
Ogni istruzione del PIC corrisponde ad un opcode a 14 bit.
Esempio:
00 0001 0000 0000B ⇔ 0100H ⇔ CLRw
(notaz. Bin) (notaz. Hex) (cod. mnemonico Assembler)
(Il 16F84 ha 37 opcode diversi)
Ogni istruzione del PIC corrisponde ad un codice operativo a 14 bit.
Ogni codice operativo viene memorizzato in una memoria di programma costituita
da una EEPROM di 1024 locazioni a 14 bit (come già detto nella slide 10) in cui
ogni locazione, infatti, contiene una sola istruzione.
PIC 16F84
D. Ch. 17
LE ISTRUZIONI DEL PIC 16F84 (1 / 3)
(Letterali e di Controllo)
Le istruzioni del PIC sono raggruppate in tre tipologie: letterali e di controllo, orientate al byte e orientate al bit.
a) Istruzioni letterali e di controllo; quasi tutte operano su grandezze alfanumeriche e molte fanno uso del registro accumulatore W. Durano tutte 1 ciclo macchina (1µs) pari a 4 cicli di clock ad eccezione delle istruzioni di salto che durano 2 cicli (p.e. CALL, GOTO, RETURN,..)
Esaminiamo alcune delle istruzioni letterali:
MOVLW 0C: sposta la costante 0C(hex) nel registro W.
MOVLW B’00001011’: sposta la costante 00001011(bin) nel registro W.
MOVLW D’11’: sposta la costante 11(dec) nel registro W.
MOVLW 0xFF: sposta la costante FF(hex) nel registro W (per esigenze del compilatore, quando la costante inizia per lettera si fa precedere per 0x
oppure per 0).
ADDLW 03: addiziona la costante 03h al contenuto del registro W.
GOTO 10A: salta nella locazione 10A della memoria programma.
PIC 16F84
D. Ch. 18
LE ISTRUZIONI DEL PIC 16F84 (2 / 3)
(Orientate al Byte)
b) Istruzioni orientate al byte; operano con parole lunghe 1 byte e spesso sul contenuto
dei registri; molte fanno uso del registro accumulatore W.
Esaminiamo alcune delle istruzioni orientate al byte tenendo presente che f è un registro
generico a cui possiamo dare un nome qualsiasi e a cui il compilatore attribuirà il giusto
indirizzo e che d è un parametro binario: se d=0 il risultato dell’istruzione verrà posto in W
mentre se d=1 il risultato sarà posto in f stesso).
MOVWF 06: sposta il contenuto di W nel registro con indirizzo 06 (ossia scrivi il
contenuto di W nel PortB).
DECFSZ 1A: decrementa il contenuto del registro alla locazione 1Ah e salta la prossima
istruzione se il contenuto è zero.
SUBWF 0A,0: sottrai il contenuto di W dal registro 0A0h e metti il risultato in W.
ADDWF 03,1: addiziona il contenuto di W al contenuto del registro 03h e il risultato
mettilo in 03h.
PIC 16F84
D. Ch. 19
LE ISTRUZIONI DEL PIC 16F84 (3 / 3)
(Orientate al bit)
c) Istruzioni orientate al bit; operano sul contenuto del singolo bit dei registri.
(f è un registro generico, b è il bit su cui opera l’istruzione)
BCF 06,3: metti a 0 il bit 3 del registro alla locazione 06 ossia metti a 0 il bit RB3.
BSF 06,3: metti a 1 il bit RB3.
BTFSC 03,2: esegui il test sul bit 2 del registro alla locazione 03 ossia testa il bit ZERO del
registro STATUS e se lo trovi a zero salta la prossima istruzione.
Le due istruzioni particolari del PIC 16F84:
TRIS f [dove f può essere 05 (PORT A) oppure 06 (PORT B)]; questa istruzione trasferisce
il contenuto di W nel registro TRIS A o TRIS B e consente di configurare i pin delle
porte in ingresso o in uscita (vedi slide n. 29).
OPTION: trasferisce il contenuto di W nel registro OPTION in modo da evitare lo scambio
di banco tramite RP0 di STATUS.
PIC 16F84
D. Ch. 20
(File testo)
(mnem. ⇒ opcode)
Differente per ogni tipo di
PIC
Notepad.exe
Edit.exe
Word (file.testo)(P16F84.INC)
(MPASMWIN.EXE)
Trasforma il mnemonico
in opcode
(Contiene i codici operativi)(Contiene i codici operativi)
La Compilazione e la Programmazione
Programmare in assembler è una attività da Progettista; l’assembler è un linguaggio
“dedicato” alla particolare macchina (µprocessore o µcontrollore) e dunque il Progettista
deve conoscere bene l’architettura dell’hardware per stilare adeguatamente il programma.
La programmazione del PIC richiede due fasi: la costruzione di un hardware e la gestione di
due software per la Compilazione e la Programmazione vera e propria.
La Compilazione:
Il programma in assembler è scritto in linguaggio alfanumerico e, affinchè possa venire
riconosciuto dalle circuiterie dovrà essere tradotto in codice macchina. A questo provvede
un apposito software detto “Assemblatore” (nel nostro caso MPASMWIN.EXE).
Tutti i microcontrollori della famiglia dei PIC, anche se ciascuno con la propria architettura
interna, hanno lo stesso set di istruzioni; per questo motivo è possibile utilizzare un unico
assemblatore al quale però bisognerà fornire, insieme al file sorgente (che contiene il
“programma utente”), anche un file con le specifiche del PIC da programmare. Questo file
ha estensione INC e nel nostro caso è il “P16F84.INC”.
L’assemblatore fornisce più file, alcuni di servizio come il XX.ERR attraverso la lettura del
quale il Progettista può risalire agli errori di compilazione (fornisce anche la linea del
sorgente assembler in cui sono stati rilevati gli errori) e quindi rimuoverli e come il
XX.LST contenente il listato degli OP. COD. in formato testo. Infine il file XX.HEX
contenente i codici operativi delle istruzioni sarà l’unico ad essere trasferito all’interno della
memoria programma del PIC attraverso una successiva fase detta di “Programmazione”.
PIC 16F84
D. Ch. 21
LA COMPILAZIONE ASSEMBLER
Fig. 1
Fig. 2
La compilazione assembler è affidata al programma MPASM della MICROCHIP. Una volta
lanciato il programma MPASMWIN.EXE si apre la finestra di figura 1 dove dopo aver
selezionato il nostro file sorgente, il processore utilizzato e i file che desideriamo generare
avvieremo la compilazione clickando su “Assemble”.
L’assemblatore eseguirà la compilazione e fornirà il report di figura 2; se ci saranno errori la
striscia colorata sarà rossa e ci sarà anche il numero di errori da correggere.
PIC 16F84
D. Ch. 22
IL PROGRAMMATORE
Il programmatore è un circuito molto semplice contenente pochi semplici componenti tra cui
uno zoccolo “DIL” con adeguato numero di pin (18 nel caso del 16F84) e un connettore
seriale per la connessione alla porta del computer.
Per programmare il PIC basta inserirlo sullo zoccolo del programmatore, collegarlo alla
porta seriale del computer e lanciare il software di programmazione.
Il circuito programmatore non necessita di alimentatore perché viene alimentato dalla porta
COM selezionata del computer.
Prestare sempre attenzione all’inserimento del PIC nello zoccolo del programmatore anche
se il rischio di danneggiarlo durante la programmazione, nel caso di errato inserimento, è
basso viste le modeste intensità di corrente in gioco.
PIC 16F84
D. Ch. 23
LA PROGRAMMAZIONE DEL PIC
La Programmazione:
Dopo aver inserito il PIC nello zoccolo del programmatore e collegato quest’ultimo alla
seriale del PC lanceremo il software NTPicprog.exe. Si apre la finestra di dialogo nella
quale dobbiamo impostare alcuni parametri come mostrato in figura: il mode 16C84 va bene
anche per il 16F84, mentre come COM dovrà essere selezionata quella disponibile ed
effettivamente adoperata, dobbiamo indicare il tipo di clock che sarà utilizzato
nell’applicativo finale (oscillatore RC, circuito con risonatore ceramico (LP), quarzo a
media frequenza (XT), o quarzo high speed (HS)).
A questo punto lanciamo “Load” per caricare il file XX.HEX e comandiamo “Write” per
trasferire i dati nel PIC.
Talvolta è utile precedere le operazioni dal comando “Erase” che pulisce la memoria del
programma mentre è sempre consigliabile controllare l’avvenuta scrittura facendo
un’operazione di “Read”.
Al termine della programmazione non resta che staccare il PIC programmato dallo zoccolo
del programmatore ed inserirlo nel circuito di destinazione finale.
PIC 16F84
D. Ch. 24
Riepilogando..
per programmare il PIC:
Per programmare il PIC:
• Scrivere il file source con Blocco Note o altro editor(se si usa word salvare come
XX.txt) e salvarlo come XXX.ASM
• Copiare il file XXX.ASM nella cartella Pasmwin
• Lanciare il programma Mpasmwin (file “exe”); nella finestra cercare il file XXX.ASM
(Browse) e cliccare su “Assemble”.
Verranno creati i file:
� XXX.COD
� XXX.ERR
� XXX.HEX
� XXX.LST
• Controllare il file ERR e correggere eventuali errori.
• Inserire il PIC sul programmatore e collegarlo sulla seriale del PC (COM1,
COM2,….)
• Lanciare NTPicprog (Scegliere COM1 o COM2…Scegliere XT e PuT
• Eseguire i comandi:
� Erase
� Load (il file XXX.HEX)
� Write
• Prelevare infine il PIC dal programmatore ed inserirlo nel circuito a cui è destinato.
PIC 16F84
D. Ch. 25
Fig. (a)
Hardware standard di base
Fig. (b)
Per presentare lo schema hardware applicativo di base faremmo riferimento allo “schema
funzionale” del PIC; Questa è una parte comune a tutti i PIC della famiglia. La parte
standard riguarda la parte sinistra dello schema che sostanzialmente contiene le circuiterie
del Clock e del Reset.
Come circuito di Clock, abbiamo già anticipato, utilizzeremmo un quarzo a 4MHz. Nella
tabella di figura (b) sono riportati i valori consigliati per i condensatori nel caso si intenda
usare un cristallo diverso.
Il circuito di Reset è un classico circuito RC; i valori in figura sono indicativi: il
condensatore deve essere del ordine di qualche centinaio di nF mentre il Resistore di
qualche decina di KOhm.
PIC 16F84
D. Ch. 26
Come collegare una semplice Periferica
Il collegamento delle periferiche
Le 13 linee del PIC dedicate all’I/O presentano livelli compatibili TTL e sono in grado,
quando configurate in uscita, di erogare correnti (di source e drain) fino a 25 mA.
Prestare attenzione al pin RA4 al quale bisogna collegare un resistore di pull up esterno se
lo si vuole utilizzare come uscita perché è “open drain”.
In figura sono riportati alcuni possibili schemi applicativi per collegare un LED, uno switch,
un relè.
Sulle linee del PIC può essere collegata qualsiasi periferica, ovviamente opportunamente
interfacciata.
PIC 16F84
D. Ch. 27
Il REGISTER FILE
( è un insieme di locazioni RAM denominate “registri” )
10 + 10
Registri speciali
Per accedere alla pag 1 e
per uscirne, si fa uso del
bit ausiliario RP0:
bsf STATUS, RP0
bcf STATUS, RP0
48 byte
direttamente
indirizzabili
Riportiamo qui un riepilogo dei registri speciali del PIC perché saranno coinvolti nella
stesura dei software applicativi.
PIC 16F84
D. Ch. 28
Procedure software di base 1/4
bsf STATUS, RP0
movlw 11111110B
movwf TRIS B
bcf STATUS, RP0
Fig. ( a )
bsf PORT B, 0
bcf PORT B, 0
Fig. ( b )
loop
call delay
btfsc PORT B,0
goto spegni
bsf PORT B,0
goto loop
spegni bcf PORTB, 0
goto loop
Fig. (c )
Primi passi
Per eseguire i primi passi nella programmazione assembler assumiamo di voler far lampeggiare (ininterrottamente) un LED applicato sul pin RB0 del PIC.
Con la procedura di figura (a) abbiamo configurato in uscita il bit 0 del PORT B; la prima istruzione “bsf STATUS,RP0” fa accedere al banco 1 dove alloggia TRISB; la seconda e la terza istruzione caricano la parola binaria 11111110 nel registro TRISB (tramite il registro W) configurando tutti i pin in input tranne l’RB0 che è messo in output; l’ultima istruzione fa ritornate al banco 0.
Le due istruzioni di figura (b), in ordine, settano e resettano il bit 0 del PORT B cosi che il LED collegato potrà accendersi e spegnersi. A questo punto facciamo due osservazioni:
1) bisogna testare lo stato del pin, in modo da far accendere il LED se èspento e farlo spegnere se è acceso, altrimenti si rischia di tenerlo sempre acceso o sempre spento (istruzione “btfsc Port B, 0”);
2) affinchè il lampeggiamento sia visibile bisognerà lasciar acceso e spento il LED per un tempo sufficientemente prolungato (istruzione “call delay”).
Queste due problematiche vengono risolte nel listato della figura (c). In questa procedura notiamo anche il concetto di “label” (etichetta), di “loop”, del uso di “salto” (goto) e di chiamata di una “subroutine” (call delay).
PIC 16F84
D. Ch. 29
Procedure software di base 2/4
( Delay )
SI
COUNT = 0
DECREMENTA COUNT
RETURN
SI
NO
Fig. (a )
Clrf COUNT
Dec Decfsz COUNT, 1
Goto Dec
Return
Fig. (b)
Per creare un ritardo, problema molto frequente in programmazione, si usa far eseguire
ripetutamente per un certo numero di volte una o più istruzioni.
In figura (a) consideriamo il generico registro “COUNT” di 8 bit (una locazione della
RAM), lo carichiamo con 00000000B e lo facciamo decrementare fin quando, passando da
255, 254,.., non arrivi di nuovo a 0. Al termine saranno eseguite 256 istruzioni “decfsz F”
(da 1µs) e 256 istruzioni “goto” (da 2 µs) per un tempo totale di circa 770 µs.
PIC 16F84
D. Ch. 30
Procedure software di base 3/4
Clrf COUNT+1
Clrf COUNT
Dec decfsz COUNT,1
goto Dec
decfsz COUNT+1,1
goto Dec
Return
Fig.( b )
Fig. ( a )
RETURN
N0
COUNT+1 = 0
COUNT = 0
DECREM. COUNT = 0
DECREM. COUNT+1 = 0
N0
SI
SI
In figura (a) sono eseguiti due cicli “annidati” che creano un ritardo di circa 0,5 sec
sufficienti affinchè l’occhio umano percepisca il lampeggiamento (0,5 s acceso e 0,5 s
spento).
PIC 16F84
D. Ch. 31
Procedure software di base 4/4
(direttive obbligatorie)
PROCESSOR 16F84
RADIX DEC
INCLUDE “P16F84.INC”
LED EQU 0
ORG 0CH
COUNT RES 2
ORG 00H
Le direttive non sono istruzioni e non hanno un corrispondente codice operativo; sono delle
semplici dichiarazioni che contengono indicazioni per il compilatore.
PROCESSOR 16F84: indica al compilatore qual è il processore in uso;
RADIX DEC: informa il compilatore che i numeri senza indicazione specifica vanno intesi
decimali;
INCLUDE P16F84.INC: informa il compilatore che troverà incluso nel source anche il file
“P16F84.INC”;
LED EQU 0: questa direttiva significa che la parola LED equivale a 0; potrebbe essere
usata nello scrivere “bsf PORTB, LED” anziché “bsf PORTB, 0” (e analogamente “bcf
PORTB, LED” anziché “bcf PORTB, 0”). Questo facilita la correzione del programma nel
caso volessimo spostare il Led su un altro pin del PORT.
COUNT RES 2: significa che vogliamo riservare 2 locazioni di RAM per i due contatori
(COUNT e COUNT+1) a partire dall’indirizzo 0CH dichiarato con la direttiva ORG 0CH.
Le locazioni riservate saranno 0Ch e 0DH;
ORG 00H: indica al compilatore l’origine (inizio) della EEPROM memoria di programma.
PIC 16F84
D. Ch. 32
PROCESSOR 16F84
RADIX DEC
INCLUDE "P16F84.INC“
LED EQU 0
ORG 0CH
Count RES 2
;Reset Vector
;Punto di inizio del programma al reset della CPU
ORG 00H
bsf STATUS,RP0
movlw 11111110B
movwf TRISB
movlw 0001111B
movwf TRISA
bcf STATUS,RP0
bsf PORTB,LED
Loop call Delay
btfsc PORTB,LED
goto Spegni
bsf PORTB,LED
goto Loop
Spegni bcf PORTB,LED
goto Loop
;Subroutine
Delay
clrf Count
clrf Count+1
Dec decfsz Count,1
goto Dec
decfsz Count+1,1
goto Dec
return
END
Lampeggiatore ad un LED
Le scritte precedute da “;” sono commenti e non vengono prese in considerazione
dal compilatore.
L’istruzione “return” chiude la subroutine e fa tornare nel main program mentre
l’istruzione END chiude tutto il programma.
PIC 16F84
D. Ch. 33
Esercizio applicativo
4 SW e 4 LED
Esercizio applicativo
Sia dato il circuito rappresentato in figura:
Si hanno quattro LED e quattro switch applicati al PORT B del PIC 16F84;
Scrivere un programma in assembler che testi lo stato degli interruttori e faccia accendere i
LED in modo che ogni LED si accenda solo se viene premuto il suo corrispondente SW.
Programmare il PIC e realizzare l’applicativo.
top related