#include #include "fm.h" #define CPU_CLOCK 4000000L #define TEST_FREQ 761 // ch volatile uchar Timer; //******************************************************* // メインルーチン //******************************************************* int main(void){ PORTB = 0xFF; TRISB = 0; PORTC = (1<> 8); TWI_send(data & 0x00FF); TWI_stop(); } //******************************************************* // AR1000 レジスタ読み込み //******************************************************* ushort read_AR1000(uchar adrs){ ushort data; TWI_start(); TWI_send(0x20); // スレーブアドレス + Write TWI_send(adrs); TWI_start(); TWI_send(0x20 + 1); // スレーブアドレス + Read data = TWI_recv(0); // ACK data <<= 8; data |= TWI_recv(1); // NACK TWI_stop(); return data; } //******************************************************* // 1秒時間待ち //******************************************************* void wait_1s(void){ Timer = 100; while(Timer){ asm("clrwdt"); asm("sleep"); } } //******************************************************* // 10ms単位で時間待ち //******************************************************* void wait_10ms(uchar w){ Timer = w; while(Timer){ asm("clrwdt"); asm("sleep"); } } //************************************************************ // TWI 開始条件 //************************************************************ void TWI_start(void){ SDA_H; asm("nop"); SCL_H; asm("nop"); SDA_L; } //************************************************************ // TWI 8bit 送信 //************************************************************ void TWI_send(uchar data){ char b; SCL_L; for (b = 0; b < 8; b++){ if (data & 0x80){ SDA_H; } else { SDA_L; } SCL_H; WAIT_SCL_H; // SCL=Hになるまで待つ data <<= 1; SCL_L; } SDA_H; SCL_L; // ACK受信 内容は無視 SCL_H; asm("nop"); SCL_L; } //************************************************************ // TWI 8bit 受信 //************************************************************ uchar TWI_recv(uchar nack){ char b; uchar data; SDA_H; SCL_L; data = 0; for (b = 0; b < 8; b++){ SCL_H; WAIT_SCL_H; // SCL=Hになるまで待つ data <<= 1; if (INP_SDA){ data |= 1; } SCL_L; } // ACK/NACK 送信 if (nack){ SCL_L; SCL_H; SDA_H; } else { SDA_L; SCL_L; SCL_H; } SCL_L; SDA_H; return data; } //************************************************************ // TWI 停止条件 //************************************************************ void TWI_stop(void){ SDA_L; asm("nop"); SCL_H; asm("nop"); SDA_H; }