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
Descrizione del circuito
Il software del PIC16F84
L'alimentazione

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.
Una foto della piastrina realizzata



Nel progetto, vi sono due punti che ritengo didatticamente interessanti:
Per quanto riguarda il primo, una descrizione approfondita è affrontata nella pagina apposita. Il secondo consiste nel gestire 8 display usando solo 6 linee di ingresso/uscita del PIC lasciando quindi le altre libere per applicazioni diverse.
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.
Schema elettrico
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).

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.

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.