2

atmega328p からの構造体と定義に少し問題があります。

次のコードがあります。

typedef struct {
    char port;
    unsigned char pin;
    unsigned long timestamp;
} BUTTONS;

BUTTONS button_1;
BUTTONS button_2;
BUTTONS button_3;

BUTTONS* button[BUTTONS_ID_COUNT] = {&button_1,&button_2,&button_3};

void Button_init(void){

    button[BUTTONS_ID_1]->port = PINB;
    button[BUTTONS_ID_1]->pin = PINB4;
    button[BUTTONS_ID_1]->timestamp = 0;
}

unsigned char Button_instantRead(int id){
    //return PINB & (1 << PINB4);
    return button[id]->port & (1 << button[id]->pin);
}

Button_instantRead()ID 番号を指定するだけで任意のポートを読み取れるようにmy を使用したいと考えています。init 関数を使用して、どのピンがどのポートに関連付けられているかを設定します。しかし、何らかの理由でButton_instantRead()関数を呼び出すと、スイッチを押しても 1 が得られません。

コメント行を使用してメインファイルで構成を試しましたが、すべて正常に動作しました。

私のreturnラインで何が間違っていますか?

いくつかのグーグル検索の後、charおそらくポートを参照するのに適切なタイプではないことがわかりました。ポートのアドレスの最初の要素へのポインターの方が適していると思いますが、その方法がわかりませんし、答えも見つかりませんでした。

4

2 に答える 2

1

PINB揮発性ですか?それはポートの実際の読み取りではありませんか?その場合、ポートの値をButton_initnot inで読み取りますButton_instantRead

つまり、button[id]->port後で使用できる PINB への参照ではなく、Button_init で読み取ったときのポートの値が含まれます。

注意: 私が atmega のことをしてから何年も経ちます。

次のように再コーディングできます。

unsigned char Button_instantRead(int id){
    switch(id) {
        case ID_A: return PINA & (1 << button[id]->pin);
        case ID_B: return PINB & (1 << button[id]->pin);
        // etc
    }
}
于 2013-09-24T03:07:39.647 に答える