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.