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:
.jpg)
- 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:
- 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:

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&
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.
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.
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
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
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