/*
* A/D変換を行うルーチン
*
* @author fenrir (M.Naruoka)
* @since 04/06/02
* @version 1.0
*/
#include "AKI3694.h"
#include <common.h>
#include <util/fifo_num.h>
#include "ad.h"
static num_t buffer_ad[(AD_BUFFER_SIZE + 1) * AD_CH];
fifo_num_t fifo_ad[AD_CH];
/**
* A/D変換の初期設定をする関数
*
*/
void ad_init(){
/* A/D変換後用のFIFOの初期化 */
int i;
for(i = 0; i < AD_CH; i++){
fifo_num_init(&(fifo_ad[i]), &(buffer_ad[(AD_BUFFER_SIZE + 1) * i]), (AD_BUFFER_SIZE + 1));
}
/* A/D変換停止 */
AD.ADCSR.BIT.ADST = 0;
/* スキャンモード
* 高速変換
* 割り込み可
* はじめはグループ0のAD0〜AD3を変換
* 8チャンネル時はさらにその後グループ1のAD4〜AD7を変換
*/
AD.ADCSR.BYTE = 0x5b; //5
}
/**
* A/D変換の開始をする関数
* インターバルタイマの割り込みによって、
* またグループ0のAD変換終了後に呼び出してもらう。
*
* @see ad_end();
*/
void ad_start(){
AD.ADCSR.BIT.ADST = 1; /* A/D変換スタート */
}
/**
* A/D変換の終了後に起動される関数
* 割り込みで呼び出してもらう
*
* @see int_ad();
*/
void ad_end(){
AD.ADCSR.BYTE &= 0x5f; /* 終了フラグをクリア & AD変換を完全停止*/
#if AD_CH > 4
/* どっちのグループを変換していたか */
if((AD.ADCSR.BYTE & 0x04) == 0){
#endif
/* グループ0(AD0〜AD3)を変換していた */
#if DEBUG > 2
fifo_num_write(&fifo_ad[0], 230);
fifo_num_write(&fifo_ad[1], 340);
fifo_num_write(&fifo_ad[2], 560);
fifo_num_write(&fifo_ad[3], 780);
#else
/*fifo_num_write(&fifo_ad[0], ((AD.ADDRA_H << 8) | AD.ADDRA_L)); 旧方式 */
fifo_num_write(&fifo_ad[0], AD.ADDRA.u16);
fifo_num_write(&fifo_ad[1], AD.ADDRB.u16);
fifo_num_write(&fifo_ad[2], AD.ADDRC.u16);
fifo_num_write(&fifo_ad[3], AD.ADDRD.u16);
#endif
#if AD_CH > 4
AD.ADCSR.BYTE |= 0x04; /* グループ1に切り替えて */
ad_start(); /* 再度AD変換 */
}else{
/* グループ1(AD4〜AD7)を変換していた */
#if DEBUG > 2
fifo_num_write(&fifo_ad[4], 230);
fifo_num_write(&fifo_ad[5], 340);
fifo_num_write(&fifo_ad[6], 560);
fifo_num_write(&fifo_ad[7], 780);
#else
fifo_num_write(&fifo_ad[4], AD.ADDRA.u16);
fifo_num_write(&fifo_ad[5], AD.ADDRB.u16);
fifo_num_write(&fifo_ad[6], AD.ADDRC.u16);
fifo_num_write(&fifo_ad[7], AD.ADDRD.u16);
#endif
AD.ADCSR.BYTE &= ~(0x04); /* グループ0に切り替え */
}
#endif
}
/**
* A/D変換の終了によって呼びだされる割り込み関数
*
* @see ad_end
*/
#pragma interrupt
void int_ad(){
if(AD.ADCSR.BIT.ADF){AD.ADCSR.BIT.ADF = 0;}
ad_end();
}