//********************************************************************** /*   <DataLoggerV2>   ■アナログデータの記録機能および再生機能を提供する。   ・記録媒体には、アトメル社製のAT24C256を使用する。    :256Kビット(32kx8)EEPROM    :2線式I2Cインターフェース   ■記録チャンネル数は、1CHとする。   ■データの精度は、10ビットとする。   ■記録容量は、   ・16384件(1件あたり2バイト使用:32k÷2)   ■記録時間は、   ・記録周期が1秒の場合は、約4.5時間の記録が可能   ・記録周期が1分の場合は、約11日間の記録が可能   ■パソコンとの通信は、RS232Cで9600bpsの速度で行う。 */ //********************************************************************** #define SW_CYCLE PORTA.F4 #define SW_REC PORTA.F5 #define SW_PLAY PORTB.F0 #define ON 1 #define OFF 0 //********************************************************************** static short TimerCnt, swRec, swPlay, swRecCnt, swPlayCnt; void interrupt() { if (PIR1.CCP1IF == 1) { //0.1秒周期の割り込みが発生する。 PIR1.CCP1IF = 0; // if (TimerCnt > 0) TimerCnt--; if (SW_REC == 0) { swRecCnt++; } else { if (swRecCnt > 3) swRec = ON; swRecCnt = 0; } if (SW_PLAY == 0) { swPlayCnt++; } else { if (swPlayCnt > 3) swPlay = ON; swPlayCnt = 0; } } } //********************************************************************** void Delay_1sec() { TimerCnt = 10; while(TimerCnt != 0) { if (swRec == ON) return; } } //********************************************************************** void Delay_1min() { TimerCnt = 600; while(TimerCnt != 0) { if (swRec == ON) return; } } //********************************************************************** void Usart_Write_String(char *buf) { static int len, i; len = strlen(buf); for (i = 0; i < len; i++) { Usart_Write(buf[i]); } } //********************************************************************** void EEPROM_24C256_Init() { Soft_I2C_Config(&PORTB, 1, 4); } //********************************************************************** unsigned short EEPROM_24C256_Read(unsigned int addr) { unsigned short data; // Soft_I2C_Start(); Soft_I2C_Write(0xA0); Soft_I2C_Write((addr >> 8) & 0xFF); Soft_I2C_Write(addr & 0xFF); Soft_I2C_Start(); Soft_I2C_Write(0xA1); data = Soft_I2C_Read(0); //not acknowledge Soft_I2C_Stop(); // return (data); } //********************************************************************** void EEPROM_24C256_Write(unsigned int addr, unsigned short data) { Soft_I2C_Start(); Soft_I2C_Write(0xA0); Soft_I2C_Write((addr >> 8) & 0xFF); Soft_I2C_Write(addr & 0xFF); Soft_I2C_Write(data); Soft_I2C_Stop(); Delay_ms(5); } //********************************************************************** void Data_Rec() //データを記録する。 { static unsigned int ad, cnt; static unsigned char buf[10]; // for (cnt = 0; cnt < 32768; cnt++) { //アナログデータの取り込み ad = Adc_Read(2); //アナログデータをEEPROMに記録する。 EEPROM_24C256_Write(cnt, (ad >> 8) & 0xFF); cnt++; EEPROM_24C256_Write(cnt, ad & 0xFF); //カウンタ値をLCDに表示する。 WordToStr((cnt / 2) + 1, buf); Lcd_Custom_Out(2, 12, buf); //アナログデータをLCDに表示する。 WordToStr((double)ad * 2.4365234375, buf); //2.4365234375 = 2.495V ÷ 1024 Lcd_Custom_Out(2, 1, buf); Lcd_Custom_Out(2, 6, "mV"); //記録周期を確認する if (SW_CYCLE == 1) { Delay_1sec(); //1秒周期 } else { Delay_1min(); //1分周期 } // if (swRec == ON) { //記録を中断するかを判断する。 swRec = OFF; return; } } } //********************************************************************** void Data_Play() //データを再生する。 { static unsigned int ad, cnt; static unsigned char buf[10]; // for (cnt = 0; cnt < 32768; cnt++) { //EEPROMからアナログデータを取り出す。 ad = EEPROM_24C256_Read(cnt); ad = (ad << 8) & 0xFF00; cnt++; ad = ad | EEPROM_24C256_Read(cnt); //カウンタ値をLCDに表示する。 WordToStr((cnt / 2) + 1, buf); Lcd_Custom_Out(2, 12, buf); //アナログデータをLCDに表示する。 WordToStr((double)ad * 2.4365234375, buf); Lcd_Custom_Out(2, 1, buf); Lcd_Custom_Out(2, 6, "mV"); //アナログデータをパソコンへ転送する。 Usart_Write_String(buf); Usart_Write_String("mV\r\n"); // if (swPlay == ON) { //再生を中断するかを判断する。 swPlay = OFF; return; } } } //********************************************************************** void main() { CMCON = 0b00000111; //コンパレータは使用しない ANSEL = 0b00000100; //A/DコンバータはAD2を使用する。 ADCON1.VCFG1 = 1; ADCON1.VCFG0 = 0; OSCCON = 0b01110000; //クロックは内臓8MHzを使用する。 TRISA = 0b00111100; //PORTAを設定する。 TRISB = 0b00000001; //PORTBを設定する。 OPTION_REG.NOT_RBPU = 0; //LCDを初期化する。 Lcd_Custom_Config(&PORTA,1,0,7,6,&PORTB,3,6,7); Lcd_Custom_Cmd(LCD_CURSOR_OFF); Lcd_Custom_Cmd(LCD_CLEAR); Lcd_Custom_Out(1, 1, "DataLoggerV2"); //RS232Cを初期化する。 Usart_Init(9600); Usart_Write_String("\r\nDataLoggerV2\r\n"); //EEPROMを初期化する。 EEPROM_24C256_Init(); // CCPを設定する。 PIE1.CCP1IE = 1; PIR1.CCP1IF = 0; CCP1CON.CCP1M3 = 1; //trigger special event mode CCP1CON.CCP1M2 = 0; CCP1CON.CCP1M1 = 1; CCP1CON.CCP1M0 = 1; CCPR1L = 0xA8; // 0.1sec...10hz...クロックが8Mhzの時 CCPR1H = 0x61; // 0.1sec...(1÷8000000)*4*8*25000 // TIMER1を設定する。 PIE1.TMR1IE = 0; PIR1.TMR1IF = 0; TMR1L = 0; TMR1H = 0; T1CON.T1CKPS0 = 1; T1CON.T1CKPS1 = 1; T1CON.TMR1ON = 1; //変数を初期化する。 TimerCnt = 0; swRec = OFF; swPlay = OFF; swRecCnt = 0; swPlayCnt = 0; // 割り込み(全体)の設定 INTCON.PEIE = 1; INTCON.GIE = 1; // while (1) { //記録スイッチが押されていれば、アナログデータの記録を行う。 if (swRec == ON) { swRec = OFF; Lcd_Custom_Cmd(LCD_CLEAR); Lcd_Custom_Out(1, 1, "REC "); Data_Rec(); Lcd_Custom_Cmd(LCD_CLEAR); Lcd_Custom_Out(1, 1, "DataLoggerV2"); } //再生スイッチが押されていれば、アナログデータの再生を行う。 if (swPlay == ON) { swPlay = OFF; Lcd_Custom_Cmd(LCD_CLEAR); Lcd_Custom_Out(1, 1, "PLAY"); Data_Play(); Lcd_Custom_Cmd(LCD_CLEAR); Lcd_Custom_Out(1, 1, "DataLoggerV2"); } } } //**********************************************************************