EEprom I2C + Clock Calendar PROBLEMA

Qualche giorno fa con l'aiuto di leo72 ho risolto un problema su una mia
schedina con una EEprom I2C.
Continuando con l'esplorazione della mia mega2560.

Ho fatto una schedina con una EEprom I2C e un clock calendar
PCF8583 ed ho dei problemi.

Se su questa scheda inserisco solo la EEprom funzione bene ma se
inserisco anche il PCF8583 (senza nessun codice per quest'ultimo)
non funziona più correttamente neppeno la EEprom.

Se ad esempio scrivo il num. 8, legge quasi sempre 0 e qualche volta
il num. 8

Allego ll codice che ho caricato sull'Arduino e lo schema
della schedina.

Vi ringrazio per suggerimenti.

Saluti.

EEp_Clock.pdf (15.1 KB)

EEp_Clock.pde (1.59 KB)

Non capisco lo schema :sweat_smile:

<<Non capisco lo schema

IC1 è la EEprom I2C nel mio caso una 24C32
IC2 è il Clock Calendar PCF8583

Ho messo dei diodi:
D1 - per impedire l'inversione (positivo) con (negativo) per non
danneggiare la EEprom.
D2 - per bloccare la tensione della pila verso la EEprom, questo per
limitare il consumo della pila.
D3 - per bloccare la tensione di alimentazione (+5) verso la pila)

R1 e R2 sono le due resistenze di pull-UP da 2k2.

Poi come da Data sheet del PCF8583
c'è il quarzo da 32,768 Khz
e il compensatore.

Saluti

C3 dovrebbe andare su + alimentazione (pin 8 Vdd del RTC) e non a massa.
Metti il pin 3 (A0) a Massa o a +Vdd ( pin 8 dopo il diodo)
Togli il diodo sul alimentazione del EEprom; non serve.
Ciao Uwe

Ma C3 dovrebbe essere il condensatore del quarzino del PCF8563, questo RTC ne chiede solo uno sul pin 1 del micro. Credo che il C di disaccoppiamento sia C2, collegato fra il pin 8 e massa.

Grazie Uwe non mi ero accorto della differenza tra lo schema proposto sui datasheet
del PCF8583 e del PCF8563.
Ultimamente ho utilizzato il PCF8563 ecco perchè ho fatto lo schema in quel modo.
Ho montato un PCF8583 perchè è il primo che ho trovato nel cassetto.
Senza modificare niente ho smontato un PCF8563 da un' altra scheda ed ho provato
e con questo funziona.
Naturalmente ci ritornerò a provare il PCF8583 collegando quel compensatore sul +.

Leo72 sto provando la tua libreria, per il momento solo alcune prove, ma OK.
Il C2 è il classico condensatore poliestere da 0,1 uF.

Saluti Carletto.

Pensavo di aver risolto il mio problema, ma non è cosi.
Adesso ho fatto una nuova schedina con solo un PCF8563 e nemmeno da solo
riesco a farlo funzionare, ma ho scoperto una cosa per me molto strana.
Innanzi tutto con il codice che allego vedo contare i secondi, minuti ecc.
se non preimposto nessun valore incomincia da 0.
Lo strano è che anche se scollego la schedina il mio contatore continua
a contare sul display.

Il mio codice:
#include <LiquidCrystal.h>
#include <Wire.h> //Libreira I2C.
#include <swRTC.h>
//---Inizializzazione variabili--------------------------------
byte pu1=8;
byte abil_pu1;
int cont_pu1;
byte LED1=9;
LiquidCrystal lcd(3,2,4,5,6,7); //rs,e,d4,d5,d6,d7.
swRTC rtc;
//---Predisposizione-------------------------------------------
void setup() {
pinMode(pu1,INPUT);
pinMode(LED1,OUTPUT);
digitalWrite(pu1,HIGH); //Abilita pull-up.
delay(5000); //Ritardo per permettere di aprire il serial monitor.
Wire.begin(); //Inizializza il bus I2C.
rtc.startRTC(); //Avvia RTC
Serial.begin(9600); //Velocità porta seriale.
delay(200);
lcd.begin(20,2);
lcd.clear();
abil_pu1=HIGH;
}
//---Ciclo principale------------------------------------------
void loop() {
if(digitalRead(pu1)==0){ //Imposto un valore fisso per prova.
if(abil_pu1==1){ //Antiripetizione.
abil_pu1=LOW; //Antiripetizione.
rtc.stopRTC(); //Arresta RTC
rtc.setTime(16,42,20); //Predispone orario.
rtc.setDate(22,1,12); //Predispone data.
rtc.startRTC(); //Avvia RTC
digitalWrite(LED1,HIGH); //Accende il LED.
}
cont_pu1=0;
}
else{ //Antiripetizione.
if(abil_pu1==0){
cont_pu1++;
if(cont_pu1>20){
abil_pu1=1;
digitalWrite(LED1,LOW);
}
}
}
lcd.setCursor(0,0);
lcd.print("Ore: ");
if(rtc.getHours()<10){lcd.print("0");}
lcd.print(rtc.getHours(),DEC); //Visualizza Ore.
lcd.print("-");
if(rtc.getMinutes()<10){lcd.print("0");}
lcd.print(rtc.getMinutes(),DEC); //Visualizza minuti.
lcd.print(".");
if(rtc.getSeconds()<10){lcd.print("0");}
lcd.print(rtc.getSeconds(),DEC); //Visualizza secondi.
lcd.setCursor(0,1);
lcd.print("Data:");
lcd.setCursor(5,1);
if(rtc.getDay()<10){lcd.print("0");}
lcd.print(rtc.getDay(),DEC); //Visualizza giorno.
lcd.print("-");
if(rtc.getMonth()<10){lcd.print("0");}
lcd.print(rtc.getMonth(),DEC); //Visualizza mese.
lcd.print("-");
if(rtc.getYear()<10){lcd.print("0");}
lcd.println(rtc.getYear(),DEC); //Visualizza anno.
delay(1000);
}