micro:bit / マイコンの内部レジスタを操作する / 何かを書き込む / 2 つの端子から同じタイミングでパルスを出力する

micro:bit の P0、P1 からまったく同じタイミングでパルスを出力してみる。

int main(void){
    unsigned int BaseAddress = 0x50000000UL; // GPIO の各種レジスタのベースアドレス
    
    // DIRSET は指定のビットだけを出力にセットするレジスタ (指定していないビットは変化しない)
    // OUTSET は指定のビットだけを H にセットするレジスタ (指定していないビットは変化しない)
    // OUTCLR は指定のビットだけを L にセットするレジスタ (指定していないビットは変化しない)
    volatile unsigned int *DIRSET = (unsigned int *)(BaseAddress + 0x518);
    volatile unsigned int *OUTSET = (unsigned int *)(BaseAddress + 0x508);
    volatile unsigned int *OUTCLR = (unsigned int *)(BaseAddress + 0x50C);
    
    // エッジコネクターの P0 (GPIO_P03) と P1 (GPIO_P02) とを出力にセットする。
    unsigned int whichBits = (1 << 3) | (1 << 2);
    *DIRSET = whichBits;
    
    while(1){
        *OUTSET = whichBits; // エッジコネクターの P0、P1 だけを両方同時に H にセットする。
        *OUTCLR = whichBits; // エッジコネクターの P0、P1 だけを両方同時に L にセットする。
    }
    return 0;
}

実行結果:
f:id:ti-nspire:20180522135707j:plain:h200 f:id:ti-nspire:20180522134932p:plain:h200
まったく同じタイミングでパルスが出力されている。デューティーはループ処理のせいで 50% にならない。
――――――――――――――――――――――――――――――――
MicroPython で同じことをしようとしても複数の端子から同時に同じタイミングでパルスは出力できない。下の例だと 70 マイクロ秒くらいずれてしまう。もちろん、遅延函数を使って周波数をもっと下げればこのずれは無視できる。

from microbit import *

while True:
    pin0.write_digital(1)
    pin1.write_digital(1)
    pin0.write_digital(0)
    pin1.write_digital(0)

f:id:ti-nspire:20180522140643p:plain:w400