1. 다음은 AVR MCU의 내부 ADC를 사용하기 위한 초기화 작업을 하는 함수이다. 내용을 완성하여라.


2. 다음은 single-ended single conversion 모드에서 원하는 채널의 AD 변환을 시작시킨 후 변환이 끝날 때까지 기다린 변환 결과를 읽어서 값을 반환하는 함수이다. 내용을 완성하여라

Channel_num을 입력으로 받아 하위 4bit에 해당하는 부분만 남겨두고, 마스킹한다. 이때, ADMUX의 하위 4bit에 값이 있을 수 있으므로 초기화 후 마스킹한다. 그 다음 AD 변환 시작하는 ADSC bit를 1로 만들고, while문, flag 값을 이용해 변환 끝날 때까지 기다리고, 인터럽트가 아직 없으므로 직접 1을 기록하여 clear 한 후 return 값을 ADC 레지스터 값으로 설정한다.

3. ADC의 변환 완료 인터럽트를 사용하도록 1 번에서 작성한 adc_init() 함수를 수정하려고 한다 어떤 부분을 어떻게 수정하면 되는지 설명하여라.
Interrupt enable pin인 ADIE를 enable시켜준다.

4. (3 번과 무관) ADC가 free running 모드로 동작하도록 1 번에서 작성한 adc_init() 함수를 수정하려고 한다 어떤 부분을 어떻게 수정하면 되는지 설명하여라. free running 모드로 동작한다면 1 번에서 설정한 ADC 클럭을 사용할 때 1 초에 대략 몇 번의 AD 변환이 가능한지 계산하여라.

Q. Conversion time이 S&H 주기 포함인지?

포함이 맞다면, 1에서 128-prescaler를 설정했으므로 ADC 클럭주파수는 16MHz/128 = 125kHz
Signle ended에 해당하는 free running mode는 총 13s가 걸린다.
첫 변환시간은 25/125k = 200us, 이후는 13/125k = 104us이다.
따라서 1초에 약 9615회 AD 변환이 가능하다.