R.T.C.C. con PIC16F1827

I microcontrollori PIC 16 dispongono di un timer e di un dispositivo di comunicazione I2C verso l’esterno. L’articolo descrive l’implementazione di un R.T.C.C. software che può sostituire quelli hardware o essere integrato in altre applicazioni. Esso fornisce le cifre di tempo in secondi, minuti e ore, quelle di giorno, mese e anno, il giorno della settimana e anche un allarme.

L’implementazione si basa sul Timer1 che può funzionare tramite un oscillatore interno a basso consumo che, in questo caso, riceve un segnale esterno di 32.768 kHz; l’oscillatore può funzionare quando il microcontrollore è posto in sleep mode e ciò limita il consumo nelle applicazioni che prevedono un’alimentazione fornita, ad esempio, da una batteria. Il registro associato al Timer1 è formato dalla coppia di registri TMR1H TMR1L e conta da 0x0000 fino a 0xFFFF; una volta giunto a tale valore, se ulteriormente incrementato, esso si azzera, viene settato a 1 il flag relativo, TMR1F, e attivato l’interrupt se questo è stato abilitato; il flag si può azzerare via software. Il flag TMR1F permette di uscire dallo sleep mode senza fermare il conteggio del Timer1. La modifica delle cifre relative a tempo e data può essere fatta successivamente prima che il TMR1F venga nuovamente posto a uno.

INTERFACCIA DI TRASMISSIONE

L’R.T.C.C. comunica con un dispositivo host tramite un bus I2C, ciò si ottiene tramite un set di istruzioni e di registri dedicati all’R.T.C.C. che permettono al dispositivo host di leggere e di scrivere le cifre di tempo e data. I registri dal 0x0F al 0x0E permettono la lettura e la scrittura di più byte alla volta come richiesto dal firmware.

Figura 1: mappa dei registri interni

Figura 1: mappa dei registri interni

CALCOLO DEL GIORNO DELLA SETTIMANA

Per individuare il giorno della settimana si ricorre ad un algoritmo che si basa su un giorno stabilito, nel nostro caso il primo gennaio 2000. Per esso servono quattro cifre che si possono ricavare a partire dalla data:

  • la cifra dei secoli: per essa, considerando il secolo scelto, si usa la cifra 6;
  • la cifra degli anni: essa si ottiene sommando il numero degli anni trascorsi dall’inizio del secolo al numero degli anni bisestili di tale periodo, come riportato in Figura 2 (le parentesi quadre indicano la parte intera della cifra corrispondente alla frazione);
  • la cifra dei mesi: per essa si ricorre alla tabella riportata in Figura 3;
  • la cifra dei giorni: essa è la cifra corrispondente al giorno nella settimana; sommando le quattro cifre, dividendo la somma per sette e considerando il resto si ottiene il giorno della settimana dalla tabella di Figura 4, che riporta la corrispondenza tra tale giorno e la cifra del resto.

Si può provare l’algoritmo per trovare il giorno della settimana corrispondente alla data del primo ottobre 2009. La cifra dei secoli è 6, quella degli anni è 11 (9+2, dove 2 è la parte intera della cifra corrispondente a 9/4), quella dei mesi è 0 e quella dei giorni 1. La somma delle quattro cifre produce 18 e il resto della divisione 18/7 è 4; il giorno della settimana è, pertanto, giovedì.

Figura 2: equazione per il calcolo della cifra degli anni.

Figura 2: equazione per il calcolo della cifra degli anni

 

Figura 3: tabella della cifra dei mesi.

Figura 3: tabella della cifra dei mesi

 

Figura 4: tabella dei giorni della settimana.

Figura 4: tabella dei giorni della settimana

Commento del firmware

Il main program consiste in una funzione, DayOfWeek, che ha come parametro di ingresso la variabile rtcc la quale contiene le cifre relative al tempo e alla data e restituisce il giorno della settimana corrispondente. All’interno del while il programma decide se eseguire una comunicazione I2C o rimanere in sleep mode (Listato 1).

void main() {
// Initialize the calendar
 rtcc.time.seconds = 0;
 rtcc.time.minutes = 33;
 rtcc.time.hour = 10;
 rtcc.date.day = 10;
 rtcc.date.month = 1;
 rtcc.date.year = 9;
 rtcc.date.dayofweek = 0;
 // First time calculation of day of week
 rtcc.date.dayofweek = DayOfWeek ( rtcc );
Initialize();
Init_timer1();
I2C_Slave_Init();
                          initInts();
while(1)
{
                         // if there is no I2C transaction go to sleep
                         if (pksa_status == I2C_NO_TRANSACTION)
                            sleep();
                            if (!BUTT)
                        { LED_1 = 1;
}
                        else
                           LED_1 = 0;
}
 }
Listato 1

BASSO ASSORBIMENTO

L’R.T.C.C. può essere alimentato da una batteria di riserva. Quando esso non funziona in sleep mode può essere alimentato da un’alimentazione principale. Lo stato di sleep mode va mantenuto il più a lungo possibile; esso consente all’oscillatore interno di rimanere attivo. Nella presente applicazione il Timer1 pone fine allo sleep mode una volta al secondo, le cifre di tempo e, se necessario, quelle di data vengono modificate e il microcontrollore ritorna allo sleep mode. La stessa cosa accade per accedere ai registri interni tramite il bus I2C. Il firmware assicura che nello sleep mode i moduli non necessari non vengano chiamati; l’alimentazione principale può essere spenta.

POSSIBILI UPGRADE

Un possibile upgrade consiste nel disporre di un registro di 32 bit incrementato ogni secondo; questo aumenterebbe ancor più il tempo in cui il microcontrollore è in sleep mode, il solo compito del microcontrollore una volta uscito da tale stato sarebbe incrementare di un’unità il registro a 32 bit e la conversione del valore di questo contatore in cifre di tempo e data sarebbe effettuata appositamente tramite un altro dispositivo. Questo potrebbe avvenire tramite una comunicazione I2C.

CONCLUSIONE

Questa applicazione mostra un possibile uso del Timer1 del PIC16F1827 per implementare un R.T.C.C. software; la tecnologia XLP, Extreme-Low Power, rende l’applicazione interessante in termini di costo, performance e basso assorbimento. Il firmware occupa uno spazio della memoria flash di programma di 821 words, richiede 53 byte della RAM per i dati e un interrupt del Timer1. L’intero codice sorgente dell’applicazione è reperibile sul sito www.microchip.com.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend