Timer programmabile con PIC

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.

Figura 1: schema circuitale che implementa il timer mediante l’impiego del controllore Microchip PIC16F877.

Figura 1: schema circuitale che implementa il timer mediante l’impiego del controllore Microchip PIC16F877.

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.

Figura 2: stato del timer all’avvio.

Figura 2: stato del timer all’avvio.

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

Figura 3: stato del timer immediatamente dopo l’avvio.

Figura 3: stato del timer immediatamente dopo l’avvio.

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

Figura 4: entrata in modalità di programmazione (pulsante PIN_A3).

Figura 4: entrata in modalità di programmazione (pulsante PIN_A3).

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

Figura 5: modalità di programmazione (impiego del tasto Select – PIN_A2 per la selezione dell’impostazione dei minuti e delle ore).

Figura 5: modalità di programmazione (impiego del tasto Select – PIN_A2 per la selezione
dell’impostazione dei minuti e delle ore).

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.

Figura 6: display dopo la programmazione del timer.

Figura 6: display dopo la programmazione del timer.

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

Figura 8: timer messo in stato di Stop prima della fine della temporizzazione

Figura 7: timer messo in stato di Stop prima della fine della temporizzazione

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

Figura 9: timer giunto alla fine della temporizzazione ed eccitazione del buzzer

Figura 8: timer giunto alla fine della temporizzazione ed eccitazione del buzzer

Il buzzer può essere tacitato agendo sul pulsante di stop (figura 9).

Figura 10: tacitazione del buzzer.

Figura 9: tacitazione del buzzer.

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.

Figura 11: test del progetto Firmware attraverso Easy PIC 3D e struttura Firmware del progetto

Figura 10: test del progetto Firmware attraverso Easy PIC 3D e struttura Firmware del progetto

 

 

 

 

Scarica subito una copia gratis

2 Commenti

  1. Avatar photo Giovanni Di Maria 28 Dicembre 2018
  2. Avatar photo Andrea Garrapa 28 Dicembre 2018

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend