////////////////////////////////////////////////// // A/Dテストプログラム // // PIC16F873 RIKIYA 2003.01.16 // // adtest2.C // // I2Cマスター役となりA/Dからの入力をもとに // // スレーブ4個のPWM制御をする // ////////////////////////////////////////////////// #include <16f873.h> #fuses HS,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP #device ADC=10 // 10BIT A/D変換 #use delay(clock = 10000000) // clock 10MHz #use fast_io(B) // 固定入力モード #use i2c(MASTER,SDA=PIN_C4,SCL=PIN_C3,FAST,FORCE_HW) int add[4] = {0,2,4,6}; //スレーブアドレス //メイン関数//////////////////////////////////// main(){ int i; long data; setup_adc_ports(RA0_ANALOG); // AN0チャンネル有効 setup_adc(ADC_CLOCK_DIV_32); // Fosc/32 set_tris_b(0xf0); //RB 7-4:IN 3-0:OUT set_tris_c(0x00); //RC 7-0:OUT output_float(PIN_C3); //I2C pin float output_float(PIN_C4); //I2C pin float // 4個のサーボの首振りを繰り返す while(1){ set_adc_channel(0); // ANチャンネルの選択 delay_us(20); // 充電時間の待機 data = read_adc(); // A/Dデータの読み込み for(i=0;i<4;i++){ i2c_start(); //スタートコンディション i2c_write(add[i]); //アドレスaddに送信 i2c_write(data >> 2); //データ上位8bitを送信 i2c_stop(); //ストップコンディション delay_ms(3); } } }