Forum: Projekte & Code AT24Cxx i2c pagewrite-routinen für tiny RTC


von Karl K. (leluno)


Angehängte Dateien:

Lesenswert?

Tiny-Rtc ist ein Billigmodul, durch welches man einen avr einfachst mit 
einer RTC und einem i2c-eeprom aufrüsten kann.

//====================================================================== 
===

Da ich für mein tiny-rtc keine pagewrite-routine gefunden habe, habe ich 
es nachfolgend selbst versucht.

Langfristig geplant ist ein lib für das tiny-rtc-modul mit automatischer 
Sommerzeitumstellung und täglicher Kompensation der Gangabweichung.






====
/*auszug aus tutorial: Neu ist in diesem Beispiel:

*(feld + i)

Durch Addition eines Wertes wird erreicht, dass um i Felder 
weitergesprungen wird. Da wir allerdings auf den Wert und nicht auf die 
Adresse zugreifen wollen, muss ein * vor der Adresse stehen. Die Adresse 
bildet sich aus feld + i und muss aus diesem Grund in Klammer stehen.*/

#define page_len 32
u8 buf[100];

at24c_engine_wr (u8 device_adr,u8 eep_adr,u8 *b, u8 len){//tested ok
u8 i,j,adr=25;
    i2c_init();
    i2c_start_wait(device_adr);
    i2c_write ((eep_adr>>8)&0xFF);
    i2c_write (eep_adr&0xFF);
//  i2c_write(b);
for(i=0;i<len;i++){
  //i2c_write(i+10);
  i2c_write(*(b+i));
    //bis pagegrenze
    if((eep_adr+i+1)%page_len==0){
      i2c_stop ();
      i2c_start_wait(device_adr);
      i2c_write (((eep_adr+i+1)>>8)&0xFF);
      i2c_write  ((eep_adr+i+1)&0xFF);
    }
   }i2c_stop ();
}

void at24c_engine_rd (u8 device_adr,u8 eep_adr, u8 *b, u8 len){
i2c_init();
i2c_start_wait(device_adr);
i2c_write(eep_adr>>8);
i2c_write(eep_adr&0xff);
i2c_start_wait(device_adr|1);
for(i=0;i<(len-1);i++)
//buf[i]=i2c_readAck();//ok
  *(b+i)=i2c_readAck();
//buf[len-1]=i2c_readNak();
  *(b+len-1)=i2c_readNak();
i2c_stop ();
buf[1]=44;
//return i;
}


u8  at24c_rd (u8 device_adr,u8 eep_adr){
i2c_init();
i2c_start_wait(device_adr);
i2c_write(eep_adr>>8);
i2c_write(eep_adr&0xff);
i2c_start_wait(device_adr|1);
i=i2c_readNak();
i2c_stop ();
return i;
}

at24c_wr (u8 device_adr,u8 eep_adr, u8 byte){
i2c_init();
i2c_start_wait(device_adr);
i2c_write(eep_adr>>8);
i2c_write(eep_adr&0xff);
i2c_write(byte);
i2c_stop ();
}

void buf_fil(){//for testing
buf[0]='A';
buf[1]='B';
buf[2]='C';
buf[3]='D';
buf[4]='E';
buf[5]='F';
buf[6]='G';
buf[7]='\0';
for (i=8;i<100;i++)buf[i]=i;
}

//---------------------- tested ------------------------------

von Karl K. (leluno)


Lesenswert?

rtc-timer mit automatischer Sommerzeitumstellung:


//+++++++++++++++++ timer smh +++++++++++++++++++++++++++++++++++
#define wdg_on {zl_sec_timer0=0;sbi(bool1,schalterWDG);}
#define wdg_reset {zl_sec_timer0=0;}
#define wdg_off {cbi(bool1,schalterWDG);}
#define wdg_Menu_on {zl_sec_wdg=0;sbi(bool1,schalterWDG_Menu);}
#define wdg_Menu_reset {zl_sec_wdg=0;zl_sec_timer0=0;}
#define wdg_Menu_off {cbi(bool1,schalterWDG_Menu);zl_sec_wdg=0;}
volatile uint16_t zl_sec_timer0;


v u8 display_timer=1,zl_sec_wdg , var_error,bool_timer;
#define Schalter_get_ds1320 0

#if timer_smh
#ifndef defzeit
#define defzeit
volatile uint8_t sec,min,hou,WDY,DAY,MON,YEA;
#endif


volatile u8 zl_timer0,LaufzeitH,ds1307korrektur;
volatile u16 zl_timer_impStrom;
ISR(TIMER0_OVF_vect)
{
zl_timer_impStrom++;
zl_timer0++;
if(zl_timer0==takt_timer){//8mhz->31//3,6mhz
sbi(bool1,schalterVolleSecunde);//lgi(1,10,gbi(bool1,schalterVolleSecund 
e));
if(!gbi(bool1,Schalter_wdg_reset)){wdt_reset();}
  zl_timer0=0;sec++;zl_sec_timer0++;////13=>55 sec
  if(sec==60){  sec=0;  min++;  sbi(bool1,schalterVolleMinute);
        zl_sec_wdg++;
        if(zl_sec_wdg==3)asm("jmp Sprung");
        if(zl_sec_wdg>3)sbi(bool1,Schalter_wdg_reset);
//wenn   zl_sec_wdg  nicht zurückgesetzt wird, löst der wdg aus
  }



/*/abgeich timer /rtc
if(min==30 && !gbi(bool_timer,Schalter_get_ds1320)){
if (ds1307gefunden==0) {
sbi(bool_timer,Schalter_get_ds1320);
kk_ds1307_getAll_to_global_struct_zt();}
}*/



if(min==60){
cbi(bool_timer,Schalter_get_ds1320);
  min=0;  hou++;  LaufzeitH++;//LaufzeitH????
  if(hou==24){  hou=0;  ds1307korrektur=0;}


//++++++++++++++ Korrektur + Umschaltung Sommer/Winterzeit 
++++++++++++++++

if(hou==3 && ds1307gefunden==0 && ds1307korrektur==0){
  kk_ds1307_getAll_to_global_struct_zt();//timer mit rtc abgleichen

  if(MON==10 && DAY>24 && WDY==7 ){//letzter Sonntag im Oktober
  hou--;
  kk_ds1307_setTime(hou,min,sec);
  }

  if(MON==3 && DAY>24 && WDY==7  ){//letzter Sonntag im März
  hou++;
  kk_ds1307_setTime(hou,min,sec);
  }

ds1307korrektur=1;
}
//--------------Korrektur + Umschaltung Sommer/Winterzeit 
______________





//  if(display_timer==1){lcd_goto(1,1);lcd_int2(hou);}
}

//++++++++++++++ wdg ++++++++++++++++++
if(zl_sec_timer0>150 && gbi(bool1,Schalter_wdg_reset) ){
//errolevel
eeprom_write_byte(0x1FC,var_error);
zl_sec_timer0=0;
/*asm("jmp Sprung");*/asm("jmp 0");}
//-------------- wdg ------------------
}//==14

}
#endif//timer_smh

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.