/* I2C Slave Mode RTC/UP Timer BY M.K PIC12F1822 4MHz mikroC Ver 5.01 CONFIG1 :0x3F84 :0x3213 I2C Address A2 register[0] and r_[1] = not use r_[2]=59Sec r_[3]=59Min r_[4]=24Horu Last 2012/4/5 4/24 Hour Used ROM 194 (10%) */ #define D_size 4 static char s05,r_data[D_size]; static char drn,i_temp,i_flag,T_count; sbit sLED at PORTA.b5; //b0=NC b1=SCL b2=SDA b3=NC b4=NC:NC=未使用 void Timer_Count() { // 0.5Sec UP Counter s05++; sLED=~sLED; if(s05==2){ s05=0; r_data[2]++; if((r_data[2] & 0x0f)==0x0A){ // 1Sec r_data[2]+=6; if(r_data[2]==0x60){ r_data[2]=0; r_data[3]++; //1 minute if((r_data[3] & 0x0f)==0x0A){ r_data[3]+=6; //10 minute if(r_data[3]==0x60){ r_data[3]=0; r_data[4]++; //1 horu if(r_data[4]==0x24) r_data[4]=0; //Max if((r_data[4] & 0x0f)==0x0A){ r_data[4]+=6; //10 } } } } } } } void Data_send (){ while((SSP1CON1.CKP)|(SSP1STAT.BF)); SSP1BUF=r_data[drn]; drn++; } void Interrupt() { if (PIR1.SSP1IF == 1){ PIR1.SSP1IF = 0; // if (SSP1STAT.b2 == 0) { // R/W //Master Write mode if (SSP1STAT.b5 == 0){ //address set i_temp = SSP1BUF; // アドレス空読み drn=0; i_flag=0; }else{ if(i_flag==0){ drn = SSP1BUF; // fast time.Register No i_flag=1; }else{ r_data[drn]=SSP1BUF; drn++; } } }else{ //Master Read if (SSP1STAT.BF == 1) { // Buffer Full Status bit i_temp = SSP1BUF ; // アドレス空読み // Data_send (); } else { if (SSP1CON2.ACKSTAT == 0){ //ACK Data_send (); } //NACK } } SSP1CON1.CKP = 1; } // Timer1 if(PIR1.TMR1IF == 1){ PIR1.TMR1IF = 0; TMR1H=0x0b; // TMR1L=0xdb; // Timer_Count(); } } void main() { OSCCON =0b01101000; //4MHz TRISA=0x0F; ANSELA=0; // I2C set SSP1STAT=0b10000000; SSP1CON1=0x26; //SSP1EN + I2C Slave mode, 7-bit address SSP1ADD =0b10100010; //RTCと同じAddress A2 SSP1MSK =0b11111110; SSP1CON2.SEN=0; PIE1.SSP1IE=1; PIR1.SSP1IF=0; // Timer1 set T1CON =0b00110101; //Pre=1/8 T1SYNC=off Tmer1=enable TMR1H=0x0b; // 65535-62500=3035 TMR1L=0xdb; // 1uS*8*62500=0.5 PIE1.TMR1IE=1; // PIR1.TMR1IF=0; // s05=0; drn=0; r_data[2]=0; // Sec r_data[3]=0; // Minute r_data[4]=0; // Hour INTCON.PEIE=1; INTCON.GIE=1; // while(1); //LOOP }