...

Microchip PIC16C5X

by user

on
Category: Documents
30

views

Report

Comments

Transcript

Microchip PIC16C5X
[email protected]
PIC 16C5X – generalita’
(PIC16c5x.doc)
INTRODUZIONE
MICROCHIP PIC
•
•
•
•
Architettura Harvard
Cpu tipo Risc
Memoria di programma solo interna per molti modelli
Ram usata solo come registro
L'
architettura dei microcontrollori di Microchip è particolare, si basa su una Cpu strettamente di tipo
Risc, con separazione tra bus dati e bus istruzioni (tipo Harvard), nessuna possibilità di indirizzare
memoria esterna e un elevato numero di registri interni, che costituiscono di fatto l'
unica area di
Ram utilizzabile.
La Cpu utilizzata, che tratta dati a 8 bit, è di tipo strettamente Risc. Infatti, nella maggior parte dei
modelli, il numero totale di istruzioni riconosciute è di solo 35. La semplicità della Cpu la rende
molto veloce, in quanto le istruzioni vengono eseguite di solito in un ciclo macchina, solamente i
salti impiegano più tempo.
L'
architettura è di tipo Harvard, con il bus dati a 8 bit e il bus istruzioni da 12 a 16 bit, a seconda
della famiglia. Tranne il modello 17C42, tutti gli altri microcontrollori di Microchip non hanno la
possibilità di gestire memoria esterna. Ciò limita la lunghezza del programma eseguibile, in quanto
la lunghezza del programma che può risiedere nella memoria interna va da 512 a 2024 parole di
istruzioni. Si noti che in compenso il codice macchina è molto compatto, in quanto la larghezza di
parola per le istruzioni va da 12 a 16 bit.
Tutta la Ram interna è vista come un insieme di registri da 8 bit, da 80 a 248 registri a seconda dei
modelli, ai quali si affiancano dei registri speciali nei modelli dotati di periferiche interne.
La disponibilità di molti registri rende molto veloce le commutazioni di contesto e le risposte alle
interruzioni, ma la profondità dello stack è molto ridotta, da 2 livelli a 16 livelli. La
programmazione è molto semplice, sia per il limitato numero di istruzioni disponibili sia per la
quasi assoluta intercambiabilità dei registri. Praticamente tutte le operazioni aritmetiche e logiche
possono avere come operandi due registri qualunque. E prevista una modalità di indirizzamento
indiretto e la possibilità di spostare dati registrati dall'
area delle istruzioni ai registri dati.
I modelli di base della famiglia Pic sono completamente privi di ingressi per segnali di interruzione,
mentre i modelli di fascia media e alta hanno molteplici ingressi, alcuni dei quali, collegati
direttamente alle periferiche interne, come il timer.
A parte il timer, sempre presente in una delle sue versioni in tutti i modelli, le altre periferiche
disponibili in alcuni modelli sono dei moduli per le comunicazioni seriali, per la generazione di
segnali Pwm e il convertitore A/D da 8 bit.
Tutti i microcontrollori sono disponibili nella versione OTP, nelle versioni a basso consumo e con
tensione di alimentazione ridotta, sino a 2V, mentre solo per alcuni modelli è prevista anche la
versione con Rom interna oppure con Eeprom.
1
[email protected]
PIC 16C5X – generalita’
(PIC16c5x.doc)
CAPITOLO PRIMO
PIC16C5x
CARATTERISTICHE TECNICHE
Set di istruzioni limitato
Massima frequenza di clock 20 Mhz
Eprom interna da 512 bytex12bit a 2Kx12bit
SRAM interna costituita da 25 a 72 registri a 8
bit
Indirizzabili sia direttamente sia
indirettamente
7 registri dedicati
2 livelli di stack
Da 12 a 20 porte bidirezionali programmabili
Prescaler interno a 8 bit
Porte di I/O programmabili via software e con
continuità anche durante il normale
funzionamento, per ogni singolo bit sia in
input sia in output
Divide o conta il clock interno;
Divide o conta un segnale digitale che giunge
dall’esterno;
Oscillatore interno
Watchdog
Controlla che la CPU non sia bloccata e,
eventualmente forza con un reset interno la
riesecuzione del programma.
Eprom mascherabile alle lettura esterna
SLEEP per risparmio di corrente
Range di funzionamento 3-5.5 V
Consumo < 2 mA a 5V 4 Mhz
15 uA a 3V 32 Khz
< 3 uA in stand-by
IL PIC E’ UN CONTROLLORE A 8 BIT, MA LE ISTRUZIONI VENGONO CODIFICATE,
INSIEME AGLI OPERANDI IN UNA AREA DI DODICI BIT.
BUS DATI=8 BIT
BUS ISTRUZIONI=12÷16 BIT (a seconda della famiglia utilizzata)
2
[email protected]
PIC 16C5X – generalita’
(PIC16c5x.doc)
1.1 Le caratteristiche generali..
• I microcontrollori PIC possiedono un set di istruzioni molto ridotto che, se da un lato limita
l'
operatività, dall'
altro ne facilita la velocità esecutiva.
• La EPROM interna può variare da 512 byte x 12 bit a 2K x 12 bit, a seconda del modello di PIC
scelto. In molte applicazione 512 byte di EPROM sono più che sufficienti, in quanto non
vengono mai completamente utilizzati
• Esiste, la possibilità di mascherare il programma memorizzato per mantenere la segretezza sul
lavoro svolto dato che la mascheratura inibisce la copiatura del programma.
• La RAM interna, è formata da un certo numero di registri a otto bit, indirizzabili sia direttamente
che indirettamente. Sono a disposizione altri sette registri dedicati, il cui utilizzo verrà analizzato
in seguito.
• I livelli di stack, cioè il numero di chiamate a subroutine annidate, è fissato in due nei device di
tipo 16C5x.
• A seconda del dispositivo scelto, le porte di ingresso/uscita possono essere 12 oppure 20, tutte
programmabili via software e con continuità, anche durante il normale funzionamento, per ogni
singolo bit sia in input che in output.
• Tutti i tipi di PIC possiedono il watchdog (letteralmente tradotto come " cane da guardia "), il
quale controlla che la CPU ( termine con cui talvolta sono chiamati i microcontrollori) non sia in
qualche modo bloccata e eventualmente, forza con un reset interno la riesecuzione del
programma.
• Tutti i PIC possiedono il prescaler che serve per dividere o contare il clock interno oppure un
segnale digitale che giunge dall'
esterno.
• Ci sono quattro diversi tipi di oscillatori previsti per i PIC, anche se in commercio se ne trovano
essenzialmente due: quello quarzato, che offre le migliori prestazioni e quello a rete RC.
1
1
9
RA 2
RA 3
R T C C
M CL R
R B 0
R B 1
R B 2
R B 3
R
R
OS
OS
A
A
C
C
R
R
R
R
B
B
B
B
P I C 16 C5 4
P I C 16 C5 6
1
0
1
2
+
7
6
5
4
18
10
14
R
+
N
N
R
R
R
R
R
R
R
R
R
T C C
C
C
A
A
A
A
B
B
B
B
B
0
1
2
3
0
1
2
3
4
M C L R
O S C 1
O S C 2
R C 7
R C 6
R C 5
R C 4
R C 3
R C 2
R C 1
R C 0
RB 7
RB 6
RB 5
28
15
PIC 16 C5 5
PIC 16 C5 7
Fig.. 2 Pedinatura di alcuni tipi di PIC 16C5x
1.2 Applicazioni dei microcontroller
I PIC si inseriscono nella fascia dei microcontroller, fornendo un’elevata versatilità, un ottimo
rapporto prezzo / prestazioni e semplicità di programmazione; le dodici/venti linee digitali possono
pilotare display, tastiere, relè e altri dispositivi di I/O. Dunque i PIC trovano naturale applicazione
nell’automazione industriale e nella strumentazione di analisi e/o misura.
3
[email protected]
PIC 16C5X – generalita’
(PIC16c5x.doc)
1.3 Descrizione della architettura interna dei PIC 16C5x.
In figura 3 è mostrato lo schema a blocchi dei microcontrollori modello PIC 16C5x che verrà di
seguito analizzato.
Fig.. 3 Architettura
La prima componente da vedere è la EPROM: in tale memoria il PIC immagazzina il programma
scritto dal progettista. La capacità della memoria potrà essere di 512 byte, di 1K oppure di 2K, a
seconda del device scelto. Ogni cella della EPROM è di 12 bit.
L'indirizzamento dell'
istruzione viene garantito da un registro detto PROGRAM COUNTER ( PC )
che ha il compito di indirizzare una cella della EPROM; nello svolgimento del suo compito il PC
tiene conto di alcuni elementi fondamentali:
• il primo di questi è la cella da puntare dopo un reset (ad esempio quando viene data
l'
alimentazione) inizialmente il PC punta alla cella di indirizzo più alto; nel caso del PIC16C54
punta all’ indirizzo 1FFh (esadecimale).
• Altro elemento fondamentale è il livello di stack in cui il PIC si trova; ci sono due registri,
STACK1 e STACK2, che memorizzano un indirizzo in base a ogni istruzione CALL (chiamata a
soubrutine) con sequenza di tipo LIFO ( Last In First Out ). Quindi, se nel programma il PIC
trova una istruzione CALL, inserisce in STACK1 l'
indirizzo attuale e nel PC viene memorizzato
l'
indirizzo a cui saltare. Se successivamente viene trovata un'
altra istruzione CALL, il PIC
memorizza il valore registrato in STACK1 dentro STACK2 e in STACK1 inserisce il nuovo
valore attuale. Viceversa, a ogni istruzione RETLW (ritorno da soubrutine), viene riportato nel
PC il valore presente nello STACK1 e, dopo, in STACK1 viene trasferito il valore di STACK2.
• Ultimo elemento da tenere presente è il " ciclo di fetch ". Ogni CPU, infatti, ha il seguente modo
di procedere nel suo lavoro: il PC punta a una cella di memoria che contiene l'
istruzione da
eseguire successivamente, che viene immagazzinata nel REGISTRO ISTRUZIONE. Da qui
4
[email protected]
PIC 16C5X – generalita’
(PIC16c5x.doc)
passa alla zona attiva di DECODIFICA ISTRUZIONE e viene eseguita, incrementando di nuovo
il PC. Il ciclo di fetch consiste nel far puntare il PC alla cella di memoria che contiene
l’istruzione successiva a quella in esecuzione e di immagazzinarla nel REGISTRO
ISTRUZIONE. Tale modo di procedere consente di risparmiare tempo. L’istruzione viene
eseguita al Q1 successivo, come mostrato in figura 4.
Q1
Q2
Q3
Q4
Q1
Q2
Q3
Q4
Q1
Q2
OSC1
FASE 1
FASE 2
FASE 3
FASE 4
PC
PC
PC + 1
Fetch istruz. PC
Execute istruz. PC - 1
PC + 2
Fetch istruz. PC + 1
Execute istruz. PC
Fetch istruz. PC + 2
Execute istruz. PC + 1
Fig.. 4 Diagramma temporale del ciclo di fetch
• Infine, dato che i vari tipi di PIC hanno memoria di diversa lunghezza, anche i bit del PC variano
di conseguenza, come è possibile vedere nella mappa della memoria di figura 5: per indirizzare
tutti e quattro i banchi del PIC16C57 sono necessari due bit in più rispetto al PIC 16C54.
PIC16C54-------PAGE 0
PIC16C55-------PAGE 0-1
PIC16C56-------PAGE 0-1
PIC16C57-------PAGE 0-3
PIC16C54-------512 BYTE
PIC16C55-------1K
PIC16C56-------1K
PIC16C57-------2K
000
PAGE 0
0FF
100
PAGE 1
2FF
300
PAGE 2
4FF
500
PAGE 3
6FF
700
1FF = 1 1111 1111 = 511
200
3FF = 0011 1111 1111 = 1023
400
5FF = 0101 1111 1111 = 1535
600
7FF = 0111 1111 1111 = 2047
Fig.. 5 Organizzazione della memoria SRAM
5
[email protected]
PIC 16C5X – generalita’
(PIC16c5x.doc)
Tornando alla figura 3, si può notare che dopo la decodifica è possibile lavorare con i registri
generali oppure con il registro W (Word).
Quest'
ultimo rappresenta uno dei registri più frequentemente usati dal programmatore poiché è
coinvolto in molte istruzioni. Ad esempio, per utilizzare la ALU (Aritmetic Logic Unit), che è la
componente che esegue le operazioni logiche, è necessario passare per W.
Lo stato successivo a ogni operazione del PIC viene memorizzato nel registro di STATO, visibile in
figura 6.
7
6
PA2
PA 1
5
PA0
4
3
TO
PD
2
Z
1
DC
0
C
C CARRY BIT
DC DIGIT CARRY BIT
Z ZERO BIT
PD POWER DOWN BIT
TO TIME-OUT BIT
PA0..PA2 PAGE SELECT
REGISTRO DI STATO
Fig.. 6 Registro di stato
• I tre bit PA0, PA1 e PA2, servono per selezionare i banchi possibili dei registri dei vari PIC;
• il bit TO (time out) viene settato a uno durante il reset di alimentazione e dalle istruzioni
CLRWDT e SLEEP, mentre viene resettato da un time-out del registro WATCHDOG;
• il bit di PD (power down) è settato a 1 dalla sola istruzione CLRWDT e resettato dall'
istruzione
SLEEP;
• Il bit Z (zero), è settato a 1 solo se il risultato dell'
ultima operazione eseguita è zero;
• I due bit DC (digit carry) e C (carry) sono, invece, settati se sopravviene un overflow.
Osservando ancora la figura 3, si osserva che alla ALU sono connessi i registri F5, F6, F7, e i
rispettivi TRIS_A, TRIS_B e TRIS_C. Questi registri controllano lo stato delle porte di ingresso/
uscita (I/O) e in figura 7 viene mostrata la struttura di un pin di I/O del PIC.
Il flip-flop in alto corrisponde a un bit del registro relativo a una porta ( ad esempio la A ), mentre
quello in basso corrisponde a un bit del registro TRIS_A ( sempre in riferimento alla porta A ).
E'semplice intuire che quando il segnale sul clock del flip-flop in basso ha un fronte ascendente, il
flip-flop memorizza sull'
uscita Q il valore letto sull'
ingresso D. Supponiamo che questo sia 1 e,
quindi, Q si porta a 1 e il P-MOS viene interdetto e isola il pin di input dal positivo. Inoltre, essendo
Q negato uguale a zero, anche il transistor N-MOS viene interdetto, isolando il pin di ingresso anche
dal negativo. A questo punto il pin in questione è stato programmato per funzionare da INPUT e
qualsiasi valore tenti di scriverci via software viene ignorato.
Il dato di input potrà essere letto con un'
istruzione che abiliti il three-state READ sul buffer di
ingresso al BUS DATI. Supponiamo, invece, che il dato letto sia 0; allora i due transistor verranno
abilitati a funzionare tramite le due porte OR e AND nel seguente modo: la porta AND darà un 1 in
uscita quando il dato letto dal primo flip-flop e zero, mentre darà 1 in caso contrario.
6
[email protected]
DAL BUS DATI
PIC 16C5X – generalita’
(PIC16c5x.doc)
Vdd
D
Q
FLIP/FLOP
WRITE
_
Q
CK
P MOS
PIN DI INPUT/OUTPUT
BUS DATI
READ
DAL REGISTRO W
D
Q
FLIP/FLOP
TRIS f
CK
SET
_
Q
N MOS
Vss
RESET
Fig.. 7 Struttura di un PIN di I/O
Quindi, il transistor N-MOS porterà il pin input / output a massa se il dato immagazzinato nel primo
flip-flop è 0 ( pin configurato come uscita bassa ). Viceversa, si attiverà il transistor P-MOS,
portando il pin di input / output al positivo ( pin configurato come uscita alta ).
In definitiva, si è visto, tornando alla figura 3, che il registro TRIS_A (TRIS_B e TRIS_C) serve a
configurare i vari pin come input oppure come output, anche separatamente (corrispondenza con il
flip-flop in basso), mentre il registro F5 (F6 e F7) viene utilizzato per settare a 1 o a 0 i pin già
configurati come uscita (corrispondenza con il flip-flop in alto) e leggere lo stato di quelli settati
come input.
Il registro FSR serve per indirizzare indirettamente un altro registro.
Il registro PRESCALER è un registro dedicato al conteggio di impulsi che possono arrivarvi sia dal
clock interno che da un pin apposito, il RTCC ( Real Time Clock Counter ). Scopo del registro è
quello di dividere gli impulsi in multipli di 2, fatto molto interessante se si pensa, ad esempio, di
sfruttare il PIC come frequenzimetro o come lettore di rapporti impulso / pausa.
Il registro OPTION viene impiegato per attivare o disattivare il prescaler, per variarne la scala di
riduzione e per decidere se il segnale di RTCC deve essere valutato sul fronte di discesa oppure su
quello di salita. In figura 8 è mostrata bit per bit la struttura del registro OPTION.
7
[email protected]
PIC 16C5X – generalita’
5
4
3
2
1
0
RTS
RTE
PSA
PS2
RS1
RS0
(PIC16c5x.doc)
RTS RTCC SIGNAL SOURCE
RTE RTCC SIGNAL EDGE
PSA PRESCALER ASSIGNMENT BIT
PS2..PS0 PRESCALER VALUE
REGISTRO OPTION
Fig.. 8 Registro OPTION
Il registro WATCHDOG invece, se attivato via software, consente di determinare se la CPU si è
bloccata e in tale situazione, ha il compito di resettare il sistema. Questa funzione è molto utile
specie in impianti dove il funzionamento di un certo circuito deve essere garantito in ogni momento.
Infine, è presente un registro detto di CONFIGURAZIONE che non può essere scritto, ma
solamente letto e che dà informazioni quali il device, il tipo di oscillatore e altre.
Per concludere la spiegazione sui PIC, ne riportiamo in FIGURA 9 la struttura interna in relazione
ai vari banchi di memoria possibili.
7
A
9
6
5
4
3
2
1
0
00
INDIRIZZ. INDIRETTO
01
RTCC
8
PC
03
STATO
04
FSR
05
PORTA A
06
PORTA B
07
PORTA C
CALL
RETLW
A
9
8
7
6
5
4
3
2
1
0
A
9
8
7
STACK 1
6
5
4
3
2
1
0
STACK 2
7
6
5
4
3
2
1
0
TRIS A
TRIS B
TRIS C
REGISTRI
AD USO
GENERALE
ALU
5
4
3
2
1
0
OPTION
W
OF
00
10
11
12
01
30
31
32
3F
1F
BANCO 0
10
11
50
51
52
5F
BANCO 1
7F
BANCO 2
BANCO 3
Fig.. 9 PIC e banchi di memoria
8
[email protected]
PIC 16C5X – generalita’
(PIC16c5x.doc)
1.4 Descrizione delle istruzioni
Premettiamo che il PIC è un controllore ad otto bit, tuttavia le istruzioni vengono codificate,
insieme agli operandi, in un'
area di dodici bit. Ogni istruzione ha una codifica, un codice
mnemonico, l'
eventuale operando e può o meno modificare lo stato del registro di STATO.
La prima operazione che prendiamo in esame è la NOP, ovvero la " no operation ", cioè
quell'
operazione che non modifica in alcun modo lo stato del PIC; vedremo in seguito, che verrà
utilizzato obbligatoriamente per le attese e per ogni tipo di timer. La sua codifica vede tutti i bit a
zero ( 000h ), non ha operandi e non produce cambi di stato, ma semplicemente fa passare un ciclo
in più durante l'
esecuzione di un programma.
Anche l'
istruzione MOVWF non altera il registro di stato del PIC, ma modifica il registro f (cioè il
suo operando) immagazzinandovi ciò che trova nel registro W. Il numero di f potrà variare, a
seconda del device, da zero a un massimo di 1Fh. Questa istruzione può essere utile ad esempio per
settare un registro a un ben definito valore iniziale prima di un determinato conto.
Ci sono poi due istruzioni che resettano il contenuto di W e di un registro f dato come operando e
sono rispettivamente CLRW ( Clear W ) e CLRF ( Clear f ). La chiamata a entrambe fa in modo
che venga modificato il bit numero 2 del registro di STATO; questo bit viene settato a 1 se il
risultato di una istruzione è zero. La codifica per CLRW è 040h, mentre per CLRF è 06fh.
Per valutare le successive istruzioni, fissiamo ora alcune notazioni: f è sempre considerato il numero
di un registro e potrà variare tra 0 e 1fh, d invece indica la destinazione del risultato dell'
operazione,
che potrà essere W se d=0, oppure f se d=1.
Vediamo un istruzione a due operandi, la SUBWF ( SUBtract W From ). Il primo operando indica
il registro da cui sottrarre W e il secondo la destinazione: è possibile, infatti, sottrarre W ad esempio
dal registro 09h e decidere se riscrivere il risultato in 09h oppure in W. La codifica di SUBWF è
08Fh e a istruzione avvenuta vengono modificati i bit C, DC e Z del registro di STATO.
La DECF ( DECrement f ) decrementa il valore che trova nel registro f e pone il risultato in f o in
W. Se il valore iniziale era zero, dopo questa operazione nel registro si troverà FFh. Il codice della
DECF è 0CFh e anche questa modifica il registro di STATO nel bit 2. Può essere usata per
introdurre dei cicli andando poi a testare il bit 2 di questo registro per vedere se si è arrivati a zero.
Esistono due tipiche istruzioni da matematica booleana e cioè la IORWF ( Inclusive OR W and f )
e la ANDWF ( AND W and f ) che, rispettivamente eseguono l'
operazione di or e di and fra W e i
registri indicati come operandi. Il bit 2 del registro di STATO viene modificato in conseguenza. Le
codifiche per le due istruzioni sono, rispettivamente, 10Fh e 14Fh.
Come le precedenti, anche XORWF ( eXclusive OR W and f ) compie un operazione booleana e
cioè l'
or esclusivo tra W e il registro f. Il suo codice operativo è 18Fh e anch'
essa modifica il
registro di STATO.
Le ultime tre operazioni di tipo booleano e cioè IORLW (Inclusive OR Literal and W), XORLW
(eXclusive OR Literal and W) e ANDLW.
Le operazioni booleane svolte da queste istruzioni sono le stesse viste per IORWF, ANDWF e
XORWF con la differenza che la destinazione è sempre W e l'
altro operando è un valore
impostabile durante l'
operazione stessa.
9
[email protected]
PIC 16C5X – generalita’
(PIC16c5x.doc)
La ADDWF ( ADD W and f ) somma il valore di W a quello contenuto nel registro f e lo deposita
in d. Poichè possono intervenire problemi di overflow, vengono interssati i bit C, DC e Z del
registro di STATO. Il codice della ADDFW è 1 CFh.
Un istruzione che" sposta "i contenuti dei registri è la MOVF (MOVe f). Con essa, il valore
contenuto nel registro f viene immagazzinato nella destinazione d. Poichè la destinazione può essere
esclusivamente o il registro stesso o W, nel primo caso si ha l'
effetto di una NOP ( f viene riscritto
con il suo valore ). Il codice di questa istruzione è 20Fh.
Con la COMF ( COMplement f ) viene eseguito il complemento del registro f, cioè vengono
sostituiti gli 1 con gli 0 e viceversa. Anche per questa istruzione viene influenzato il bit 2 del
registro di STATO. Il codice operativo della COMF è 24Fh.
L'
istruzione complementare alla DECF vista precedentemente è la INCF ( INCrement f ): rispetta
tutte le caratteristiche viste per la DECF, ma invece di decrementare il valore di f, lo incrementa di
uno. Il suo codice operativo è 28Fh.
Una istruzione molto importante e usata per la creazione di cicli è la DECFSZ ( DECrement f Skip
se Zero ). Tale istruzione esegue un decremento unitario come la DEC, ma al termine controlla se il
risultato è zero. Se ciò avviene, l'
istruzione seguente nel programma viene saltata (skipped) e si
passa a quella successiva. E'intuibile che in un ciclo si debba sempre testare se il conteggio è giunto
alla fine o meno e questa istruzione esegue proprio questa operazione. Il suo codice è 2CFh.
La INCFSZ ( INCrement f Skip se Zero ) ha le stesse caratteristiche viste per la DECFSZ, ma
questa volta l'
operazione sul valore del registro è di incremento e non di decremento, utile per i cicli
con conteggio positivo. Il suo codice operativo è 3CFh.
Ci sono poi tre istruzioni che manipolano il byte del registro f e cioè la RRF ( Rotate Right f ), la
RLF ( Rotate Left f ) e la SWAPF ( SWAP halwes f ):
• La RRF ruota i bit del registro f verso destra, cioè in pratica li " shifta " di una posizione: il bit
ottavo va al posto del settimo, il settimo al posto del sesto e così via fino al primo che va nel bit
C del registro di STATO. Il codice operativo dell’istruzione è 30Fh.
• La RLF shifta anch'
essa, ma verso sinistra con le stesse modalità operative della RRF. Il codice
operativo dell’istruzione è 34Fh
• La SWAPF, invece, scambia di posto i due nibble del byte da trattare. Il codice operativo
dell’istruzione è 38Fh.
Abbiamo visto così tutte le istruzioni orientate al byte che sono presenti in Tabella 1.
In Tabella 2, invece, troviamo le sole quattro istruzioni orientate al bit.
Precisiamo che f indica il solito registro, mentre, mentre b il numero dei bit su cui operare. b potrà
valere da 0 a 7 essendo il registro f un 8 bit.
La prima istruzione che valutiamo è la BCF (bit clear f) che pone a 0 il bit b del registro f. Questa
istruzione è molto usata per disattivare un'
uscita se, ad esempio, il registro è il 5, il 6 o il 7. Il suo
codice operativo è 4BFh:
La complementare della BCF è la BSF (Bit set f), che pone a 1 il bit b del registro f. Questa
istruzione è utile per attivare le uscite del PIC. Il suo codice operativo è 5BFh.
10
[email protected]
PIC 16C5X – generalita’
(PIC16c5x.doc)
Ci sono ora due istruzioni che testano il valore di un singolo bit e saltano l'
istruzione successiva se
tale bit è a zero (BTFSC cioè bit Test f Skip se Clear) oppure a uno (BTFSS cioè Test f Skip se
Set). I loro codici operativi sono rispettivamente 6BFh e 7BFh. Al contrario delle due precedenti,
queste istruzioni di test consentono di verificare il livello logico che ho su una porta di input.
Le ultime operazioni che prendiamo in esame sono quelle visibili in tabella 3 e cioè quelle relative
all'
input di dati da programma (K indica il valore espresso in byte) e al controllo dei PIC.
L'
operazione OPTION (load OPTION register) carica nel registro OPTION il contenuto di W.
Quindi questa istruzione sarà utile in fase di inizializzazione per settare correttamente le opzioni del
PIC. Il suo codice operativo è 002h.
L’istruzione SLEEP (go into standby mode) pone a zero il WDT (WatchDog Timer) e, quindi,
ferma l'
oscillatore, ottenendo un consumo totale del chip inferiore a 15 uA. Il suo codice operativo è
003h:
Anche la CLRWDT (CleaR WAtchDog Timer) pone uno zero nel WDT, ma questa volta
l'
oscillatore non viene bloccato e il programma prosegue. E'molto utile per eseguire un controllo
sull'
effettivo funzionamento del PIC: se il programma azzera ripetutamente il WDT, il PIC funziona
normalmente. Quando questo azzeramento viene a mancare, significa che per qualche motivo
esterno il PIC non procede più con il programma regolare e allora interviene un reset interno
automatico. Il codice operativo della CLRWDT è 004h.
L'
istruzione TRIS (TRIstate port) consente di programmare i singoli pin come ingressi o come
uscite: scrivendo un 1 su di un bit corrispondente ad esempio al registro 6 bit 0 (porta B pin 0), si
dice al PIC che quel pin deve essere di ingresso. Al contrario, scrivendoci 0 diciamo che quel pin
deve essere in uscita. Il codice operativo è 00Fh.
Le due istruzioni seguenti, consentono di introdurre delle subroutine e sono la RETLW (RETurn,
place k in W) e CALL (CALL subroutine). Entrambe modificano il valore del PC e degli stack. I
loro codici operativi sono rispettivamente 8KKh e 9KKh.
L'
istruzione GOTO (GO TO address), invece, offre la possibilità di saltare incondizionatamente a
un indirizzo del programma scelto a piacere:
Con l'
operazione MOVLW (MOV e Literal to W), il registro W viene "caricato" con il valore k.
Può essere molto utile per esempio per inizializzare dei registri con dei valori inseriti nel
programma come dati.
Abbiamo così valutato, una per una, tutte le possibili istruzioni per il PIC16C5X.
"I PIC, IN VIRTU' DEL FATTO CHE SONO PROCESSORI "risc" DISPONGONO DI
POCHE ISTRUZIONI, COMUNQUE SUFFICIENTI A SVOLGERE OPERAZIONI ANCHE
COMPLESSE "
11
[email protected]
PIC 16C5X – generalita’
(PIC16c5x.doc)
1..5 L’oscillatore
Si aggiungono ora alcuni dati che sono necessari per l'
impiego di questo chip.
La scelta di un tipo di oscillatore al posto di un altro deve essere ben motivata, e si vedranno i pregi
e i difetti di ciascuno di questi.
Diciamo inanzitutto che i tipi di oscillatori sono 4: XT, HS, RC, LP.
La versione finestrata del PIC ha la possibilità di essere settata, tramite il software di
programmazione, per funzionare con qualsiasi tipo di oscillatore, mentre la versione OTP (One
Time Programmable) viene settata dal fabbricante stesso e, quindi, non più modificabile dall'
utente.
La differenza fondamentale tra gli oscillatori controllati con quarzo oppure con risuonatore
ceramico e quelli RC è senza dubbio la stabilità in frequenza, mentre la secondaria è il costo di
produzione.
Si può vedere nella appendice1 lo slittamento di frequenza in funzione della temperatura con
circuito oscillante di tipo RC. In tabella 1 sono riportati invece alcuni valori di R e di C per ottenere
alcune frequenze standard. In figura 10 si possono vedere le connessioni con i vari tipi di
oscillatore.
FIG.. 10 Tipi di di oscillatori per i PIC
12
[email protected]
PIC 16C5X – generalita’
(PIC16c5x.doc)
13
[email protected]
PIC 16C5X – generalita’
(PIC16c5x.doc)
14
[email protected]
PIC 16C5X – generalita’
TITLE ‘Programma di prova’
La prima linea del programma contiene la direttiva TITLE con
cui si assegna un titolo al programma, inserito però tra due apici.
LIST F=INHX16,P=16C54
La seconda riga indica al compilatore quale device si utilizza e
quale formato di file si vuole in uscita; nel caso in esame si
utilizza un PIC16C54 e un object file in formato 16 bit word.
Inoltre, la prima dichiarazione list implica che verrà generato un
file .LST che servirà successivamente per un miglior debug del
programma.
Da questo punto si fissano delle costanti e si rinominano dei
registri per una comodità di lettura e di interpretazione:
TIM0
F5
F6
F7
F8
F9
F10
F11
F12
F13
F14
F15
F16
F17
F18
F19
F20
F21
F22
F23
F24
F25
F26
F27
F28
F29
F30
F31
EQU 1AH ;Numero
ripetizioni
per delay10mS
EQU 5
;porta A
EQU 6
;porta B
EQU 7
;utilità generali
EQU 8
EQU 9
EQU 0AH
EQU 0BH
EQU 0CH
EQU 0DH
EQU 0EH
EQU 0FH
EQU 10H
EQU 11H
EQU 12H
EQU 13H
EQU 14H
EQU 15H
EQU 16H
EQU 17H
EQU 18H
EQU 19H
EQU 1AH
EQU 1BH
EQU 1CH
EQU 1DH ;per ritardo 1S
EQU 1EH ; per ritardo 10mS
EQU 1FH ; per ritardo 10mS
ORG 0
OPTION
(PIC16c5x.doc)
Definizione di una costante TIM0 di valore 1AH;
ogni registro viene ridenominato per fornire una più facile
interpretazione: sicuramente è più istintivo chiamare un registro
F31 che 1FH.
Ogni frase scritta dopo il punto e virgola viene interpretata dal
compilatore come commento e quindi non valutata.
Da questo punto comincia il programma vero e proprio;
ORG è una direttiva del compilatore e definisce l’origine del
programma stesso.
OPTION senza aver scritto niente in W, indica che non si
vogliono utilizzare il WATCHDOG e il PRESCALER.
15
[email protected]
PIC 16C5X – generalita’
(PIC16c5x.doc)
A questo punto del programma, in genere, vengono inserite le subroutine di uso più frequente, come
quella per il ritardo di 10 mS riportata di seguito;
;ROUTINE DI RITARDO 10 mS
DELAY
DEL0
DEL1
DELAY
MOVLW TIMO ;Carico il valore di TIM0 ( 1Ah ) in W
MOVWF F30
;Carico W in F30 ( 1Eh )
F30= 1Ah
DEL 0
MOVWF F31
;Carico W in F31 ( 1Fh )
NOP
NOP
NOP
DECFSZ F31
;Nessuna operazione
;Nessuna operazione
;Nessuna operazione
;Decremento F31, salto l’istruzione
successiva se risultato è 0
;Vado a DEL1
;Decremento F30, salto l’istruzione
successiva se il risultato è 0
;Vado a DEL0
;Ritorna da subroutine
GOTO DEL1
DECFSZ F30
GOTO DEL0
RETLW 0
F31= 1Ah
DEL 1
NOP
NOP
NOP
F3 1=F3 1- 1
La scritta DELAY è una label, così come DEL0 e DEL1; queste
consentono di saltare da un punto all’altro del programma con le
istruzioni GOTO e CALL e di tornare, alla fine della routine, al punto
della chiamata con RETLW.
NO
F3 1=0
CALCOLO DEL RITARDO: (1A=26)
SI
dopo 26 cicli riferiti a DEL 1, F31=0;
dopo 26 cicli riferiti a DEL 0, F30=0;
il caricamento del registro F30
il caricamento del registro F31
l’esecuzione di un NOP
l’esecuzione di DECFSZ31
l’esecuzione di GOTO DEL 1
l’esecuzione di DECFSZ F30
l’esecuzione di GOTO DEL 0
per un totale di
F30=F30- 1
avviene 1 volta;
avviene 26 volte;
avviene 26*26*3 volte;
avviene 26*26 volte;
avviene 26*26 volte;
avviene 26 volte;
avviene 26 volte;
3435 operazioni;
F30=0
NO
SI
RETURN
IL PIC SUDDIVIDE AL SUO INTERNO IL CLOCK PER
QUATTRO, QUINDI OGNI 4 COLPI DI CLOCK ESEGUE
UN’OPERAZIONE ;
i colpi di clock per 3435 operazioni sono 4*3435= 13740;
CON CK = 1 MHZ si ha un ritardo di circa 13,5 mS;
16
[email protected]
PIC 16C5X – generalita’
(PIC16c5x.doc)
;ROUTINE DI RITARDO 1S
DELAY1
La routine DELAY viene chiamata 72 volte (48h = 72),
MOVLW 48H ;Carico il valore di introducendo così un ritardo di circa 13,5*72 = 0,972
(48H) in W
mS (circa 1 secondo).
MOVWF F29 ;Carico W in F29
DEL2S
CALL DELAY
DECFSZ F29
GOTO DEL2S
RETLW 0
Si descrive di seguito il programma principale, che può essere utilizzato per produrre l’accensione e
lo spegnimento di un led, posto sul PIN A0 della porta 5 (F5), con intervalli di un secondo;
17
[email protected]
PIC 16C5X – generalita’
MAIN
MOVLW 00FH ;W=0000 1111
TRIS 6
;PORTA B, definizione I/O
B0..B3 IN B4..B7 OUT
MOVLW 0FFH ;W=1111 1111
MOVWF F6
;muovi W sulla porta B
tutti 1 in uscita su B
CLRW
TRIS 5
;azzera W
;PORTA A, definizione I/O
A0....A3 OUT
MOVWF F5
;tutti i pin di A a zero
(PIC16c5x.doc)
MAIN 1
NO
PORTA 5 BIT 0
=0
SI
PORTA 5 BIT 0=0
PORTA 5 BIT 0=1
ASPETTA 1SEC
ASPETTA 1 SEC
MAIN 1
BTFSC F5,0
;testa porta A bit 0,
skippa se zero
GOTO SETTA ;vai a SETTA
BSF F5,0
;setta a 1 bit 0 di porta A
CALL DELAY1 ;ritardo di un secondo
GOTO MAIN1 ;torna a MAIN1
SETTA
BCF F5,0
;setta a 0 bit 0 di porta A
CALL DELAY1
GOTO MAIN1
;torna a MAIN1
DATA “LAMPEGGIO DI UN LED”
DATA “ BY Carbon and C”
DATA “I H N”
ORG 01FFFH
GOTO MAIN
END
Alla fine del programma è possibile inserire dei
dati personali per l’identificazione; occorre tenere
conto, però, che questi dati vengono inseriti nella
EPROM del PIC, quindi portano via spazio
potenzialmente utilizzabile per lo sviluppo del
programma.
La fine di un programma viene definita dalle tre
linee a lato;
la prima riga indica al PIC la cella di memoria da
cui partire a leggere le istruzioni. Nel caso del
PIC 16C54 e PIC16C55 è obbligatorio dare
01FFh come origine (sarebbe l’ultimo indirizzo
utile della EPROM). Poiché non è possibile
proseguire
incrementando
tale
indirizzo,
l’istruzione da dare successivamente sarà per
forza di cose GOTO MAIN. Infine l’ultima riga
del programma deve avere la direttiva END, per
comunicare all’assemblatore che il programma da
assemblare è terminato.
18
[email protected]
PIC 16C5X – generalita’
(PIC16c5x.doc)
BUS DATI E BUS ISTRUZIONI SONO SEPARATI (ARCHITETTURA HARVARD)
I REGISTRI DA 07 A 1F (PER UN TOTALE DI 25) SONO A DISPOSIZIONE
DELL’UTENTE
19
Fly UP