SOURCE 공개

매뉴얼을 보시는 분에게 약간의 SOURCE를 공개 하겠습니다. 사용 하실 분은 하세요.

keil 컴파일러를 기준으로 작성 되어 있습니다.

1. ADC , DAC 초기화

 

#define OSC         14745600.0

#define NOR_OSC_DIVIDE        12

#define HIGH_BYTE(n) ((char)(n >> 8))

#define LOW_BYTE(n) ((char)(n & 0xff))

 

 

void OpenADC(int ms, char dac_onoff) /* LAUNCH ADC CONVERSIONS */ // --> adc

{

xdata unsigned int TM;

EADC = 0; // disable adc

ADCCON1 = 0x62;    // 0,1, 1,0, 0,0, 1,0

            // normal mode,adc_ clk=x_clk/4,획득시간, timer2 interrupt enable

            //adc_clk 는 osc클럭을 몇분주 해서 처리할껀지를 본다

            //획득시간은 한개의 data를 읽어 들이기 위한 민감도조절로

            //입력 포트의 누설 전류를 감안해야 하며 누설전류가 1m 에서 610옴

            //10m에서 61옴이다. 입력측 임피던스가 적으면 1개의 주기로도 상관이

            //없지만 임피던스가 커지면 내부 콘덴서 누설을 감안해 설정을 늘려야 한다.

ADCCON2 = 0x00 ; // sellect chan#8 = temp chanal (초기 체널값)

 

TM = 0x10000 - (_uint)((ms * 1000.0) / (NOR_OSC_DIVIDE/(OSC/1000000.0)));

TH0 = HIGH_BYTE(TM);

TL0 = LOW_BYTE(TM);

                            

RCAP2L = TL0 ; // timer2 인터럽트 걸린후 자동 타이머 셋팅값 (rcap2l, rcap2H)

RCAP2H = TH0 ;

 

TL2 = TL0 ;

TH2 = TH0 ;

 

if(dac_onoff == 1) DACCON=0x1F;     

    //DAC mode : 12bit,DAC1(0-Vref),DAC0(0-Vref),DAC1 output normal,DAC0 output normal

    //,DACxL upload => output change, DAC1 power on , DAC0 power off

 

EADC = 1;            //enable ADC interrupt

TR2 = 1;            //T2CON = 0x04 ; // run Timer2

}

 

 

1. ADC 처리루틴

 

#define ADC_MAX_CH 5 //입력되는 체널

 

xdata int ADC_BUF_VLT[ADC_MAX_CH]; //중간값 저장

xdata int ADC_CNV_VLT[ADC_MAX_CH]; //전압값 저장

xdata char adc_end = 0; //외부에 인터럽트 처리 완료

 

void adc_int() interrupt 6 { // int6*8+3 = 51dec = 33hex = ADCI

 

    unsigned char ch_chk;

    

    int add_DA_M;        //

    int add_DA_R;

 

    if( (ADCCON3 & 0x80) == 0x80 ) return; //adconverting..

    if(ch_chk<4) add_DA_M = (((ADCDATAH & 0x0F) <<8 ) | ADCDATAL);

//add AD converter value

    else add_DA_M = (((ADCDATAH & 0x0F) <<8 ) | ADCDATAL);

//add AD converter value

    

    if(add_DA_M < 0) add_DA_M=0;

    add_DA_R = (int)((250.0/4096.0*(add_DA_M))*2.0);

// Calculation = (reference/step) * converting values

    ch_chk = (ADCDATAH >> 4) & 0x0F;

    ADC_BUF_VLT[ch_chk] = (ADC_BUF_VLT[ch_chk] + add_DA_R)/2 ;

    ch_chk++;

 

    if(ch_chk >= ADC_MAX_CH)

    {

    ch_chk = 0 ;

    adc_end ++;    //adc 한번 변환이 끝났다고 알려줌

    }

 

    ADCCON2 = ch_chk;

}

 

 

 

 

 

 

 

'공부 > 8051' 카테고리의 다른 글

[ADUC812] ADUC812 설명 8  (0) 2012.11.10
[ADUC812] ADUC812 설명 7  (0) 2012.11.10
[ADUC812] ADUC812 설명 5  (0) 2012.11.10
[ADUC812] ADUC812 설명 4  (0) 2012.11.10
[ADUC812] ADUC812 설명 3  (0) 2012.11.10

+ Recent posts