Più uscite da un solo pin

Questo progetto mostra come sia semplice partendo da un singolo pin di output avere la possibilità di ottenere più segnali di uscita, il tutto grazie ad un semplice filtro RC e ad un convertitore seriale/parallelo.

Quante volte in un progetto vi è mancata la possibilità di portare un segnale supplementare su di un pin di uscita, magari quel segnale a cui non avevate pensato durante la fase di progetto della scheda, ora vi farebbe veramente comodo però avete tutti i  GPO (general purpose output pin) impegnati. Oppure vi è capitato che per esigenze di debug o per risolvere i  problemi di una scheda sia necessario avere in uscita un segnale che non era previsto. Queste appena elencate e anche altre esigenze possono essere facilmente gestite grazie al circuito che si può vedere in figura 1.

Figura 1: schema del circuito che consente di espandere la capacità di output.

Figura 1: schema del circuito che consente di espandere la capacità di output.

Grazie a questo circuito un singolo pin diventa in realtà un “bus” permettendo di ottenere 8 pin di uscita con l’aggiunta di poco semplice hardware. Nulla vieta di realizzare lo stesso circuito per i pin ottenuti, arrivando così ad ottenere un numero illimitato di uscite.

Il convertitore seriale-parallelo

Il  circuito di figura 1 utilizza il circuito integrato HC164, prima di entrare nel dettaglio del funzionamento è bene comprendere in che modo agisce questo blocco fondamentale. L’HC164 è un convertitore (o shift-register che dir si voglia) seriale-parallelo,  come ingresso seriale può essere utilizzato uno dei due terminali A o B che finiscono entrambi in ingresso ad una porta logica NAND, come visibile in figura 2.

Figura 2: schema logico dell’HC164 (Texas Instruments).

Figura 2: schema logico dell’HC164 (Texas Instruments).

l’altro terminale della porta NAND può essere utilizzato, posto al livello basso, per forzare il reset del primo flip-flop in sequenza che costituisce la struttura del convertitore. In tutto i  flip flop sono otto, come le uscite parallele desiderate. L’uscita di ogni flip-flop D va ad alimentare il successivo,  i dati vengono caricati durante la transizione basso-alto del segnale di clock. Il segnale  di clear può essere utilizzato per riportare tutte le uscite parallele a zero. In figura 3 è possibile capire bene il funzionamento  del circuito dalle forme d’onda.

Figura 3: forme d’onda per l’HC164, sequenza di clear, shift e nuovamente clear (Texas Instruments).

Figura 3: forme d’onda per l’HC164, sequenza di clear, shift e nuovamente clear (Texas Instruments).

Come passare da uno a otto pin di uscita

Il circuito di figura 1 prevede che il pin di uscita del microcontrollore sia direttamente collegato ad un filtro RC passa basso, permettendo di controllare un convertitore seriale parallelo come l’HC164. Per inserire un dato seriale nel convertitore dobbiamo considerare che ogni bit è composto da una transizione uno-zerouno in cui possiamo gestire la durata dello stato basso. Se attraverso  il pin del microcontrollore generiamo una transizione uno-zero-uno con lo stato basso breve, il filtro in uscita non subirà variazioni di livello ed avremo un livello alto (uno), al contrario se lo stato breve e lungo più della costante di tempo del filtro RC allora in uscita avremo un livello basso (zero). Il tutto è mostrato in figura 4.

Figura 4: segnali clock e data.

Figura 4: segnali clock e data.

Il clock del convertitore seriale-parallelo è preso a monte del filtro RC perciò il campionamento del dato avviene sempre nel momento della transizione zero-uno. Il semplice  listato che segue in linguaggio Assembly mostra come realizzare la routine di aggiornamento per le otto uscite. Prendiamo  il circuito di figura 1, considerando la costante di tempo RC del filtro, considerando il valore massimo consentito dall’HC164 perché sia riconosciuto l’ingresso come livello logico basso e considerata la dovuta tolleranza, imponiamo un tempo di circa 3us in cui il segnale di controllo proveniente dal nostro unico pin d’uscita rimane al livello logico basso nel caso si voglia caricare il convertitore  seriale-parallelo con uno zero. Con il firmware  proposto il tempo di istruzione del microcontrollore deve essere uguale o inferiore ad 1 us affinché  il tutto funzioni correttamente. Ovviamente  i valori di resistenza e capacità del filtro devono essere scelti in base al codice che si va a utilizzare ed al tempo di istruzione della CPU.

Come  ottenere di più

Ovviamente  il circuito di figura 1 ha dei limiti, le uscite così ottenute sono adatte per gestire dispositivi poco reattivi come relè o LCD, non sono adatte per pilotare dei LED. Infatti l’aggiornamento dell’output avviene in maniera sequenziale passando per dei livelli intermedi.  Come possiamo vedere dalla tabella 1, se partiamo dalla situazione in cui tutte le otto uscite sono zero per arrivare alla situazione finale, dopo otto colpi di clock, dove OUTPUT_7, OUTPUT_4 e OUTPUT_3 sono a uno, abbiamo delle combinazioni intermedie indesiderate (evidenziate in rosso) che nel caso le uscite pilotassero dei LED si tradurrebbero in lampeggi indesiderati durante la fase di aggiornamento delle uscite.

Tabella1: Combinazioni intermedie durante l’aggiornamento dell’output.

Tabella1: Combinazioni intermedie durante l’aggiornamento dell’output.

Per eliminare questo problema si può passare al circuito di figura 5.

Figura 5: schema circuitale modificato per ottenere l’aggiornamento simultaneo delle uscite.

Figura 5: schema circuitale modificato per ottenere l’aggiornamento simultaneo delle uscite.

Anziché utilizzare l’HC164 utilizziamo  il 4094 un convertitore seriale/parallelo con un registro in uscita. In questo caso è necessario gestire un ulteriore pin di STROBE che produce l’aggiornamento dei pin di uscita al termine degli 8 colpi di clock. Per generare  i segnali di DATA e di STROBE si utilizzano due monostabili, ovviamente la costante di tempo del monostabile che genera lo STROBE deve essere molto più abbondante della costante di tempo del segnale di DATA, allo stesso tempo non bisogna esagerare perché influisce sul tempo di aggior namento dei pin di uscita che è invece legato al tipo di applicazione che si decide di implementare. Con un circuito come quello di figura 5 è possibile controllare dei dispositivi paralleli come dei moduli display basati sul controller HD44780.

Firmware

Nel listato 1 è riportato il  firmware in Assembly per gestire il circuito di figura 1.

Update
 MOVWF    My_Data                    ;Il dato è nel registro W
 MOVLW    8
 MOVWF    Bit_Counter         ;Bit_Counter vale 8
 BSF      My_Port, My_Bit     ;Metto a 1 il pin di uscita
B1:
 RLF      My_Data, F          ;Faccio shift verso sinistra
 BTFSS    STATUS,CC                   ;il bit da inviare è in CC
 BCF      My_Port, My_Bit      ;invio 0, fronte uno-zero
 CALL     Delay_10us           ;invio 1, rimango a uno
 BCF      My_Port, My_Bit      ;metto il bit d’uscita a 0
 NOP                                  ;attendo un tempo di ciclo
 BSF      My_Port, My_Bit      ;metto il bit a 1, clk 0->1
 DECFSZ   Bit_counter          ;passo al bit successivo
 GOTO     B1

RETURN
Listato 1

Il pin di uscita del microcontrollore è il pin My_Bit della porta My_Port. Il dato da ottenere in uscita dall’HC164 è contenuto inizialmente nel registro W del microcontrollore. Nel caso si voglia passare al convertitore un dato uguale a 1 la durata del livello basso sul segnale d’uscita è pari ad un tempo di ciclo ossia la durata dell’istruzione NOP.

 

 

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend