AVRのUARTをポーリングする必要がない方法はありますか?


10

別のAVRからUART経由でデータを受信して​​います。しかし、私は他のことをしているので、常にUARTをポーリングし続けたくありません。割り込みがあることはわかっていますが、受信完了に対しては1つしか表示されません。転送を完了するには、ポーリングする必要があると思います。


1
なぜ転送を開始するためにポーリングする必要があるのですか?とにかく、送信完了の割り込みもあります。私は非常にAVRにないのですが、これらは、「TXが空」または「FIFOが空に」またはFIFOしきい値」または類似呼び出すことができます。

回答:


20

AVRには、RXCとTXCの両方(RXおよびTX完了)の割り込みベクターがあります。必要がない限り、これらをポーリングする必要はありません。

AVRFreaksはこれに関して良い投稿をしており、メーカーもそうです


3
私は「AppNoteリンクがMicrochipを指すのはなぜですか、それはAtmel製品です!」私は、マイクロチップは、アトメルは、あなたが... 5年間のマイクロコントローラから離れステップ買ったと聞いたことがないと信じてすることはできません
ザックFaragher

2
@ZacFaragher NXP + Freescale + Qualcomm。Analog + LT。ON + Fairchild。インフィニオン+ IR。このすべてが過去1〜2年間です。最悪/唯一の競合相手を見つけて、それらをマージします。
ランディン

1
@Lundin Qualcomm NXPは発生しておらず、積極的に公の検討を受けているようには見えません。それはまだ、あるいは他の何かができました-結局のところ、Atmelを購入するのはDialogでした。
Chris Stratton、

2

割り込みルーチンはデータをバッファに格納します(書き込みポインタと取得ポインタを備えた循環バッファは適切に機能します)。メインループは、バッファにデータがあるかどうかを確認し、データがある場合はそれを取り出します。メインループは他のこともできますが、割り込みバッファーがオーバーフローする前に(putがgetと出会うときに)データをチェックして削除する必要があります。

コンパイルされませんが、これはメソッドを示しています。

char circ_buf[BUFFER_SIZE];
int get_index, put_index;

void initialize(void) {
    get_index = 0;
    put_index = 0;
}

isr serial_port_interrupt(void) {                       // interrupt
    circ_buf[put_index++] = SERIAL_PORT_REGISTER;
    if(put_index==get_index) error("buffer overflow");  // oops
    if(put_index==BUFFER_SIZE) put_index = 0;           // circular buffer
}

void background routine(void) {
    while(put_index!=get_index) {                       // or if()
        ch = circ_buf[get_index++];
        // do something with ch
        if(get_index==BUFFER_SIZE) get_index = 0;
        }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.