■ A/D 변환 5분만하면 승욱이 만큼 한다.

이차저차한 얘기는 다 생략하여 A/D 변환이 뭔지 안다는 것을 가정하고 설명하겠습니다.  매뉴얼에 나온 얘기를 간단히 정리한게 있습니다. 세미나 했던 자료라 내용이 충분치 않지만 자료실에 올려놓겠습니다. 참고만 하세요.

본론으로 들어가서, 만일 A/D 변환 프로그램을 MPLAB C에서 했다면 내부 어떤 레지스터를 0 혹은 1로 만들고, 무슨 비트가 어떻게 되었는지 체크하는 이런 번거러움이 없다는 것이 장점이 될 수 있습니다. 또한 A/D 변환 모듈을 어떻게 셋팅 했는지 한눈에 볼 수 있습니다. 과연 어떻게 하면 될까? 하나하나 배워 봅시다.

우선 우리가 알아 두워야 할 사항은 CCS-C사의 컴파일러는 함수 형태로 되어있다는 것을 알고 어떤 함수가 A/D 변환에 쓰이는지 알아봅시다.

[ Table 1. A/D 변환에 쓰이는 함수 ]

번호	함수	설명
1	setup_adc(mode)	mode adc_off adc_clock_div_2 adc_clock_div_8 adc_clock_div_32 adc_clock_internal
2	setup_adc_port(value)	예제) 1. ra0_ra1_ra3_analog - a0, a1, a3 아날로그 포트로 설정, reference는 +5V가 된다. 2. ra0_ra1_analog_ra3_ref - a0, a1은 아날로그, a3는 reference voltage, 나머지는 디지털 핀으로 된다.
3	set_adc_channel(chan)	ex) set_adc_channel(2) - 두 번째 채널 선택
4	i = read_adc()	setup_adc() 함수와 와 setup_adc_channel() 함수가 앞에 있어야 한다. A/D 변환된 결과 값을 변수 i에 저장한다.

인터럽트 사용시에는 " #int_ad "를 사용하여 처리합니다. 예제를 봅시다.

[ 예제 ]

#include "H_16c74b.h"

#use delay(clock=4000000)

/////////////////////////////////////////////////////////////////////////////////////

///////	인터럽트 처리부분	//////

/////////////////////////////////////////////////////////////////////////////////////

#int_ad

void ad_int_svr(void)

{

// A/D변환된 값을 PORTB에 써서 A/D 변환된 값을 체크한다.

PORTB = read_adc();

}

void main(void)

{

// 이 함수는 컴파일러에서 제공하는 함수이다.

// 모든 아날로그 핀을 A/D 변환 포트로 사용

setup_adc_ports( all_analog );

// clock을 2분주하여 A/D 변환을 한다.

setup_adc(adc_clock_div_2);

// adc가 완료했을 때 인터럽트가 걸리게 셋팅한다.

enable_interrupts(adc_done);

// 이 부분이 없으면 인터럽트가 걸리지 않는다.

enable_interrupts(global);

while(1) {

// ra1포트에 아날로그핀을 연결한다. ( 0~5[V] level )

set_adc_channel(1);

}

}

[ 결론 ]

어떻게 보면 어셈블리보다 프로그램 길이가 길죠. 그런나 보기에는 훨씬 좋죠.~  C언어는 코딩수가 길고 수학 연산시 그 장점을 보이는 것 같아요. 그럼 간단히 프로그램을 설명하면 main()함수는 무한루프 즉, while()문을 계속 돌다가 A/D 변환이 완료되면 인터럽트 서비스 루틴 즉, ad_int_svr()함수를 실행하는고, ad_int_svr()함수는 A/D 변환된 결과를 B포트에 넣으니까 우리가 B포트에 LED를 연결하면 A/D 변환 값의 확인이 가능합니다. 위의 소스는 잠깐동안 제가 코딩한거라 에러가 있을지도 모르니 실험해 보시고 에러가 발생하면 연락 바랍니다.