1

私はマイクロコントローラーのプログラミングにかなり慣れていません。私は Arduino の経験がある程度ありますが、プロジェクトをほぼ完成させた後、現在のプロジェクトをより安価で小規模なものに移行することにしました。そのため、現在 Atmel studio で AVR ATmega32 を使用しています。

ATmega32 を使用して MAX7219 チップと通信し、LED マトリックスと多重化しようとしています。ただし、通信したい複数の異なるデバイスがあります。

マイクロコントローラで提供されている SPI ピンを実際に使用せずにデバイスと通信するにはどうすればよいですか? テストプロジェクトを作成しましたが、何か問題があるようで、何が問題なのかわかりません。すべての LED が点灯しているので、なんとかテスト モードになったと思いますが、その後は何もできません。ディスプレイをクリア/シャットダウンすることさえできません。配線を再確認しました。ピン構成とピンの割り当てに関して、私のコーディングはおそらく間違っていますか? これに関する提案や、コードを記述するためのより良い方法はありますか?

MA7219 データシートへのリンクは次のとおりです。

//test

#include <avr/io.h>


int main(void)
{

DDRB = 0b00000111; // pin 1(data), 2(clock) and 3(latch) are outputs

PORTB = 0 << PINB0; // data pin 1 is low
PORTB = 0 << PINB1; // clock pin 2 is low
PORTB = 0 << PINB2; // latch pin 3 is low

uint16_t data;
data = 0b0000110000000000; // data to shift out to the max7219

 //read bit
uint16_t mask;
 for (mask = 0b0000000000000001; mask>0; mask <<= 1) 
{ 
    //iterate through bit mask
    if (data & mask)
    { // if bitwise AND resolves to true
        // send one
        PORTB = 1 << PINB0;
        // tick
        PORTB = 1 << PINB1;
        // tock
        PORTB = 0 << PINB1;
    }
     else{ //if bitwise and resolves to false
        // send 0
        // send one
        PORTB = 0 << PINB0;
        // tick
        PORTB = 1 << PINB1;
        // tock
        PORTB = 0 << PINB1;
    }

}

PORTB = 1 << PINB2; // latch all the data
PORTB = 1 << PINB0; // data pin 1 is high
PORTB = 0 << PINB1; // clock pin 2 is low
PORTB = 0 << PINB2; // latch pin 3 is low
}
4

1 に答える 1

2

はい、ビットバン コードには、既存の値を保持せずに毎回レジスタの値全体を割り当てるという問題があります。したがって、クロックを駆動した瞬間にデータ信号を消去し、レシーバーのホールド タイムに違反して、予測不能な動作を引き起こします。

でピンを割り当てる代わりに、=で設定|=またはクリアする必要があります。&= ~(value)

例えば:

     PORTB = 1 << PINB0;      //drive data
    // tick
    PORTB |= 1 << PINB1;      //clock high PRESERVING data
    // tock
    PORTB &= ~(1 << PINB1);   //clock low

ピン操作の間にわずかな遅延を挿入する必要がある場合もあります。

技術的には、すでにifデータ状態に を使用している場合、割り当てで OR を使用してデータ信号を再駆動することもできます。たとえば、

if (data & mask)
{ // if bitwise AND resolves to true
    // send one
    PORTB = 1 << PINB0;
    // tick
    PORTB = (1 << PINB1) | (1 << PINB0);
    // tock
    PORTB = 0 << PINB1 | (1 << PINB0);
}
 else{ //if bitwise and resolves to false
    // send 0
    // send one
    PORTB = 0 << PINB0;
    // tick
    PORTB = 1 << PINB1;
    // tock
    PORTB = 0 << PINB1;
}
于 2014-06-04T04:25:37.507 に答える