PC-G850VS / ポケコンにADコンバーターMCP3008を外づけする - Qiita、のループを開いて少し速くする

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ビットを読み出さないと精度が保てない。
f:id:ti-nspire:20190906115352p:plain
f:id:ti-nspire:20190906115716p:plain:h300 f:id:ti-nspire:20190906115753p:plain:h300