Tutorials - PIC - Corso A&C

 

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:

  1. 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.
     
  2. 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.
     
  3. 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.
     
  4. 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.
     
  5. 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.
     
  6. 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.
     
  7. 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:

  1. 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. 
     
  2. 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à.
  3. 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.

 


 

 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 17/05/17.