Home
Accesso / Registrazione
 di 

Tips ‘n Trick Microchip

Tips 'n Trick

Forse non tutti sanno che la Microchip mette a disposizione degli utenti, un’interessante guida che al suo interno contiene una raccolta di Tips ‘n Trick utili su tutti i fronti, ma in particolar modo utili per tutti quei programmatori che si accingono a sviluppare progetti in assembler.

Quando si scrivono software per microcontrollori ad 8 bit e con scarse capacità sia di memoria RAM sia di memoria per il salvataggio del codice, ci si trova a dover fare i conti con la famosa “coperta corta” per cui bisogna fare la scelta se utilizzare per esempio la RAM per risparmiare program memory o viceversa.

Questa serie di Tips ‘n Trick della Microchip (questo è il link: http://ww1.microchip.com/downloads/en/DeviceDoc/01146B.pdf) aiuta il programmatore quando si trova di fronte a queste scelte, facendogli risparmiare tempo e fatica.

 

Di seguito ne elencherò solamente 5 che a mio parere sono le più interessanti e che rappresentano per me delle vere “chicche”:

 

  • sapete come potete pilotare 6 led, senza multiplexer e usando solamente 3 pin del microcontrollore?! Microchip ci suggerisce un interessante metodo che sfrutta la caratteristica ad alta impedenza dei pin configurati come ingressi. Lo schema elettrico è molto semplice:

 

come possiamo vedere dallo schema elettrico, se vogliamo accendere per esempio, solo il led 3, sarà sufficiente settare GP0 come ingresso, GP1 e GP2 come uscita e quindi la GP1 a livello logico basso e la GP2 a livello logico alto; analogamente se vogliamo far accendere il led 2 e il led 3 sarà sufficiente settare tutti i pin come uscita e quindi GP0 e GP2 a livello logico alto e GP1 a livello logico basso. Stesso ragionamento può essere fatto con altre combinazioni di led tenendo presente però, che tutte le combinazioni non possono essere realizzate come per esempio l’accensione contemporanea del led 3 e del led 4. Di seguito è mostrata la tabella che riassume tutte le combinazioni e i valori da far assumere ad ogni pin:
la lettera “Z” indica che il pin è ad alta impedenza e quindi deve essere settato come ingresso.
Chiaramente questa tecnica può essere applicata per pilotare più di 6 led e la formula che ci permette di sapere il numero di led pilotabili dato il numero di pin a disposizione è la seguente:
 
D = GP x (GP - 1)
 
dove “D” corrisponde al numero di led e GP al numero di porte disponibili.
 
  • solitamente l’alimentazione dei dispositivi digitali (e quindi i segnali di uscita) è dell’ordine dei 5 volt o addirittura dei 3,3 volt, ma alle volte può capitare che abbiamo la necessità di pilotare dispositivi che necessitano di una tensione di pilotaggio maggiore. Per far fronte a questa necessità solitamente vengono progettate delle interfacce generalmente composte da un transistor e da una manciata di resistenze; questa soluzione però necessità di avere un’alimentazione duale che alle volte però può non essere presente. Anche in questo caso la Microchip ci suggerisce uno schema elettrico per ottenere in uscita dal pin una tensione superiore di quella di alimentazione del micro:

 

fornendo in uscita sul pin un’onda quadra con frequenza opportuna, sarà possibile ottenere una tensione pari a quella indicata in figura.
 
  • Forse non tutti sanno che anche con un semplice PIC12 è possibile realizzare una modulazione di tipo sigma-delta utilizzando la seguente configurazione:

allo scadere di un timer opportunamente programmato, il software dovrà controllare il valore di GP1 attraverso l’utilizzo del comparatore: se la tensione è superiore alla tensione di riferimento Vref, la GP2 deve andare al livello logico basso; se la tensione è inferiore alla tensione di riferimento Vref, la GP2 deve essere settata al livello logico alto. Contando il numero di volte che la GP2 viene settata al livello logico basso, si ottiene il valore corrispondente alla modulazione sigma-delta e quindi il numero di campionature per secondo determina la risoluzione.

 

  • Quando capita di dover programmare in assembler dispositivi con risorse limitate, può capitare di trovarci di fronte ad un “trade-off” tra utilizzo della RAM e utilizzo della PROGRAM MEMORY. Un caso di questi è quando dobbiamo scambiare il contenuto del registro “accumulatore” (nei prodotti Microchip viene indicato con la lettera “w”) e il contenuto di una locazione di memoria tra di loro; in questo caso normalmente viene utilizzata un’altra variabile d’appoggio che però ci obbliga a dover allocare altro spazio in memoria. Utilizzando le operazioni di XOR e tre istruzioni assembler, possiamo eseguire questo scambio senza l’ausilio di una locazione di memoria ad uso temporaneo:

e un tipico esempio può essere il seguente:

 

  • Lavorando con dispositivi digitali, molte volte ci si può trovare di  fronte all’esigenza di avere una tensione analogica la quale ampiezza possa essere determinata dal software. In molti microprocessori abbiamo una periferica dedicata che fornisce una tensione analogica, ma in molti casi, soprattutto nei microprocessori di fascia bassa, non abbiamo a disposizione questa periferica. 
    Una soluzione che ci viene incontro richiede l’utilizzo di una manciata di componenti connessi come mostrata dalla seguente figura:
il software dovrà fornire semplicemente un onda quadra con la frequenza opportuna nel pin dedicato (possono essere utilizzate periferiche PWM che si occupano di fornire il segnale ad onda quadra impostando semplicemente qualche registro).
Questo circuito altro non è che un filtro passa basso ed un inseguitore di tensione e la scelta dei componenti dovrà essere fatta sulla base della seguente formula:
 
Att(db) = -10 * log [1+(2*pi*Fpwm*R*C)*2]
 
dove Fpwm è la frequenza dell’onda quadra in uscita dal pin. 
Si parla di attenuazione in quanto la tensione fornita da questo schema andrà da un massimo di Vdd (alimentazione del micro) ad un minino di “0” volt (valori di tensioni chiaramente ideali).
 
Questi elencati sono solo alcuni dei tanti “Tips ‘n Trick” che la Microchip propone nel PDF presente nel link lasciato all’inizio di questo articolo; lo scopo di questa presentazione non è quello di approfondire o selezionare gli argomenti trattati ma piuttosto quello di divulgare la presenza di questa guida che alle volte può tornare veramente utile, sia agli sviluppatori software sia agli sviluppatori hardware.
 

 

 

 

 

 

Scrivi un commento all'articolo esprimendo la tua opinione sul tema, chiedendo eventuali spiegazioni e/o approfondimenti e contribuendo allo sviluppo dell'argomento proposto. Verranno accettati solo commenti a tema con l'argomento dell'articolo stesso. Commenti NON a tema dovranno essere necessariamente inseriti nel Forum creando un "nuovo argomento di discussione". Per commentare devi accedere al Blog
ritratto di Vittorio Crapella

Interessante

Interessante trucchetto...
qualcosa del genere, sebbene diverso, mi ricorda quando con micro ST6 usavo lo stesso pin prima configurato con INgresso per testare lo stato di un pulsante NO
poi subito dopo che il pulsante veniva pigiato lo configuravo come OUTput per accendere un LED per indicare che l'opzione era stata recepita e che la stava svolgendo.. poi ritonava come IN
Con la stessa tecnica ricordo di una scheda con ST225 che dialogava con il BUS di un PC dove 8 pin facevano da I/O a 16 bit a seconda dell'esigenza, ovviamente però usavo anche due treestate 74HC374 per tenere memorizzati i 16 BIT che mi mandava il PC e i 16 che preparavo con 8 bit per volta .. la selezione dei 374 avveniva con un decoder 74HC138 pilotato da 3 bit di unaltra porta dell'ST&

ritratto di lucagiuliodori

Ciao Vittorio, si, conoscevo

Ciao Vittorio,

si, conoscevo anche io la tecnica di usare un singolo pin sia come ingresso che come uscita, solo che non mi ricordo bene una cosa: il pulsante doveva essere normalmente chiuso e doveva aprirsi quando veniva premuto giusto? altrimenti non si riesce a pilotare il led (il pulsante che si chiude quando premuto porterebbe a massa o a +V il pin del micro).

Altrettanto ingegnosa è la tecnica di usare il demultiplexer e un 2 flip flop di tipo D per aumentare il numero di pin del micro, infatti come dici tu, con soli 8 pin riesci ad ottenere 16 bit.

Noi solitamente utilizziamo un metodo diverso, infatti al posto dei demultiplexer e dei flip-flop di tipo D, utilizziamo dei FIFO: con soli due pin (clock e dato) si riescono ad ottenere 8 uscite differenti per pilotare 8 dispositivi differenti. Poi mettendo in cascata diversi FIFO si può ottenere un numero di bit più grande (16, 24, 32, ...).
In base al tipo di applicazione da dover realizzare è opportuno fare la giusta scelta
dei FIFO; ad esempio se si usano i FIFO per pilotare dei relè non ci possiamo permettere che i pin del FIFO variano finchè il micro gli invia i dati.

Il software da dover implementare è un po più difficile ma con poche righe in più si ottengono grandi vantaggi.

ritratto di Vittorio Crapella

Si si pure con le FIFO è un

Si si pure con le FIFO è un ottimo sistema
Volendo si può conglobare clock e dato sullo stesso filo e in pratica con un doppino
si possono inviare 8 o 16 o più bit con questa tecnica
http://www.webalice.it/crapellavittorio/electronic/rtxbyte.htm
poi se vuoi ripassarti un po' di logica digitale che fa le stesse cose c'è anche questo
http://digilander.libero.it/i2viu/esperienze/rtx8bit.html

ritratto di telegiangi61

Miniera di idee

Quel documento e' davvero una vera miniera di idee per ottimizzare l'uso delle risorse I/O e anche dal punto di vista software non e' male.

Di fatto e' un manuale dal quale trarre sia lo schema hardware di principio, che la strategia software da adottare per raggiungere un determinato obbiettivo.
Mi ricorda molto le Design Ideas di EDN (forse ho ancora in soffitta qualche copia cartacea) , dalle quali ho attinto molti spunti per realizzare alcuni prototipi.

Il merito di Microchip e' secondo me quello di aver raccolto organicamente gran parte di queste utilissime idee nate dallo sforzo quotidiano di tanti progettisti nello strizzare al massimo le risorse hardware e software di questi microcontrollori.

Ho rivisto con piacere e anche ben illustrata, la tecnica della macchina a stati per gestire piu' ADC con la tavola dei salti controllati allo stato successivo del sistema, tenendo conto del dato in input e dello stato precedente.

TIP #19 Execution-Indexed Software State Machine

e le tecniche di riduzione dei bit necessari ad effettuare la scansione di una tastiera
TIP #12 4 x 4 Keypad Interface that conserves Pins...

Io spesso per leggere i dipswitch che indirizzavano una scheda, mettevo tra il microcontrollore e il pool di DIP un BUS Transceiver a 8 porte bidirezionali come il 74HC245.
Una routine leggeva gli 8 bits solo all'inizio del programma in assembler, o dopo un reset voluto o scatenato da watch-dog che lo forzava.
In pratica usavo un nono bit del microcontrollore per abilitare o meno la lettura del BUS sul bit OE, abbassavo questo bit, mi leggevo lo stato delle 8 porte e poi lo rialzavo per mandare in alta impedenza le porte sul 245 per poter utilizzare liberamente gli 8 bit in I/O senza problemi, ad esempio per leggere o scrivere su una ram esterna o un display.

Gia' da molto tempo a dare una mano ai progettisti ci sono le espansioni di I/O pin via I2C (http://www.sparkfun.com/products/8130) e per la parte analogica il ben noto ed economico kit della Sparkfun, (http://www.sparkfun.com/products/9056), ma soprattutto la potenza sempre maggiore in termini di memoria programma, dati e velocita' (fino ad 80Mhz) che offrono chip come la serie PIC24 e PIC32.

Al di la' dei benefici in termini di risorse, ho sempre trovato stimolante la ricerca di ridurre al minimo le risorse utilizzate, e' una buona scuola per tenere in esercizio il cervello.

ritratto di divivoma

mod sigma delta..

ciao..hai provato a campionare qualche segnale con la config sigma/delta..giusto cosi per vedere come funziona da convertitore.. purtroppo non ne ho uno a disposizione di questi micro e attualmente nn ho neanche un indirizzo "sicuro" a cui farmelo pervenire :)..
fammi sapere sono curioso :)

ciao

ritratto di lucagiuliodori

Appena avrò un po di tempo

Appena avrò un po di tempo cercherò di implementarlo. Ho la possibilità di provarlo ma purtroppo ora come ora non ho molto tempo.

Appena ho qualche risultato te lo faccio sapere.
Ciao

 

 

Login   
 Twitter Facebook LinkedIn Youtube Google RSS

Chi è online

Ci sono attualmente 6 utenti e 42 visitatori collegati.

Ultimi Commenti