/* I2C RTC Slave mode test 2010/3/23 PIC16F88 Last 3/30 BY M.Kikuchi 動作 mikroC PRO for PIC 9分59秒まで1秒刻みで表示しマスターに転送する。 マスターは初期設定でレジスター2,3をクリヤーしている。 JF3SFB 氏のプログラムを参考にした。 */ #define LED PORTA.F4 #define ON 1 #define OFF 0 #define D_size 4 static char r_data[D_size]; static char pnt,flg,tmp; void I2C_Write(char dat) { while(SSPSTAT.BF==1) ; while(1){ SSPCON.WCOL=0; SSPBUF=dat; if(SSPCON.WCOL==1) continue; SSPCON.CKP=1; return; } } void I2C_Handler() { tmp=SSPSTAT & 0b00101101; // if(tmp==0b00001001){ //書き込み・デバイスアドレス tmp=SSPBUF; flg=0; pnt=0; return; } if(tmp==0b00101001){ //書き込み・DATA if(flg==0){ pnt=SSPBUF; flg=1; return; } else { r_data[pnt]=SSPBUF; pnt++; return; } } if(tmp==0b00001100){ //読み込み・デバイスアドレス I2C_Write(r_data[pnt]); pnt++; return; } if(tmp==0b00101100){ //読み込み・DATA(ACK) I2C_Write(r_data[pnt]); pnt++; return; } if(tmp==0b00101000){ //読み込み・DATA(No_ACK) tmp=SSPBUF; SSPCON=0x36; return; } } void Interrupt() { if(PIR1.SSPIF==1){ PIR1.SSPIF=0; // LED=ON; I2C_Handler(); LED=OFF; } } void main() { char cnt,temp; OSCCON=0b01100000; //4MHz CMCON=0x07; ANSEL=0; TRISA=0x0F; TRISB=0xFF; // I2C set SSPSTAT.SMP=0; SSPSTAT.CKE=0; SSPCON=0x36; SSPADD=0b10100010; //RTCと同じAddress PIE1.SSPIE=1; PIR1.SSPIF=0; // LED=OFF; pnt=0; flg=0; for(cnt=0;cnt<4;cnt++){ r_data[cnt]=0; } INTCON.PEIE=1; INTCON.GIE=1; while(1) { Delay_ms(597); //割り込みがあって遅れるので約1秒になる r_data[2]++; temp=(r_data[2] & 0x0f); if(temp==0x0A){ r_data[2]+=6; if(r_data[2]==0x60){ r_data[2]=0; //分 r_data[3]++; temp=(r_data[3] & 0x0f); if(r_data[3]==0xA) r_data[3]=0; } } } }