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 ------------------------------
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.
