0

私はAVRチップ上のさまざまな初期化を処理するために独自の「ライブラリ」を作成してきました。しかし、ADCSRAレジスタ(データシートのp.261)のADIEビットの動作に固執しています。データシートは、ADIEがどのように機能するかを実際には説明していません。ただし、ADIEが0に設定されている場合は常に、ADCから読み取り値を取得できませんでした。それはなぜですか。ADCはタイマーのように機能すると思いました。割り込みが有効になっていない場合でも、ADCレジスタを読み取り値で更新します。

これが原因コードです。「割り込み」が1以外に設定されている場合は常に、ADCは機能しません。興味深いことに、他の割り込みとは異なり、ISR(ADC_vect)ルーチン内にコードがない場合、チップはスタックしません。

if(interrupt){ADCSRA|=1<<ADIE;}//enable the ADC conversion complete interrupt
else{ADCSRA&=~1<<ADIE;}
4

1 に答える 1

1

このコードにはいくつかの括弧がないため、思ったとおりに動作しません。幸運で正しいことをしているようです。

if(interrupt){ADCSRA|=1<<ADIE;}//enable the ADC conversion complete
interrupt else{ADCSRA&=~1<<ADIE;}


~1<<ADIE != ~(1<<ADIE)

データシートはかなり明確に見えます:

ADCSRAビット3– ADIE:ADC割り込みイネーブル

このビットが1に書き込まれ、SREGのIビットが設定されると、ADC変換完了割り込みがアクティブになります。

これは、ビット4のADIF(フラグ)が1になると、ADC割り込みベクトルが実行される(そしてフラグをクリアする)ことを意味します。

ただし、割り込みを使用しない場合は、これを使用する必要はありません。1に設定し、割り込みが登録されていない場合、デバイスはリセットされます。

たぶん、ADCがどのように機能するかについてもっと説明が必要です。

ADCSRAのビット6に書き込むことにより、変換を開始します。変換には時間がかかります。割り込みを使用したくない場合は、ビット4をポーリングすることで、変換の準備ができたことを確認できます。1になると、ADCLとADCHの結果を読み取ります。ビット4に1を書き込んで、フラグをクリアしてください。

于 2012-12-10T02:02:31.923 に答える