I timer programmabili sono oggetti estremamente utili in un’infinità di applicazioni. Tanto per citarne una, si pensi alla temporizzazione dell’esposizione di un PCB sottoposto a sviluppo attraverso un bromografo. Un timer di questo tipo, semplice e flessibile, grazie soprattutto alla peculiarità di essere programmabile e controllabile tramite un display LCD e qualche pulsante, può essere facilmente progettato e realizzato mediante un controllore PIC.
Chi si occupava di elettronica alcuni anni fa, quando ancora i controllori non erano così diffusi e alla portata di chiunque, compresi appassionati e hobbisti, ricorda sicuramente molto bene come fosse complesso realizzare circuiti elettronici dalle funzionalità spesso anche piuttosto semplici. Realizzare, in particolare, delle macchine a stati finiti che implementassero determinati processi richiedeva un’abilità progettuale non indifferente da un punto di vista circuitale, visto che qualunque funzione doveva essere implementata necessariamente via hardware. Questo aspetto introduceva problematiche quali la difficoltà di correggere lo stesso progetto in seguito a errori, oppure la difficoltà di eseguire un upgrade delle funzionalità dello stesso circuito; entrambe le cose necessitavano, infatti, della modifica del PCB e della scheda elettronica che realizzava il circuito. Tali problematiche sono divenute oggi sicuramente affrontabili con più facilità e versatilità grazie all’impiego di dispositivi programmabili. Il fatto di riversare sul firmware la complessità del progetto, rende la progettazione stessa più agevole in quanto ne riduce la complessità hardware e rende il progetto stesso più facilmente modificabile in corso d’opera e in tempi anche piuttosto ridotti. Inoltre, il progetto stesso è spesso migliorabile con l’aggiunta di funzionalità inizialmente non previste, che richiedono solo modifiche firmware e che quindi possono essere effettuate con costi relativamente modesti anche in un secondo momento. Il progetto che presentiamo in questo articolo, al di là della sua finalità pratica e didattica, che rimane comunque il principale obiettivo, è uno dei tanti esempi che si potrebbero proporre concretamente per mostrare quanto detto.
Progetto del timer programmabile
Chi ha avuto modo di costruire un circuito temporizzatore anni fa sicuramente avrà impiegato, allora, integrati contatori e numerosi flip-flop come per esempio i noti C-MOS 4001, 4040, 4013, 4060 e altri analoghi. Quasi sicuramente l’impostazione della temporizzazione sul circuito realizzato avveniva attraverso lo spostamento di spinotti o jumper, oppure agendo su opportuni potenziometri o selettori. Difficilmente si aveva a disposizione un display LCD, anche perchè la sua presenza comportava a sua volta l’integrazione nel progetto di altri integrati mediante i quali pilotare lo stesso display. Inoltre, molto spesso i valori delle temporizzazioni impostabili erano in numero limitato e corrispondevano a precisi valori prefissati. Volendo realizzare lo stesso circuito oggi, molti, come del resto è proposto in questo articolo, non sarebbero portati a impiegare gli stessi componenti con la finalità di realizzare sostanzialmente una macchina a stati finiti a flip-flop, ma impiegherebbero semplicemente un controllore, traducendo e spostando la complessità hardware, come già detto, verso la programmazione firmware. Ecco allora che scompaiono gli integrati contatori dal circuito, dal momento che il contatore può essere implementato in firmware; scompaiono i flip-flop, dal momento che una macchina a stati finiti può essere anch’essa facilmente implementata in firmware; e scompare generalmente anche l’integrato per il controllo del display, dal momento che non è difficile pilotare un display LCD attraverso lo stesso controllore. Ovviamente, non si possono eliminare i dispositivi di front-end come il display stesso, i pulsanti di gestione e le uscite TTL, in open-collector oppure a relè che saranno connesse opportunamente allo stesso controllore. Nell’articolo è illustrato l’hardware e il firmware che implementano proprio un timer realizzato attraverso l’impiego di un controllore PIC di Microchip. Il controllore, come è logico attendersi, è l’unico integrato impiegato, da cui il ridotto hardware necessario. Per contro, il firmware può a taluni apparire anche elaborato e pertanto necessita di una certa attenzione nell’analisi.
Specifiche di progetto
Quello che si vuole realizzare è un timer che risponda alle seguenti esigenze:
» possibilità di essere programmato e controllato attraverso un display LCD a caratteri e dei semplici pulsanti di interfaccia utente;
» possibilità di impostare la temporizzazione secondo il formato hh:mm:ss (cioè ore, minuti, secondi) mediante i suddetti pulsanti e interazione con il display LCD;
» possibilità di avviare la temporizzazione attraverso un pulante di Start;
» possibilità di interrompere anzitempo la temporizzazione, in qualunque momento, attraverso un apposito pulsante di Stop;
» disponibilità di un contatto chiuso durante la temporizzazione e di un suo negato e commutazione di questi alla fine della temporizzazione stessa;
» avvio di un allarme sonoro di richiamo alla fine della temporizzazione;
» allarme suddetto tacitabile da un operatore attraverso lo stesso pulsante di Stop precedentemente citato.
Da quanto esposto si comprende facilmente come un temporizzatore di questo tipo risulti ideale per applicazioni come il controllo del tempo di esposizione di un PCB mediante un bromografo. Infatti, questo progetto è stato originariamente pensato proprio per questo impiego applicativo. Esso, tuttavia, consente in ogni caso di impostare e gestire temporizzazioni che vanno anche ben al di là dei tempi tipicamente necessari per l’esposizione di un PCB. Infatti è possibile impostare tempi che vanno da un minimo di un secondo fino a un massimo di 24 ore con la risoluzione del secondo. In figura 1 è riportato lo schema circuitale del timer che è implementato attraverso l’impiego di un PIC Microchip (PIC16F877) e di alcuni dispositivi periferici.
Il display LCD è collegato nella classica configurazione di pilotaggio a 4 bit (a tale proposito si consiglia di leggere l’articolo “Pilotare un LCD con un microcontrollore PIC” uscito, a suo tempo, sul numero 40 di Firmware). Per semplicità si omette in figura 1 il circuito di alimentazione, supponendo disponibile la tensione di alimentazione necessaria per lo stesso PIC e il display LCD (5Vdc). Tanto il circuito, quanto il firmware successivamente proposto, possono essere in ogni caso utilizzati anche impiegando altri controllori, specie se della stessa famiglia Microchip, ovviamente con qualche piccola e opportuna modifica che tenga conto di ciò e che in ogni caso non lede la generalità dell’impostazione.
Gli ingressi: i pulsanti
Interfacciati al controllore troviamo sei pulsanti dei quali è opportuno elencare le funzionalità:
» pulsante START_PROG: è il pulsante premendo il quale si entra in Modalità di Programmazione. In questa modalità il controllore può ricevere le impostazioni desiderate dall’utente sulla temporizzazione. La programmazione effettuata è memorizzata sotto forma di variabili i cui valori saranno successivamente impiegati a run-time dal controllore. Ovviamente, il controllore presenta un settaggio di default per la temporizzazione e nel caso in cui sia disalimentato, perde in ogni caso l’ultima programmazione effettuata, riportandosi nelle impostazioni di default alla prossima accensione;
» pulsante Select: attraverso questo pulsante l’utente può modificare l’impostazione del Time-out alla fine del quale cessa la temporizzazione. Entrati cioè in modalità di programmazione, l’utente può scegliere di modificare il time-out nel formato ore (hh), minuti (mm), secondi (ss). Questo pulsante è pertanto a tutti gli effetti un pulsante di selezione mediante il quale è possibile scegliere di passare dall’impostazione dei secondi del time-out, a quella dei minuti oppure dell’ora, oppure uscire dalla fase stessa di programmazione;
» pulsante Incremento: attraverso questo pulsante è possibile incrementare il valore del campo ore (hh), minuti (mm) o secondi (ss) del time-out preimpostato o di quello risultante dall’ultima programmazione, secondo le specifiche esigenze dell’operatore;
» pulsante decremento: attraverso questo pulsante è possibile decrementare il valore del campo ore (hh), minuti (mm) o secondi (ss) del time-out preimpostato o di quello risultante dall’ultima programmazione secondo le specifiche esigenze dell’operatore;
» pulsante Start: attraverso questo pulsante è possibile avviare la temporizzazione con time-out pari a quello impostato durante l’ultima programmazione effettuata;
» pulsante Stop: con questo pulsante è possibile interrompere la temporizzazione anzitempo, in qualunque momento, in modo da poterla far ripartire da zero, oppure, nel caso in cui la temporizzazione sia giunta a termine, evento cui consegue l’attivazione dell’allarme, è possibile tacitare immediatamente l’allarme stesso (buzzer).
Le uscite
Oltre al display, le cui funzionalità saranno meglio illustrate successivamente, il temporizzatore presenta le seguenti uscite:
» LAMP_ON: rimane ON dal momento in cui viene avviata la temporizzazione (tasto Start) fino al momento in cui questa viene interrotta (tasto STOP), oppure giunge a termine (time-out). Superato questo istante, tale uscita si spegne (OFF). Questa uscita può essere pertanto impiegata, nel caso del bromografo, per tenere accesa la lampada di quest’ultimo per l’intero tempo di esposizione programmato e per spegnerla automaticamente alla fine dello stesso periodo senza che l’operatore debba intervenire direttamente;
» NOT_LAMP: è semplicemente la versione negata della precedente uscita;
» buzzer: è l’allarme che scatta alla fine della temporizzazione (time-out) e che può essere tacitato attraverso il tasto Stop. In altre parole è l’allarme che nel caso del bromografo serve a richiamare l’attenzione dell’operatore in modo da notificare lo stato di “fine esposizione” e che può essere tacitato da quest’ultimo attraverso il tasto Stop. In realtà l’operatore può anche non intervenire pronta mente, a patto di sopportare il rumore del buzzer, in quanto il timer spegne automaticamente la lampada alla fine della temporizzazione. Dal momento che il buzzer non è di fondamentale importanza, potrebbe essere posto un interruttore sulla base del transistor che lo pilota in modo da poterlo elettricamente escludere se la sua funzione è considerata inutile o addirittura fastidiosa.
Operatività
Prima di esaminare il firmware che implementa, sull’hardware mostrato nello schema circuitale, le funzionalità prima richiamate, è opportuno illustrare, con alcune figure esplicative, le stesse funzionalità e l’operatività utente. A tale proposito ci avvarremo delle schermate di un simulatore di controllori PIC in modo da rendere l’esposizione e la comprensione più efficace.
Fase di avvio
All’avvio (cioè all’alimentazione elettrica del circuito) il display si mostra come in figura 2.
In essa sono anche mostrati, in modo esplicito, i riferimenti elettrici dei pin di connessione dello stesso display al controllore e all’alimentazione. I LED C0 e C1 rappresentano rispettivamente le due uscite LAMP_ON e NOT_LAMP e sono inizialmente entrambi OFF poiché il ciclo operativo del temporizzatore non ha ancora avuto inizio. Tutti i pulsanti sono normalmente aperti e pertanto, in base allo schema circuitale, determinano l’instaurarsi di un livello logico “1” sugli ingressi del PIC quando non sono premuti e un livello logico “0” nel caso opposto. L’indicazione No Signal in prossimità dell’icona del buzzer nelle figure indica il fatto che non vi è attività sul buzzer, cioè non vi è allarme (timer in stato di OFF oppure timer che non ha ancora raggiunto il time-out oppure timer tacitato). Superata la fase di avvio, sul display compare il tempo preimpostato per default (10 secondi) come time-out e le uscite LAMP_ON e il suo negato si portano allo stato prefissato (OFF e ON rispettivamente, vedi figura 3).
In queste condizioni non è ancora iniziata la temporizzazione in quanto non è stato ancora dato l’avvio attraverso il pulsante Start. PROG che compare sulla prima riga indica che il valore programmato in questo momento per la temporizzazione (time-out) è 00 h:00 min:10 sec. La seconda riga è contrassegnata dall’indicazione Time, ma in corrispondenza non compare alcun tempo in scorrimento in quanto non è ancora stata avviata la fase di temporizzazione.
Modalità di programmazione
Premendo il tasto Start_Program (PIN_A3) si entra in modalità di programmazione. La comparsa di “ss” a destra sulla prima riga indica, in modo esplicito all’operatore che in questo momento è possibile modificare il campo dei secondi sul tempo di time-out (figura 4).
Attraverso il pulsante Select (PIN_A2) è possibile passare all’impostazione dei minuti (pulsante premuto una prima volta) oppure dei secondi (pulsante premuto una seconda volta, vedi figura 5).
Attraverso i pulsanti INCREMENTO (PIN_A0) e DECREMENTO (PIN_A1) è invece possibile incrementare o decrementare il valore dei secondi, dei minuti oppure delle ore impostati come time-out. Alla fine della fase di programmazione, il display appare come in figura 6, dove il valore visualizzato a sinistra della scritta PROG indica il valore di timeout programmato.
Premendo il pulsante Start si avvia la temporizzazione che scorre ed è notificata in real-time nella seconda riga (area a sinistra dell’indicazione Time). Il confronto tra la temporizzazione in corso visualizzata nel suo scorrere sulla seconda riga e il valore di time-out, impostato e visualizzato sulla prima riga, permette all’utente di conoscere in ogni istante completamente lo stato del temporizzatore. Durante la temporizzazione l’uscita LAMP_ON è ON mentre l’uscita NOT_LAMP, che né è la versione negata, è ovviamente OFF. La temporizzazione può essere interrotta prima che la stessa giunga a termine (cioè prima che si abbia il raggiungimento del time-out impostato sulla prima riga) mediante il pulsante Stop (PIN_E1) il che determina anche l’azzeramento di LAMP_ON (figura 8).
Qualora non si in terrompa anticipatamente lo scorrere della temporizzazione, questa si interrompe automaticamente al raggiungimento del time-out (visualizzato sulla prima riga). Nello stesso istante in cui il time-out preimpostato è raggiunto, l’uscita LAMP_ON va in stato di OFF, NOT_LAMP in stato ON e contemporaneamente viene eccitato il buzzer che richiama l’attenzione dell’operatore (figura 8).
Il buzzer può essere tacitato agendo sul pulsante di stop (figura 9).
Il timer conclude il ciclo di temporizzazione nel rispetto delle specifiche di progetto. Lo stesso temporizzatore può, a questo punto, essere riavviato con la stessa temporizzazione impostata agendo sul pulsante di START o può essere riprogrammato prima del riavvio attraverso il pulsante PIN_A3. In figura 10 è mostrata una delle fasi di testing del progetto mediante l’ausilio della scheda di sviluppo Easy PIC 3D, mentre nel riquadro presente all’interno della stessa figura è mostrata la struttura del progetto firmware e in particolare la lista dei file che compongono il progetto stesso.
Bellissimo articolo molto didattico, complimenti. L’implementazione degli stati d’attesa è proprio una bella argomentazione. Solitamente, quando si implementa una pausa d’attesa normale, il sistema resta “congelato”. E’ invece interessante realizzare pause d’attesa, durante le quali la MCU si occupa di altre cose. Anche senza multitasking, con un po’ di fantasia, è possibile arrivare al risultato.
Con questo articolo mi sono ricordato dei compito in classe di elettronica dei tempi dell’ITIS. A quei tempi la parola firmware forse non esisteva neanche, e si andava avanti a testa bassa a forza di FF, registri, demux e compagnia bella.