データロガーの制作
#include <16f873.h> //#fuses INTRC_IO,NOWDT,NOLVP,NOMCLR //内部クロック、WDT,LVPなし #fuses HS,NOWDT,NOLVP,put,brownout //外部クロック、WDT,LVPなし #device ADC=10 #use delay(CLOCK=20000000) #use RS232(BAUD=4800,xmit=PIN_C6,rcv=PIN_C7)//use delayの後に配置する #use i2c(MASTER, SDA=PIN_C4, SCL=PIN_C3, FORCE_HW) // I2C使用宣言 #include <rtc.h>//rtc用の関数読み込み //int count; float aval; float tmp; float tmax,tmin; long ltemp; int num; int prd; int idle; int rtime; int digit; long val; int ttmp; long wadrs,radrs; char cm[15],ch; void writeLog(int ca,long ad); void readLog(int ca,long ad); //rtc timer #INT_EXT void ext_isr(){ rtc_date_read();//時刻を取得 output_low(PIN_A4); delay_ms(10); output_high(PIN_A4); aval=read_adc(); //温度センサーを読む //lcd_clear(); //printf(lcd_data,"av:%3.1f\n\r",aval); //測定 389;5 163:49 tmp=-0.195*aval + 80.7;//温度に変換 //最高と最低温度を更新 if(tmax < tmp) tmax = tmp; if(tmin > tmp) tmin = tmp; //温度をシリアル送信 printf("%c%c_%c%c_%c%c:%c%c:%c%c:", h_month,l_month,h_day,l_day,h_hour,l_hour,h_min,l_min,h_sec,l_sec); printf(" tmp=%4.1f;",tmp); //温度と時刻を記録 //writeLog(0xA0,wadrs); //wadrs += 12; } #INT_RDA void rda_isr(){ char ch; idle=0; num=0; //シリアル通信から設定 //コマンドを読む ch=' '; do{ ch=getch(); putchar(ch); cm[num++]=ch; } while (ch != ';'); //printf("piccom:%c:%d\n\r",ch,num); //日付の設定 if(cm[0]=='D'){//日付 num=0; year = (cm[1]-0x30)*16+(cm[2]-0x30); month = (cm[3]-0x30)*16+(cm[4]-0x30); day = (cm[5]-0x30)*16+(cm[6]-0x30); //week =(cm[7]-0x30); hour = (cm[7]-0x30)*16+(cm[8]-0x30); min = (cm[9]-0x30)*16+(cm[10]-0x30); sec = (cm[11]-0x30)*16+(cm[12]-0x30); rtc_date_set(); } //測定間隔の設定 else if(cm[0]=='I'){//set interval num=0; prd = (cm[1]-0x30)*10+(cm[2]-0x30); //printf("Pic:Intval:%d\n\r",prd); rtc_timer_set(prd);//タイマーの値 rtc_timer_start(0x82);//更新間隔 } //記録データの受信 else if(ch == 'g') { //readLog(0xA0,radrs) ; //radrs += 12; } } main(){ //char cmnd; //rtcが安定するのを待つ delay_ms(500); //初期設定 num=0; wadrs=0; radrs=0; rtime=200; ttmp=0; output_float(PIN_C3); //SCLピン定義 output_float(PIN_C4); //SDAピン定義 //日付の仮設定 year=0x06; month=0x07; //データは16進2入力 week=0x3; day=0x11; hour=0x22; min=0x40; sec=0x00; rtc_control_init(); rtc_date_set(); //rtcのタイマー設定 rtc_clockout_set(0x83);//set Clockout 1sec //ログ間隔(秒)設定 rtc_timer_set(5);//Interval sec rtc_control_set(0x11);//set Timer &Enable rtc_timer_start(0x82);//TimerStart ext_int_edge(H_TO_L); //AD入力の設定 setup_adc_ports(RA0_ANALOG);//アナログ入力設定 setup_adc(ADC_CLOCK_DIV_32);//クロック設定 set_adc_channel(0);//チャンネル0切り替 delay_us(10);//10μ秒待つ tmax=-10.0;tmin=1000.0; //受信済みのデータを捨てる while(kbhit()) { ch=getchar(); putchar(ch); } printf("start log;"); //割り込みの設定 enable_interrupts(INT_EXT); enable_interrupts(INT_RDA); enable_interrupts(GLOBAL); //測定開始 while(1){ if(rtime==0) {//表示の更新 if(ttmp ){//温度の表示更新 val=(long)(tmp*10.0); st[3]=val/1000; val -= st[3]*1000; st[2]=val/100; val -= st[2]*100; st[1]=val/10; st[0]=val%10; ttmp=0; } else{ //時刻表示更新 rtc_date_read(); st[3]=h_hour-0x30; st[2]=l_hour-0x30; st[1]=h_min-0x30; st[0]=l_min-0x30; ttmp=1; } rtime=200; } rtime--; //4桁表示器に表示 for(digit=0;digit<4;digit++){ output_sr( segment_data[st[digit]]); output_dgt(digit,0); delay_ms (3); //表示期間(ミリ秒) output_dgt(digit,1); } } return 0; }