Esercitazioni
PIC Midrange
|
Inizia qui la seconda parte del corso sui microcontroller a 8 bit di
Microchip e che è dedicata ai dispositivi di fascia media, denominati Midrange.
Qui di seguito alcune informazioni per chi inizia oppure vai direttamente
al corso...
Una conclusione sui Baseline...
Nonostante si tratti della famiglia più low level di Microchip, i Baseline
sono ancora dei componenti che possono essere impiegati positivamente in
molte applicazioni e principalmente:
- Dove non è utilizzato interrupt. Una applicazione semplice che
può essere risolta senza interruzioni non ha ragione di essere eseguita su un
microcontroller dotato di questa funzione. I Baseline, con il loro basso
costo, sono la giusta scelta in questi casi.
- Dove non sono impiegate periferiche al di là del solito Timer0 o
di ADC o comparatore. Oppure nelle applicazioni dove è ammissibile
l'emulazione della periferica, ad esempio per una comunicazione seriale
half duplex.
- Dove non sono richiesti molti I/O, dato che i Baseline sono
essenzialmente chip con un numero limitato di pin. Certamente si può
pensare di espanderli con shift register o simili, ma a conti fatti,
l'aggiunta di componenti esterni, della superficie dello stampato e del
tempo di montaggio finiscono per essere praticamente quanto mai poco convenienti
rispetto alla scelta di un chip con un numero maggiore di pin.
- Dove non è richiesta ampia memoria. I Baseline hanno una
quantità di RAM piuttosto bassa, una flash limitata e solo pochi modelli
hanno EEPROM. Se il programma raggiunge una certa complessità è
facile che lo spazio disponibile non sia sufficiente.
- Dove non è richiesta una compilazione con linguaggi ad alto livello.
Nonostante che, con le opportune cure, sia possibile utilizzare sia C che
BASIC con i Baseline, le limitate risorse di memoria, lo stack a due soli
livelli che impedisce la ricorsività e il set di istruzioni minimale, non
sono certamente un ambiente ottimale per i linguaggi ad alto livello.
- Dove non sono richieste elevate performances di clock. Pur
essendoci modelli in grado di operare con circuiti di clock esterno fino a
20 MHz, il clock interno dei Baseline è tipicamente 4MHz.
- Dove non sono richieste le specifiche di consumo extra basso
tipiche dei prodotti più recenti.
...e una introduzione ai Midrange
Una gran parte delle applicazioni necessita di interrupt e di periferiche
non semplici o convenienti da emulare; inoltre, una maggiore disponibilità di risorse rendono più
facile l'uso del C o del Basic.
Si sente la necessità di una famiglia di microcontroller che possa offrire maggiori
prestazioni dei Baseline:
essa esiste
ed è denominata Midrange.
Il nome rende chiara la loro posizione "gerarchica" nel mondo
degli 8 bit di Microchip, ovvero una collocazione mediana tra i PIC minimali e i
più performanti PIC18F.
E, in effetti, per molti, la conoscenza dei PIC si limita solamente a pochi modelli
che appartengo proprio a questa famiglia, chip "classici" come 16F84, 16F628,
16F877 e pochi altri, che sono
diventati sinonimo di "PIC".
Questi microcontroller, nel passato e per varie ragioni, sono stati oggetto di sperimentazione da parte di
moltissimi hobbysti e non, e sul WEB si trovano migliaia di pagine a riguardo. Da qui deriva
il fatto che chi comincia ad avvicinarsi ai prodotti di Microchip spesso lo fa
seguendo questi esempi e i corsi disponibili.
Però...
I cari estinti...
Prima di iniziare con gli esempi di programmazione di questo corso per i Midrange, però, occorre una
precisazione: avvertiamo i fans dei vecchi PIC sopra elencati che qui, per quanto possibile,
si cercherà di NON utilizzarli !
Le motivazioni sono semplici:
- si tratta di componenti quanto mai anziani, mantenuti in vita da
Microchip solo a causa della loro grande diffusione, ma considerati ampiamente
superati, non solo dai nuovi Enhanced Midrange, ma anche da numerosi altri
Midrange meno datati.
Non esiste alcuna ragione tecnica per usare il
vecchio componente.
- questa situazione li posiziona nel mercato a prezzi molto maggiori
dei componenti più recenti (ad esempio, alla data odierna, 16F84A
costa, su Microchip Direct, al minimo 3.28€ mentre il recente ed
enormemente più performante 16F1509 costa solo 1.33€, ma anche il più
datato 16F684 ne costa solo 1.20€...).
Non esiste alcuna ragione economica
per usare il vecchio componente.
- non dispongono di oscillatore interno: è obbligatorio l' uso di
componenti esterni per un oscillatore a cristallo o un RC. Questo fa
perdere due pin dei già pochi disponibili, mentre aumenta ingombro e
costo dei componenti necessari anche ad un funzionamento minimale, mentre
nei modelli meno datati l'oscillatore interno è presente.
Abbiamo visto nelle esercitazioni sui Baseline come il quarzo esterno si
renda necessario solamente per i casi in cui la precisione del clock è un
elemento indispensabile, mentre per gran parte delle applicazioni
l'oscillatore interno è del tutto adeguato. Un ulteriore elemento a
sfavore dei vecchi modelli.
- il pin MCLR non è configurabile come ingresso digitale (mentre
lo è in modelli meno datati). Abbiamo
dettagliato come il Reset
esterno (MCLR) sia quanto mai raramente un elemento indispensabile; l'
impossibilità di escludere la funzione MCLR riduce ulteriormente il
numero di I/O disponibili. Un altro elemento a sfavore dei vecchi
modelli.
- il pin RA4 in uscita è, in alcuni dei vecchi modelli, un open drain. Questo costringe ad
applicare un pull-up esterno e limita sensibilmente molte applicazioni, in
quanto il pin non è in grado di fornire corrente quando impostato a livello alto. Il fatto che questa singolarità non sia più stata inserita dai
progettisti nei chip successivi ne indica chiaramente la scarsa
funzionalità.
L'insieme di queste limitazioni fa si che componenti come 16F84, 16F628,
16F876, 16F877 non abbiano alcuna ragione di essere ancora utilizzati in nuove
applicazioni.
Se da un punto di vista didattico si potrebbe obiettare che la loro anzianità
di servizio ne ha fatto dei must, l'obiezione cade di fonte alla
considerazione che componenti meno datati offrono lo stesso ambiente di
lavoro, ma senza le molteplici problematiche identificate, ad un costo minore
e con una marea di bonus addizionali.
In particolare, il celeberrimo 16F84 : la sua fama è derivata dall'essere stato il primo embedded dotato di memoria
programma Flash riscrivibile e il fatto di essere riutilizzabile numerose
volte ne ha fatto un must presso gli hobbisti e oggetto di numerosi
tutorials, corsi, esempi. Però, oggi si trova ad essere solo un simpatico
prodotto del passato, con risorse limitatissime e privo di periferiche: con 18
pin, solamente 13 sono utilizzabili come GPIO, la sola periferica disponibile
è Timer0, non ha oscillatore interno, ecc.
Insistere su componenti obsoleti, sopratutto per la didattica,
è controproducente perchè si riduce la conoscenza dei
PIC ad un ambiente fortemente datato e limitato; questo non permette allo studente di afferrare
problemi essenziali della filosofia costruttiva dei PIC, nè tanto meno di sperimentare
periferiche che
sono elemento essenziale dei microcontroller e, in generale, di avere quella
elasticità mentale che consente di mantenersi al passo con l'incessante
sviluppo tecnologico. Inoltre, gli esempi sono spesso risolti con sorgenti
scritti in Assembly improbabili, non strutturati e pieni di elementi che sono
ampiamente superati negli ambienti di sviluppo attuali.
Tutte cose che si possono evitare nella valutazione, apprendimento e sperimentazione
se si prendono in considerazione altri chip meno datato ed utilizzando gli ambienti
di sviluppo più recenti.
Quindi, parlando di Midrange, faremo leva essenzialmente su PIC meno datati
(e per questo meno noti), in particolare 16F684 e 16F688 a 14 pin, 16F690 a 20 pin e 12F629, 12F675, 12F683, a 8 pin.
Va da se che chi desidera utilizzare comunque i vecchi microcontroller (principalmente,
si suppone, perchè li ha nel cassetto), applicando i principi evidenziati nel corso sui Baseline e
che verranno ribaditi ed espansi in questa parte sui Midrange, potrà
comunque, con facilità, trasportare una applicazione da un chip ad un altro con sigla diversa,
ma con le stesse caratteristiche essenziali.
L'evoluzione della specie.
Lo scopo delle esercitazioni di questo corso è, tra l'altro, quello di
fornire una sufficiente conoscenza dei microcontroller di Microchip in modo
tale da poter autonomamente effettuare scelte e prendere decisioni, senza
limitarsi ad una copia passiva degli esempi presenti in rete.
Comparando le stesse
esercitazioni nei diversi ambienti, ci si
rende conto compiutamente delle differenze e delle identità: si tratta di processori derivati da una unica
filosofia progettuale, e quindi ricchi di analogie, ma uno è sviluppo
conseguente dell'altro
e quindi con elementi sia simili che diversi, di cui occorre tenere conto.
Un ulteriore aspetto di questo corso è il
tentativo di far comprendere come un sorgente, anche nello specifico Assembly
di una specifica famiglia di microcontroller, possa essere passato ad un altro
componente, realizzato in base alla stessa filosofia, senza eccessive
difficoltà.
Questo è legato ad una questione che raramente il neofita si pone:"quale microcontroller scegliere
per una determinata applicazione?".
Per l'hobbista la scelta è dettata da
quello che si trova nel cassetto, ma questo finisce per limitare la sua ottica
a un solo componente, che pensa di conoscere sufficientemente, mentre
l'offerta spazia su decine e decine di altri: una diversa scelta gli faciliterebbe
di molto il lavoro, sia per quanto riguarda il software che per l'hardware.
E, dato che si parla di componenti dell'ordine di pochi
euro, la questione costo non è certo un limite che impedisce uno sguardo su
chip diversi da quelli presenti nel cassetto.
Chi, poi, applicasse una limitazione dovuta alle sue scarse conoscenze ai componenti da usare, al di fuori dell'hobbistica,
incorrerebbe in gravi
problemi: la scelta del microcontroller va fatta in base
all'applicazione, altrimenti si rischia di progettare con materiali inadeguati,
anche solo per il costo, complicandosi poi la vita con necessità di hardware esterno e,
sopratutto, complicando il firmware, problemi che una scelta più oculata del processore avrebbe evitato.
In questo senso, a nostro parere, i Midrange non sono più, salvo
casi particolari, componenti su cui sviluppare nuovi progetti, dato
che Microchip ha da tempo introdotto la famiglia degli Enhanced
Midrange.
Questi presentano, come dice il nome, notevoli vantaggi rispetto ai
precedenti:
- performance superiori
- maggior varietà di periferiche
- maggior disponibilità di memoria
- set istruzioni esteso
- maggiore possibilità di programmazione con linguaggi ad alto livello
Il tutto, con la completa compatibilità hardware (pin-to-pin) e con un
costo decisamente minore.
Quindi, no al vecchio 16F84; anche se ha avuto grande spazio
nell'avvicinare moltissimi ai microcontroller, ha fatto il suo tempo e non ci
sono ragioni per continuare a considerarlo se non come curiosità.
Anche perchè, come abbiamo già visto ampiamente, il passaggio di un sorgente da un chip con risorse
limitate ad uno con risorse maggiori è sempre possibile e che l'identità di
base delle famiglie di uno stesso costruttore riduce le distanze, rendendo il porting quanto mai
semplice, il che giustifica la decisione di non scrivere del nuovo per
componenti vecchi.
La struttura di questa parte del corso.
Quanto sopra giustifica anche la struttura di questa parte del corso, che replica
quanto scritto sui Baseline, ripetendone alcuni dettagli e informazioni.
Gli esempi sono basati su tre principi:
- Replica di quanto eseguito per i Baseline, in modo da evidenziare come
sia possibile trasferire il codice Assembly senza particolari problemi da
un chip ad un altro, anche se di famiglia diversa.
Non vengono ripetute cose già evidenziate e spiegate nella parte relativa
ai Baseline, se non dove sia ritenuto necessario. Questo
perchè il corso segue il principio di fornire una visione complessiva
delle famiglie a 8 bit di Microchip, salendo in modo graduale da Baseline
ai PIC18F.
Per contro, vengono messe in evidenza le differenze tra Baseline e Midrange,
differenze essenzialmente dovute alla più complessa struttura di questi chip
intermedi.
- Saranno proposti esempi di esecuzione di azioni che impiegano interrupt invece che
polling. Il confronto chiarisce la maggior parte degli aspetti relativi a queste due
modalità.
- Si aggiungono, poi, esempi di utilizzo delle varie periferiche che i Midrange rendono
disponibili.
Si punta
essenzialmente a formare un ponte tra i minimali Baseline, sempre validi per
un gran numero di applicazioni dove il costo è elemento fondamenti
della scelta, e i nuovi Enhanced Midrange, per poi passare ai PIC18F.
Midrange vs. Baseline
I PIC delle famiglie Baseline, che abbiamo visto nella prima parte
di questo corso, sono microcontroller con bus istruzione a 12 bit
(mentre il bus dati è sempre a 8 bit - vedi architettura
Harvard).
Questo limita il numero degli opcode supportati e, contemporaneamente, l'area
di indirizzamento delle subroutines e delle tabelle si trova ad avere notevoli
restrizioni. Inoltre, la memoria programma è divisa in pagine limitate a 512
"bytes", mentre la memoria dati è composta di banchi ampi solo 16
bytes.
Un ulteriore problema è dovuto allo stack che, avendo solo due livelli,
limita sensibilmente l'uso di subroutines, a cui si aggiunge la mancanza di
interrupt.
I Baseline dispongono, però, di oscillatore interno, che permette un
risparmio di pin e componenti rispetto ad uno esterno, ma con questo la
frequenza del clock è generalmente limitata a 4MHz (ciclo istruzioni di 1us),
tanto che questo valore sembra essere il solo utilizzabile con i PIC.
La famiglia dei Midrange copre una parte di queste limitazioni con:
- un bus indirizzi ampio 14 bit, il che permette un maggior numero di
opcodes e un raggio di indirizzamento più ampio
- maggiori dimensioni sia della pagina di memoria programma, sia dei
blocchi di RAM
- stack più ampio, a 8 livelli
- disponibilità della gestione di eventi in interrupt
- maggior numero e varietà di periferiche integrate
- frequenze di clock maggiori
Queste caratteristiche consentono di implementare molto più facilmente
applicazioni complesse, come pure di supportare meglio BASIC e C.
Inoltre, cosa da non trascurare, in vari modelli, si trova integrato il
motore ICD (In Circuit Debug), il che consente di eseguire il debug del
programma direttamente sul componente; questo è estremamente interessante per
la didattica e quanto mai conveniente per lo sviluppo, dato che non richiede
plug di emulazione, in genere molto costosi. ICD richiede una area
di silicio più ampia (e quindi più costosa), ma consente di effettuare un
reale debug in circuit senza hardware speciale e attraverso i comuni tools di
sviluppo, compresi gli economici Pickit.
Il PIC16F876/77 è stato il primo microcontroller Microchip ad avere capacità
di debugging interne.
Sono disponibili oltre 60 componenti nella famiglia Midrange, tra cui noti
16F84, 16F628, 12F629, 12F675, 16F877, ecc.
Una tabella compare le caratteristiche di alcuni Baseline e Midrange:
PIC |
Core |
Stack |
FLASH |
RAM |
EEPROM |
Timer
8bit |
Timer
16bit |
Comp |
ADC
bit/ch |
MSSP
UART |
Fmax |
10F200 |
12bit |
2 |
375 |
16 |
- |
1 |
- |
- |
- |
- |
4 |
12F519 |
1.5k |
41 |
64 |
1 |
- |
- |
- |
- |
8 |
16F506 |
1.5K |
67 |
- |
1 |
- |
2 |
8/3 |
- |
20 |
12F629 |
14bit |
8 |
1.75K |
64 |
128 |
1 |
1 |
1 |
- |
- |
20 |
12F752 |
4k |
128 |
256 |
2 |
1 |
1 |
4 |
- |
16F688 |
7k |
256 |
256 |
2 |
1 |
2 |
- |
1/1 |
16F690 |
7k |
256 |
256 |
2 |
1 |
2 |
10/12 |
1/1 |
Vediamo come siano mediamente molto maggiori le dimensioni della memoria,
mentre si eleva la frequenza di clock e si aggiungono periferiche come UART,
MSSP e timer a 16bit, oltre alla presenza di memoria EEPROM (HEF
per i modelli più recenti).
Come già visto a proposito dei Baseline, anche per i Midrange sono
disponibili chip in package a 8, 14, 18, 20, 28, 40, 64, con una scelta di
dimensioni della memoria e la quantità delle periferiche integrate molto
ampia.
Per riassumere in breve:
|
Baseline |
Midrange |
Core |
12 bit |
14 bit |
Stack |
2 livelli |
8 livelli |
Interrupt |
no |
si |
Package |
6-20 pin |
6-64 pin |
ICD |
no |
si* |
* solo alcuni modelli.
La questione delle sigle.
Un punto che può creare confusione riguarda le sigle dei chip, in quanto
ci sono 10F, 12F e 16F sia Baseline che Midrange. Una distinzione di massima
può essere fatta con facilità considerando le cifre finali della sigla:
Tipo |
Baseline |
Midrange |
Enhanced |
10F |
10F2xx |
10F3xx |
- |
12F |
12F5xx |
12F6xx |
12F1xxx |
16F |
16F5xx |
16F6xx,16F8xx |
16F1xxx |
Quindi, affermare che un PIC16F è un Midrange può essere errato: sarà
Midrange un 16F677, ma sarà un Enhanced Midrange un 16F1804, mentre un 16F505
fa parte dei Baseline.
Va ricordato, cosa importante, anche che tutti i PIC, a
parità di package, lo stesso pinout, ovvero la stessa disposizione dei pin (salvo
rare eccezioni per componenti obsoleti), il che permette una immediata sostituzione sullo stesso hardware di un
processore datato con uno più recente oppure dell' uso su una demoboard di
chip di tutte le famiglie.
Comunque, anche per i Midrange, permangono le limitazioni tipiche
dei PIC minori, ovvero:
- la divisione della RAM in banchi
- la divisione della memoria programma in pagine
- il problema dell' R-M-W
Vediamo, in questa serie di esercitazioni, di maneggiare questi
microcontroller; dato che vengono ripetute varie azioni già sviluppate sui
Baseline, si rimanda alle descrizioni della sezione di corso relativa,
evidenziando qui solamente le parti salienti e i punti di differenza.
L' attrezzatura base è la medesima.
In particolare, i Midrange possono essere debuggati e programmati sia con Pickit2
che con Pickit3.
Più istruzioni.
Un particolare interessante è dato dall'aggiunta di istruzioni al set dei
Baseline.
Il core a 14 bit dei Midrange consente di disporre di tutte le istruzioni dei
Baseline, permettendo così un passaggio diretto dei sorgenti, e introducendo
alcuni opcode che risultano molto efficaci nella realizzazione di svariati
algoritmi:
- incfsz che si
aggiunge simmetricamente a decfsz
- Troviamo, poi, anche altre istruzioni come addlw,
sublw, andlw
che semplificano e velocizzano l'esecuzione di molti algoritmi,
ottimizzando l'eseguibile.
- a retlw
si aggiunge return,
oltre al retfie
dell' interrupt. Qui
una pagina esplicativa su questi tre opcode.
Sono ancora compilabili le istruzioni TRIS
e OPTION,
per compatibilità con i Baseline, anche se Microchip ne sconsiglia
vivamente l'uso, dato che di esse non esiste più alcuna necessità: il registro TRIS e il registro
OPTION_REG sono mappati in memoria e direttamente accessibili con le
istruzioni comuni.
Vedremo questi e altri particolari durante le esercitazioni.
|