Pagina 1 di 1

Interfacciamento RTC DS1302

MessaggioInviato: 21 apr 2022, 12:00
da daniele1996
Ciao a tutti, avendo la necessità di mantenere l'orario anche dopo lo spegnimento ho deciso di aggiungere un rtc DS1302. Inizialmente funzionava, manteneva l'orario, nelle ultime prove quando leggo la data mi restituisce 01:01:01 01/01/01 Day: 01. Nel codice non imposto a zero il bit CH all'indirizzo 0x80(R)/0x81(W), può essere questo il problema? Appena posso provo a caricare il codice che imposta questo bit a zero e vi dico.
Per quanto riguarda la batteria, ho recuperato da un "timer" digitale una batteria ricaricabile 2032 i cui dati di targa indicano 3.6V, l'ho installata e ho impostato il caricabatteria a 2 diodi e la resistenza da 2K. Esattamente nel registro 0x90 imposto il valore di 0xA5 (1010 0101) (ho preso questo valore da un esempio su internet). Tenendolo qualche giorno acceso, ho misurato la tensione della batteria ed è a circa 4V, Questo può dare problemi? Esattamente quando si può considerare "carica" la batteria? Grazie :)

Re: Interfacciamento RTC DS1302

MessaggioInviato: 21 apr 2022, 16:03
da GioArca67
La batteria ricaricabile citata dovrebbe essere agli ioni di litio, quella indicata è la tensione nominale: cioè la media fra tensione della batteria quando ritenuta carica - circa 4,2 V - e quando ritenuta scarica - circa 3.0 V -, a seconda di questi valori (ognuno la pensa in modo diverso, e per questioni di marketing) esce 3,6V o 3,7V.
A 4 V la batteria è quasi completamente carica

Re: Interfacciamento RTC DS1302

MessaggioInviato: 22 apr 2022, 2:32
da daniele1996
Quindi non è un problema se la tengo sempre sotto carica?
comunque, ho provato ad impostare il bit manualmente, non cambia nulla... rimane sempre bloccato su 1/1/1 1:1:1

Re: Interfacciamento RTC DS1302

MessaggioInviato: 22 apr 2022, 10:15
da stefanopc
Non è un problema ma se si tratta di una Li-Ion io non oltrepassarei i 4.1V .
Agendo su switch diodi e resistenze interne si dovrebbe riuscire a mantenere la batteria alla tensione desiderata.
Ciao

Re: Interfacciamento RTC DS1302

MessaggioInviato: 22 apr 2022, 12:45
da daniele1996
daniele1996 ha scritto:ho impostato il caricabatteria a 2 diodi e la resistenza da 2K. Tenendolo qualche giorno acceso, ho misurato la tensione della batteria ed è a circa 4V

Due diodi sono 1.4V, quindi 5 - 1.4 = 3.6V, mi sono tiraro il conto così... però evidentemente c'è qualcosa di un po diverso visto che la batteria era a 4V... mi domando se sia necessario qualche accorgimento in più...

Re: Interfacciamento RTC DS1302

MessaggioInviato: 22 apr 2022, 13:15
da stefanopc
Forse la batteria è carica.
La caduta sui diodi a correnti molto inferiori al mA potrebbe essere anche di 0.5V.
Metti un multimetro in serie alla batteria e misura da che parte va la corrente .
Ciao

Re: Interfacciamento RTC DS1302

MessaggioInviato: 23 apr 2022, 0:54
da daniele1996
stefanopc ha scritto:Metti un multimetro in serie alla batteria e misura da che parte va la corrente

Appena posso controllo, invece per quanto riguarda la lettura dell'orario, non capisco il perché non funziona, eppure il programma mi sembra corretto...
Vi posto la funzione che legge/scrive
Codice: Seleziona tutto
void write_cmd(){
   reset_rtc();
   output_rtc_en(1);
   for(rtc_i = 0; rtc_i < 8; rtc_i += 1){
      output_data(rtc_cmd & (1 << rtc_i));
      _delay_us(1);
      output_clk(1);
      if((rtc_i == 7) && (rtc_cmd & 1))break;
      _delay_us(1);
      output_clk(0);
   }
   if(rtc_cmd & 1){ // read
      rtc_read = 0;
      for(rtc_i = 0; rtc_i < 8 ; rtc_i +=1){
         //output_data(rtc_cmd & (1 << rtc_i));
         output_clk(1);
         _delay_us(1);
         output_clk(0);
         _delay_us(1);
         if(input_data()){
            rtc_read |= 1 << (rtc_i);
         }
      }
   }else{ // write
      DDRA |= (1 << PA6);
      PORTA &= ~(1 << PA6);
      for(rtc_i = 0; rtc_i < 8; rtc_i += 1){
         if(rtc_write & (1 << rtc_i)){
            output_data(1);
         }else{
            output_data(0);
         }
         output_clk(0);
         _delay_us(1);
         output_clk(1);
         _delay_us(1);
      }
   }
   output_clk(0);
   output_rtc_en(0);
}