0

設計でポート全体を見つけることができませんでしたが、プログラムを統一したいので (ピンを変更すると、この配列を変更するだけで済みます)、配列で定義して仮想ポートを作成します。操作するときは、これらの仮想ピンをそれぞれループに設定します。これは、以下のマクロ コードと同じです (もちろん、ポートとピンに対して 2 つの配列を別々に定義できます)。配列 (ピン) の長さは、コンパイル前は可変 1 (おそらく 2/3/4 ピン) ですが、これは重要ではありません。

unsigned char bitorder[]={PORTC,6,PORTD,2};
    foreach i,j in (bitorder){
        asm SBI i,j
        // some delay or operation here
        asm CBI i,j
    }

これが可能なら?関数またはマクロを使用しますか? またはポインタ操作へのポインタ?

4

1 に答える 1

0

次のコードのように、ポートのアドレスを取得することによってのみ可能です。

#define PINS_COUNT  2
volatile uint8_t *  ports[PINS_COUNT] = {&PORTB, &PORTD};
uint8_t pins[PINS_COUNT] = {1, 2};
int i;
for (i=0; i<PINS_COUNT; i++) {
    *ports[i] |= pins[i];  //
    /* do something */
    *ports[i] &= ~pins[i];
}

ポート ポインターとピンを同じ配列に詰め込むこともできますが、ATmega ポインターは 16 ビット幅であることを思い出してください。アセンブリでもこれを行う方法があると確信していますが、質問に「C」とタグ付けされているため、C ソリューションを探していると思います。

于 2013-03-09T01:57:09.280 に答える