アナログAN3-AN9の7CHをスキャンモードでDTC転送で読み込んでいます。
メインループで、タイマー1msec割り込みを利用し、2msec毎にADスタート、DTCスタートしております。
AD変換終了割り込みでCHを切替ていますが、CS+のウオッチで変換データbuffer3~9を見ていると、
たまにbuffer3にbuffer4のデータが読み込まれたり(ほかのCHも同じことがおこっている)
しています。
ADスタートかDTC転送のどこを修正したらよいか困っており、ご教授をお願い致します。
ソース
メインループ r_main.c
while (1U) { ---
if(timer_2msec == 0) /****** 2m sec 周期 *****/ { timer_2msec = 2; NOP(); R_ADC_Start(); //A/Dコンバータスタート R_DTCD0_Start(); // DTC enabled }
割り込み処理 r_cg_adc_user.c
static void __near r_adc_interrupt(void){ /* Start user code. Do not edit comment generated here */
R_ADC_Stop(); //ADCS = 0U
if(ad_ch_fg == 0){ buffer3 = (g_ad_value[0U] & 0xFFC0U) >> 6U; buffer4 = (g_ad_value[1U] & 0xFFC0U) >> 6U; buffer5 = (g_ad_value[2U] & 0xFFC0U) >> 6U; buffer6 = (g_ad_value[3U] & 0xFFC0U) >> 6U; NOP(); ADS = 0x07; // AN7-AN10に切替 NOP(); NOP(); NOP(); R_ADC_Start(); //ADCS = 1U R_DTCD0_Start(); //DTCスタート } else if(ad_ch_fg == 1){ buffer7 = (g_ad_value[0U] & 0xFFC0U) >> 6U; buffer8 = (g_ad_value[1U] & 0xFFC0U) >> 6U; buffer9 = (g_ad_value[2U] & 0xFFC0U) >> 6U; bufferA = (g_ad_value[3U] & 0xFFC0U) >> 6U; NOP(); ADS = 0x03; // AN3-AN6に切替 NOP(); NOP(); NOP(); ad_fin_fg = 0; } ad_ch_fg ^= 0x01; NOP(); /* End user code. Do not edit comment generated here */}
まゆみ さん、こんにちは。NoMaYです。その後、どうでしょうか?進展はありましたでしょうか?
まゆみ さん、こんにちは。NoMaYです。> ADコンバータの変換時間を遅くすると、解消するのではないかということがわかりました。> もともと、CPUのシステムクロック8MHz、AD変換時間4.75μs(38/fclk)としていましたが> これを、変換時間19μs(152/fclk)とすると、AD値が異常の時にカウントアップさせていたカウンタが> カウントしなくなるこを確認しております。これは、他のDTC転送にざっくりと 4.75μs/125ns=38バイト ぐらい以上のDTCブロック転送があって(DTCコントロールデータの読み込みや書き戻しの分もあるのでもうちょっと少なくても起きるかも)、その転送中に各A/D変換終了割り込み要求の1つ(or 複数)をDTCが受け付け損ねてしまったのかな、、、あるいは、DTC保留命令で構成された何かのフラグ待ちループが4.75μs以上継続してしまって、同じことが起きてしまったとか、、、それでは最終結果の書き込みを待つようにします。