RTC - Pcf8593p e arduino

Salve a tutti. Sto tentando da un po' di tempo di leggere l'RTC Pcf8593p ma con scarsi risultati . Sto utilizzando l'esempio tratto dal seguente link http://www.arduino.nl/?p=7 Per quanto riguarda la lettura dell'ora va tutto bene ma quando cerco di leggere la data le cose si complicano. Ho provato a mettere nel ciclo loop oltre a getTime anche getDate ma mi stampa date assurde del tipo passa dal 31/3/12 a 32/23/13. Ho usato anche una funzione che mi converte il formato BCD a decimale e viceversa ma senza risultati. Ho provato a cambiare i bit dell'address 00h (che nell'esempio sono posti tutti a 0) ma niente. Non dovrebbero anche il giorno il mese e l'anno incrementarsi da soli ? O devo creare una procedura che tramite codice arduino mi aggiorna la data ?

qualcuno sa dirmi dove sbaglio ??

Grazie

Non so che libreria usi, non so che sketch usi.

BTW io uso solo il PCF8563 come RTC e mi trovo piuttosto benino. Ti allego una libreria che a me funziona perfettamente. Ho fatto delle piccole aggiunte, come ad esempio il comando per verificare se l’orologio si è fermato, quello per togliere questo avviso ed anche la data restituita in formato italiano (gg/mm/aaaa).

Rtc_Pcf8563.zip (8.23 KB)

Ciao Leo72
Ho anch’io il PCF8563 (acquisto sbagliato a causa delle ridotte dimensioni e per ora non lo sto usando) ma ha un registro diverso rispetto al PCF8593.
Non sto usando nessuna libreria anche perchè non esiste.
Ho trovato l’esempio al link http://www.arduino.nl/?p=7 che però non mi consente di avere la data che si aggiorna automaticamente e se lo fa, lo fa in maniera strana

Grazie comunque

Scusa, ho letto male 85*9*3 :sweat_smile: Cmq vedo che usa sempre il bus I2C e gli stessi pin, bene o male. Ho dato un'occhiata allo sketch in quel sito, non usa librerie perché integra il codice di gestione. Hai controllato i collegamenti? Hai provato stampando i dati letti senza "trattamenti" per vedere cosa arriva dal micro?

Riguardando lo schema di quel sito, noto che non vanno bene le resistenze di pull-up sul bus I2C. Con tensioni di 5V si usano di valore compreso fra 1,5K e 2,2K perché altrimenti la corrente fornita al bus non è sufficiente per le specifiche stesse del bus. Inoltre, tanto per farlo funzionare inizierei da un circuito più semplice, tipo questo: http://hackaday.com/2009/06/26/parts-i2c-real-time-clock-calendar-pcf8563/ tanto hanno la stessa piedinatura

Salve Ho provato a sostituire le resistenze di pull-up provando con 2,2 kohm ma niente è cambiato. Ecco cosa mi stampa 23:59:58 31/3/12 23:59:59 31/3/12 0:0:0 32/23/13 0:0:1 32/23/13 Trovo alquanto strano che aggiorni la data in maniera così assurda...

Ma io ti avevo detto di stampare il valore raw dei registri letti. Cioè senza "tradurre" i valori in numeri, stampa direttamente con Serial.println(valore, BYTE) e vedi cosa ti trasmette il chip, per capire se è un errore di conversione oppure no. Io credo di sì perché l'orario lo vedo procedere bene, mi pare strano che stampi la data a caso.

Non tutti i byte di un registro vengono usati per rapresentare il numero del giorno, mese e anno.

Nel registro del mese i bit 0 a 3 e sono gli uni in formato BCD e il bit 4 le decime del mese. I bit 5 a 7 sono il giorno della settimana. Per sapere il mese devi ignorare i bit 5 a 7.

Stessa cosa vale per i giorni: i bit 0 a 3 sono gli uni in formato BCD e il bit 4 e 5 le decime del giorno. I bit 6 a 7 sono l' anno. Qusto RTC conosce solo 4 anni diversi. Per sapere il mese devi ignorare i bit 6 e 7.

Poi non so da dove prendi il "12" del anno perché questo RTC non ha un registro dei anni ma solo 2 bit per gestire gli anni bisestili.

http://www.nxp.com/documents/data_sheet/PCF8593.pdf

Ciao Uwe

leo72: Non so che libreria usi, non so che sketch usi.

BTW io uso solo il PCF8563 come RTC e mi trovo piuttosto benino. Ti allego una libreria che a me funziona perfettamente. Ho fatto delle piccole aggiunte, come ad esempio il comando per verificare se l'orologio si è fermato, quello per togliere questo avviso ed anche la data restituita in formato italiano (gg/mm/aaaa).

Ciao Leo mi sembra di capire che PCF8563 sia compatibile con un circuito che monta il ds1307 :| ti risulta?

EDIT: MI sà che ho preso una cantonata :D

francesco84: mi sembra di capire che PCF8563 sia compatibile con un circuito che monta il ds1307 :| ti risulta?

Uhm. No. La piedinatura dei 2 micro è differente ed anche i registri interni per cui le lib da usare per estrapolare i dati.

Nel datasheet c'è scritto:

Clock function with four year calendar

Mi spiegate a cosa potrebbe servire un integrato che tiene conto solo del giorno e del mese e, al massimo, se l'anno è bisestile? Non riesco a trovare una applicazione che possa necessitare di solo questi dati.

Non mi ricordo bene ma credo che li abbia comprati per errore, al posto dei PCF8563.

Peccato cercavo un master di un pcb per quell'integrato già fatto(viva la pappa pronta :D ) sigh sigh ma nulla da fare grgrgr

EDIT: Anzi ora che ci penso è la prima volta che nn trovo un cavolo su internet :_D

Ciao,

come diceva Uwe o fai il masheramento de dei bit del byte per estrarre data e mese, oppure devi configurare il bit 3 del registro 00h (0x00) ad 1.

Se leggi il datasheet vedrai che c'e' scritto per il bit numero 3: "... mask flag: logic 0: read locations 05h to 06h unmasked logic 1: read date and month count directly ..."

Questo RTC lo puoi utilizzare come orologio, timer o contatore di eventi. Poi ha l'allarme, se non lo utilizzi, allora puoi utilizzare i registri come RAM.

Io utilizzo il PCF2127A con cristallo integrato e compensazione temperatura e svariate funzionalita' fra le quali watchdog, timer e allarmi tutti con interrupt, uscita onda quadra (da 32768 giu' a scalare fino ad 1 Hz), 512 byte di SRAM, puo' essere utilizzato con comunicazione I2C o SPI. Ha la possibilita' di avere la batteria di backup (anche per la memoria RAM). L'unica cosa "negativa" e' che l'alimentazione massima e' di 4,2 V. Pacchetto SO20, 20 piedini facilmente saldabile anche a mano.

Costa sui 3 Euro e, viste le sue funzionalita', il prezzo/prestazioni e' molto favorevole, piu' dei vari RTC della Maxim (che peraltro utilizzo a volte).

Ciao, Marco.

Risolto.
Brevemente l’anno non viene tenuto in memoria ma vi è traccia solo del numero 0=bisestile ,1,2,3 per gli anni normali.
Non è molto comodo in quanto mi devo appoggiare alla eeprom di arduino per memorizzare l’anno (esempio 2012 0 solo 12) a cui sommo 0,1,2,3 e poi aggiorno a 2016 quando la traccia da 3 torna a 0. (l’alternativa è usare la eeprom dei registri lasciati liberi se non uso gli allarmi).
Per il giorno e il meso uso il registro
#define dayReg 0x05 // INDIRIZZO GIORNO
#define monthReg 0x06 // INDIRIZZO MESE
poi imposto il giorno il mese e l’anno nel seguente modo
byte year =0x12; // ANNO che non cambia
byte month =0x4; //MESE
byte day = 0x8; //GIORNO

nel byte dedicato al giorno i primi 4 bit sono dedicati alle unità del giorno il 5 e 6° bit ai decimali (6 bit su 8 sono dedicati al giorno, mentre gli ultimi 2 sono dedicati alla traccia dell’anno 0,1,2,3 con 0 bisestile)
nel byte dedicato al mese i primi 4 bit sono dedicati alle unità del giorno il 5° bit ai decimali del mese (5 bit su 8 sono dedicati al mese, mentre gli ultimi 3 bit sono dedicati al giorno della settimana da 0…6).
E’ chiaro che l’incremento del giorno e mese riguarda rispettivamente i primi 6 bit del byte 05h e i primi 5 bit del byte 06h.
Tuttavia potrebbe verificarsi contemporaneamente l’incremento della traccia dell’anno (esempio 31/12/2012 al passaggio cambia il giorno che diventa 1 e in binario i primi 6 bit saranno 000001 e anche la traccia dell’anno che da 0 passerà a 1 e quindi gli ultimi 2 bit diventeranno 01 questo comporta che il byte completo non è più 1 ma preso nel complesso ho 01000001 che stampato da 65)
La cosa diventa più delicata nel mese dove oltre al mese ho il giorno della settimana che cambia più spesso.
La soluzione consiste nel porre a 0 rispettivamente gli ultimi 2 bit per il giorno e gli ultimi 3 bit del mese prima di stamparli.

void printDate()
{
Serial.print(erase_bit(day,6,7),HEX);
Serial.print(’/’);
Serial.print(erase_bit(month,5,7),HEX); // oppure ,DEC al posto di HEX ma devo fare una conversione da BCD a decimale di month
Serial.print(’/’);
Serial.println(year,HEX); //
}
dove erase_bit è la seguente :

byte erase_bit (byte valore, int Start,int End)
{
for (int i=Start;i<End+1;i++)
bitClear(valore,i); //pongo a 0 il bit i del numero valore
return valore;
}

Ma invece di tenerti l'8593, perché non ti compri un 8563 così tagli la testa al toro e risolvi tutti questi problemi? :P

Ho anche il PCF8563 ma è in formato SO8 (acquisto sbagliato ma sto cercando di saldarlo in qualche modo) e non DIP.
Il mio era un tentativo di capire come funzionano questi dispositivi…
Comunque mi sto orientando sul 8563 (ho anche il Ds1307 ma ci sono già le librerie pronte come per il PCF8563).
Inoltre lavorare con gli indirizzi di memoria e ai vari bit direttamente mi serve anche per poi leggere i dispositivi usando i PIC (attualmente uso il PIC16F88 e PICF84A) e comunicare con arduino i valori tramite la seriale (con il pic controllo già un display seriale).

Continuando con la scoperta delle funzionalità del RTC PCF8593p (e in prospettiva il PCF8563) non mi è chiaro
il funzionamento dell’alarm e del timer.
Se uso normalmente il PCF come clock ho visto che ogni secondo manda un segnale al
piedino int (piedino 7 del PCF).
Il segnale lo utilizzo per avviare la funzione attachInterrupt di arduino per stampare la
data e l’ora.
La mia domanda ora riguarda cosa succede a questo segnale se uso il timer e l’alarm ?
Come fa a distinguere (se sono distinti) l’allarme da un ipotetico timer o dal semplice segnale
che uso per stampare la data e l’ora?

Grazie

Uhm. A logica solo leggendo il flag del micro che viene attivato all'....attivarsi dell'allarme :sweat_smile: A meno che l'allarme non tenga fisso su LOW il segnale del pin INT/. Il clock so per certo che non lo fa, essendo un segnale con duty cicle del 50% per cui vedi alternanza di segnale HIGH e LOW.

Quindi se ho capito bene o funziona da clock (magari posso regolare il tempo di low o high sul pin int che ora è settato a 1 secondo) o da alarm (in base al tempo che metto nella memoria).

Bye