PC-G850VS / ミニI/OにADコンバーターMCP3008を接続する - Qiitaで作ったプログラムではあまりに遅いのでループを全部開いた。
unsigned int ad_read(unsigned char ch){ unsigned int ad_val; /*start bit*/ miniput(1); miniput(4); miniput(6); /*single-ended input mode*/ miniput(4); miniput(6); /*select a channel*/ switch(ch){ case 0: miniput(0); miniput(2); miniput(0); miniput(2); miniput(0); miniput(2); break; case 1: miniput(0); miniput(2); miniput(0); miniput(2); miniput(4); miniput(6); break; case 2: miniput(0); miniput(2); miniput(4); miniput(6); miniput(0); miniput(2); break; case 3: miniput(0); miniput(2); miniput(4); miniput(6); miniput(4); miniput(6); break; case 4: miniput(4); miniput(6); miniput(0); miniput(2); miniput(0); miniput(2); break; case 5: miniput(4); miniput(6); miniput(0); miniput(2); miniput(4); miniput(6); break; case 6: miniput(4); miniput(6); miniput(4); miniput(6); miniput(0); miniput(2); break; case 7: miniput(4); miniput(6); miniput(4); miniput(6); miniput(4); miniput(6); break; default: break; } /*get 10-bit data*/ miniput(0); miniput(2); miniput(0); miniput(2); miniput(0); miniput(2); ad_val = (miniget() << 9); miniput(0); miniput(2); ad_val |= (miniget() << 8); miniput(0); miniput(2); ad_val |= (miniget() << 7); miniput(0); miniput(2); ad_val |= (miniget() << 6); miniput(0); miniput(2); ad_val |= (miniget() << 5); miniput(0); miniput(2); ad_val |= (miniget() << 4); miniput(0); miniput(2); ad_val |= (miniget() << 3); miniput(0); miniput(2); ad_val |= (miniget() << 2); miniput(0); miniput(2); ad_val |= (miniget() << 1); miniput(0); miniput(2); ad_val |= miniget(); /*Turn !CS to Hi, to complete a cycle of sampling*/ miniput(1); return ad_val; } main(){ unsigned int i; while(1){ printf("%4d, %4d, %4d, %4d\n", ad_read(0), ad_read(1), ad_read(2), ad_read(3)); for(i=0; i<500; i++){;} /*busy wait*/ } }
4チャンネルぶんを連続してAD変換しているようす。チャンネル[3]、[2]、[1]、[0]の順番にad_read()
函数がコールされている。前回は1サンプルに100msecほどかかっていたのが今回は20msecほどに縮まった。実用的には1msec程度で10ビットを読み出さないと精度が保てない。