データロガーの制作


#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;
}
