Un orologio con PIC16F84 e PCF8573, parte I
NOTE: oggi (2010), il PIC 16F84 è obsoleto. Penso che questo progetto possa esser realizzato con un PIC 16F628 con modifiche minori.
Introduzione
Smontando
un vecchio videoregistratore rotto regalatomi da una mia amica che conosce bene i miei interessi, mi sono
messo a cercare su Internet informazioni sugli integrati che erano
utilizzati in esso. Fra tanti altri, uno mi ha colpito in particolare e
si è trattato del PCF8573 costruito dalla Philips che
costituisce un orologio/datario completo pilotato su bus I2C (cfr. Il bus seriale I2C con un PIC
per maggiori dettagli su questo protocollo). La cosa intrigante era il
fatto che questo integrato richiedesse pochissimi componenti esterni
per funzionare correttamente. Ne è nata quindi l'occasione per
realizzare un orologio un po' diverso dal solito. Premetto che qui
descrivo brevemente il circuito ed il software necessario per usare
l'integrato PCF8573, ma un PIC16F84 può realizzare benissimo da
solo la funzione orologio/datario, grazie alla precisione dell'oscillatore a quarzo (lascio la modifica del software agli
interessati).
Le caratteristiche del PCF8573 permettono di utilizzare una piccola pila ricaricabile da 1,2V, la quale permette di mantenere l'ora anche durante un'assenza di alimentazione di diversi giorni.
Le caratteristiche del PCF8573 permettono di utilizzare una piccola pila ricaricabile da 1,2V, la quale permette di mantenere l'ora anche durante un'assenza di alimentazione di diversi giorni.
Nel progetto, vi sono due punti che ritengo didatticamente interessanti:
Nella seconda parte dell'intervento, descriverò come aggiungere una corona di 60 led utile per rappresentare i secondi.
- la realizzazione della comuncazione su bus I2C
- la gestione in multiplazione (multiplexing) di 8 display a LED a 7 segmenti.
Nella seconda parte dell'intervento, descriverò come aggiungere una corona di 60 led utile per rappresentare i secondi.
Descrizione del circuito
Il circuito elettrico è abbastanza semplice: 4 integrati, qualche resistenza e transistor NPN bastano per la bisogna.
Cominciamo a descrivere la parte più interessante, ovvero quella composta dal microcontrollore 16F84, il CD4511 ed il CD4017. In pratica, si sfrutta il fenomeno di persistenza delle immagini sulla retina per ridurre il numero di linee necessarie per pilotare più di un display.
Cominciamo a descrivere la parte più interessante, ovvero quella composta dal microcontrollore 16F84, il CD4511 ed il CD4017. In pratica, si sfrutta il fenomeno di persistenza delle immagini sulla retina per ridurre il numero di linee necessarie per pilotare più di un display.
Il principio è quello di accendere un
display alla volta in sequenza molto rapida (bastano anche 50Hz) per
fare in modo che essi siano percepiti accesi tutti insieme. Il CD4017
è infatti un contatore decimale di tipo Johnson. Ad ogni impulso
ricevuto sul piedino 14 (CK), esso provvede a trasferire il livello
logico alto sulle sui piedini secondo la sequenza 3, 2, 4, 7, 10, 1, 5,
6, 9, 11, per poi ricominciare dal piedino 3 un'altra volta. In questo
circuito, viene utilizzato per selezionare un display alla volta
ciclicamente grazie ai transistor che fanno capo alle sue uscite. Un
impulso
sul piedino 15 (RESET) permette di far ripartire il conteggio.
L'integrato CD4511 invece è un driver BCD per display, ovvero
provvede da solo a decidere quali segmenti accendere per visualizzare
un numero posto in binario sui suoi ingressi, i piedini 2, 7, 6 ed 1.
Nel nostro caso, tale funzione serve per alleggerire il numero di
piedini di ingresso/uscita necessari al PIC per svolgere l'operazione
richiesta.
In pratica, quello che succede è che subito dopo il RESET del CD4017, il primo display sarà attivo e mostrerà un numero corrispondente alle uscite del PIC che pilotano il CD4511 fino a quando un impulso sarà inviato al CD4017 che provvederà ad accendere il secondo display e così via. Ovviamente, il PIC si deve occupare anche di fornire il codice al CD4511 corrispondente al numero da visualizzare sul display corrente. Se questa sequenza si ripete ad una velocità sufficiente, l'impressione è quella di avere tutti gli otto display accesi contemporaneamente.
Dato che la luminosità apparente delle scritte potrebbe non essere sufficiente a causa della tecnica della multiplazione, risultano particolarmente convenienti display a catodo comune ad alta luminosità appositamente concepiti per questo uso, come il TFK644.
Le linee di uscita del CD4017 utilizzate per attivare i display possono essere vantaggiosamente essere usate anche per gestire dei pulsanti (P1 e P2), che fanno tutti capo ad una linea di ingresso del PIC. Proprio come v'è un solo display alla volta acceso, monitorando la linea di ingresso, il microcontrollore può controllare se il pulsante corrispondente è attivato o no.
Con 7 linee di un PIC e la tecnica presentata, si possono gestire una totalità di 10 pulsanti e 10 display, con dei dispositivi aggiuntivi economici e di facile reperibilità. Non male...
Mentre il CD4017 ed il CD4511 si occupano dei display, l'integrato PCF8573, sempre pilotato dal microcontrollore PIC16F84, costituisce il vero cuore del circuito. Si tratta di un completo orologio/datario che viene letto ed impostato tramite il bus I2C, che è un sistema che consente a diversi dispositivi di comunicare condividendo fra tutti due linee più la massa. Il microcontrollore si occupa nel nostro caso di gestire le due linee per leggere periodicamente l'ora e la data dai registri del PCF8573 e per permettere di regolare questi parametri tramite i pulsanti P1 e P2.
I componenti che vi stanno intorno sono soltanto il quarzo miniaturizzato da 32768Hz che fornisce la base dei tempi per il conteggio, un compensatore che consente di tarare la corretta frequenza, da regolare se l'orologio avanza o ritarda, una pila NiCd che serve come tampone in caso di assenza della tensione di rete ed un transistor NPN BC547 per far lampeggiare gli uno o due led da montare in mezzo ai display delle ore e dei minuti. Si noti la resistenza da 10 kΩ che si occupa di mantenere costantemente sotto leggera carica la batteria quando l'alimentazione di rete è presente.
Un'ultima nota sulla programmazione del PIC: in alto si nota un connettore denominato ICSP. Questa sigla (che vuol dire In Circuit Serial Programming) si riferisce alla nota possibilità dei microcontrollori PIC con memoria FLASH di essere programmati e cancellati semplicemente con segnali elettrici senza essere estratti dal circuito che li ospita, con conseguente guadagno di tempo. Su questo connettore, sono presenti tutti i segnali necessari per realizzare tale operazione con un comune programmatore di PIC (nel mio caso, un Propic2 clone autocostruito).
In pratica, quello che succede è che subito dopo il RESET del CD4017, il primo display sarà attivo e mostrerà un numero corrispondente alle uscite del PIC che pilotano il CD4511 fino a quando un impulso sarà inviato al CD4017 che provvederà ad accendere il secondo display e così via. Ovviamente, il PIC si deve occupare anche di fornire il codice al CD4511 corrispondente al numero da visualizzare sul display corrente. Se questa sequenza si ripete ad una velocità sufficiente, l'impressione è quella di avere tutti gli otto display accesi contemporaneamente.
Dato che la luminosità apparente delle scritte potrebbe non essere sufficiente a causa della tecnica della multiplazione, risultano particolarmente convenienti display a catodo comune ad alta luminosità appositamente concepiti per questo uso, come il TFK644.
Le linee di uscita del CD4017 utilizzate per attivare i display possono essere vantaggiosamente essere usate anche per gestire dei pulsanti (P1 e P2), che fanno tutti capo ad una linea di ingresso del PIC. Proprio come v'è un solo display alla volta acceso, monitorando la linea di ingresso, il microcontrollore può controllare se il pulsante corrispondente è attivato o no.
Con 7 linee di un PIC e la tecnica presentata, si possono gestire una totalità di 10 pulsanti e 10 display, con dei dispositivi aggiuntivi economici e di facile reperibilità. Non male...
Mentre il CD4017 ed il CD4511 si occupano dei display, l'integrato PCF8573, sempre pilotato dal microcontrollore PIC16F84, costituisce il vero cuore del circuito. Si tratta di un completo orologio/datario che viene letto ed impostato tramite il bus I2C, che è un sistema che consente a diversi dispositivi di comunicare condividendo fra tutti due linee più la massa. Il microcontrollore si occupa nel nostro caso di gestire le due linee per leggere periodicamente l'ora e la data dai registri del PCF8573 e per permettere di regolare questi parametri tramite i pulsanti P1 e P2.
I componenti che vi stanno intorno sono soltanto il quarzo miniaturizzato da 32768Hz che fornisce la base dei tempi per il conteggio, un compensatore che consente di tarare la corretta frequenza, da regolare se l'orologio avanza o ritarda, una pila NiCd che serve come tampone in caso di assenza della tensione di rete ed un transistor NPN BC547 per far lampeggiare gli uno o due led da montare in mezzo ai display delle ore e dei minuti. Si noti la resistenza da 10 kΩ che si occupa di mantenere costantemente sotto leggera carica la batteria quando l'alimentazione di rete è presente.
Un'ultima nota sulla programmazione del PIC: in alto si nota un connettore denominato ICSP. Questa sigla (che vuol dire In Circuit Serial Programming) si riferisce alla nota possibilità dei microcontrollori PIC con memoria FLASH di essere programmati e cancellati semplicemente con segnali elettrici senza essere estratti dal circuito che li ospita, con conseguente guadagno di tempo. Su questo connettore, sono presenti tutti i segnali necessari per realizzare tale operazione con un comune programmatore di PIC (nel mio caso, un Propic2 clone autocostruito).
Il software del PIC16F84
Il programma che è eseguito dal microcontrollore si divide in
generale in due parti abbastanza distinte. La prima si occupa di
comunicare con l'integrato PCF8573 grazie al bus I2C grazie a delle funzioni descritte in dettaglio nella pagina apposita del sito.
La seconda, che è richiamata tramite delle interruzioni, si occupa di gestire i display attraverso la tecnica della multiplazione.
All'interno del PIC16F84, è presente un contatore che può essere sincronizzato col clock, di modo da lanciare un'interruzione ad intervalli prefissati. Quando la CPU interna al microcontrollore riceve un'interruzione, essa smette di eseguire il codice normale e salta ad una funzione (che si chiama il gestore di interruzioni) che si occupa di aggiornare il display attivo in maniera ciclica. Una volta terminata la routine, l'esecuzione normale riprende dal punto in cui era stata interrotta come se non fosse accaduto nulla.
Nel software, ad ogni display è assocato una locazione di memoria (un file, nel gergo dei PIC) che viene usata per indicarne il contenuto. Il programma, quando legge i dati dal PCF8573, semplicemente scrive nelle locazioni di memoria adeguate i numeri da scrivere nei display lasciando al gestore di interruzione il compito di gestirne la visualizzazione.
La seconda, che è richiamata tramite delle interruzioni, si occupa di gestire i display attraverso la tecnica della multiplazione.
All'interno del PIC16F84, è presente un contatore che può essere sincronizzato col clock, di modo da lanciare un'interruzione ad intervalli prefissati. Quando la CPU interna al microcontrollore riceve un'interruzione, essa smette di eseguire il codice normale e salta ad una funzione (che si chiama il gestore di interruzioni) che si occupa di aggiornare il display attivo in maniera ciclica. Una volta terminata la routine, l'esecuzione normale riprende dal punto in cui era stata interrotta come se non fosse accaduto nulla.
Nel software, ad ogni display è assocato una locazione di memoria (un file, nel gergo dei PIC) che viene usata per indicarne il contenuto. Il programma, quando legge i dati dal PCF8573, semplicemente scrive nelle locazioni di memoria adeguate i numeri da scrivere nei display lasciando al gestore di interruzione il compito di gestirne la visualizzazione.
Scarica il file asm
L'alimentazione
Tutto il circuito è alimentato con una tensione singola di 5V ed
assorbe circa 75mA e pertanto, alimentato a batteria, non può
funzionare molto a lungo. Un semplice alimentatore formato da un uA7805 ed un piccolo trasformatore da muro può essere
ampiamente sufficiente per lo scopo.
License:
--------
Copyright (C) 2004 Davide Bucci davbucciPleasenospamherE@tiscali.it
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.