Download presentation
Presentation is loading. Please wait.
1
AdcRead API 함수 분석 마이크로프로세서
2
AdcRead API 함수 – AdcRead
unsigned int AdcRead(unsigned char port) { unsigned int value = 0; ADMUX = port&7; ADCSR |= ADC_START_CONVERSION; while(!(ADCSR & ADC_COMPLETE)); value = ADCL; value = (ADCH<<8) | value; if(m_AdcResolution == ADC_8)(value=value>>2); return value; } #define ADC_START_CONVERSION x40 #define ADC_COMPLETE x10 unsigned char m_AdcResolution = ADC_10;
3
AdcRead API 함수 – AdcRead
- A/D 컨버터 : 센서와 같은 소자에서 들어오는 아날로그 값을 디지털 값으로 변경 - Atmega128의 경우 10비트 축차 근사형의 A/D 컨버터를 8개 내장. (실질적으로 A/D 컨버터는 한개, 채널을 바꿔가며 아날로그 신호를 입력받음) - ADMUX : 아날로그 디지털 멀티플렉서 선택 레지스터 ADCSR : 아날로그 디지털 컨버터 제어 상태 레지스터 ADMUX는 A/D 신호를 입력 받을 채널을 0에서 7까지 선택. - 변환 채널이 선택되면 ADCSR을 설정하여 컨버전 프리스케일러 설정, 컨버터 완료 인터럽트를 설정. - 모든 설정이 끝나면 전역 인터럽트 플래그를 '셋'하여 인터럽트를 활성화. 아날로그 디지털 변환 완료 인터럽트 처리 루틴을 구성한 후, ADCSR의 6번 비트를 셋시켜 A/D 변환을 시작. - 변환이 시작한 후 변환 완료 플래그를 주기적으로 점검하거나 아날로그 디지털 변환 완료 인터럽트를 이용하여 A/D 컨버전 이후의 데이터 처리 루틴을 구성할 수 있음.
4
AdcRead API 함수 – AdcRead
unsigned int AdcRead(unsigned char port) { unsigned int value = 0; ADMUX = port&7; ADCSR |= ADC_START_CONVERSION; while(!(ADCSR & ADC_COMPLETE)); value = ADCL; value = (ADCH<<8) | value; if(m_AdcResolution == ADC_8)(value=value>>2); return value; } #define ADC_START_CONVERSION x40 #define ADC_COMPLETE x10 unsigned char m_AdcResolution = ADC_10;
5
Serial API 함수 – AdcRead x 1 x port & 7 ADMUX ADMUX = port&7;
6 5 4 3 2 1 x port & 1 7 x ADMUX
6
AdcRead API 함수 – AdcRead
unsigned int AdcRead(unsigned char port) { unsigned int value = 0; ADMUX = port&7; ADCSR |= ADC_START_CONVERSION; while(!(ADCSR & ADC_COMPLETE)); value = ADCL; value = (ADCH<<8) | value; if(m_AdcResolution == ADC_8)(value=value>>2); return value; } #define ADC_START_CONVERSION x40 #define ADC_COMPLETE x10 unsigned char m_AdcResolution = ADC_10;
7
Serial API 함수 – AdcRead x 1 x 1 ADCSR or 0x40 ADCSR ADCSR |= 0x40;
ADCSR의 6번 비트를 1로 set (A/D변환 시작) 7 6 5 4 3 2 1 x ADCSR or 1 0x40 x 1 ADCSR
8
AdcRead API 함수 – AdcRead
unsigned int AdcRead(unsigned char port) { unsigned int value = 0; ADMUX = port&7; ADCSR |= ADC_START_CONVERSION; while(!(ADCSR & ADC_COMPLETE)); value = ADCL; value = (ADCH<<8) | value; if(m_AdcResolution == ADC_8)(value=value>>2); return value; } #define ADC_START_CONVERSION x40 #define ADC_COMPLETE x10 unsigned char m_AdcResolution = ADC_10;
9
Serial API 함수 – AdcRead x 1 x ADCSR & 0x10 ADCSR
while(!(ADCSR & 0x10)); ADCSR의 4번 비트가 1이 될 때까지 대기 (A/D변환 완료 대기) 7 6 5 4 3 2 1 x ADCSR & 1 0x10 x ADCSR
10
AdcRead API 함수 – AdcRead
unsigned int AdcRead(unsigned char port) { unsigned int value = 0; ADMUX = port&7; ADCSR |= ADC_START_CONVERSION; while(!(ADCSR & ADC_COMPLETE)); value = ADCL; value = (ADCH<<8) | value; if(m_AdcResolution == ADC_8)(value=value>>2); return value; } #define ADC_START_CONVERSION x40 #define ADC_COMPLETE x10 unsigned char m_AdcResolution = ADC_10;
11
Serial API 함수 – AdcRead x x x ADCH ADCL value value = ADCL;
value = (ADCH<<8) | value; ADCL과 ADCH 값을 결합 (value는 0~1023) ADCH ADCL x x x value
12
AdcRead API 함수 – AdcRead
unsigned int AdcRead(unsigned char port) { unsigned int value = 0; ADMUX = port&7; ADCSR |= ADC_START_CONVERSION; while(!(ADCSR & ADC_COMPLETE)); value = ADCL; value = (ADCH<<8) | value; if(m_AdcResolution == ADC_8)(value=value>>2); return value; } #define ADC_START_CONVERSION x40 #define ADC_COMPLETE x10 unsigned char m_AdcResolution = ADC_10;
13
Serial API 함수 – AdcRead x x value value
if(m_AdcResolution == ADC_8)(value=value>>2); AdcResolution 값이 ADC_8과 같으면 value 값을 나누기 4 x value x value
14
AdcRead API 함수 – AdcRead
unsigned int AdcRead(unsigned char port) { unsigned int value = 0; ADMUX = port&7; // port 값의 하위 3비트만 ADMUX에 저장 (포트 지정) ADCSR |= ADC_START_CONVERSION; // ADCSR의 6번 비트를 1로 set (A/D변환 시작) while(!(ADCSR & ADC_COMPLETE)); // ADCSR의 4번 비트가 1이 될 때까지 대기 (A/D 변환 완료 대기) value = ADCL; value = (ADCH<<8) | value; // ADCL과 ADCH 값을 결합 if(m_AdcResolution == ADC_8)(value=value>>2); // AdcResolution 값이 ADC_8과 같으면 value 값을 나누기 4 return value; }
15
AdcRead API 함수 – ADC_Initialize
void ADC_Initialize(void) { ADMUX = PORT_A0; ADCSR = ADC_ENABLE | ADC_PRESCALE_DIV32; } #define ADC_ENABLE x80 #define ADC_PRESCALE_DIV ADMUX에 port를 A0로 초기화 ADCSR 값 초기화 7 6 5 4 3 2 1 1 ADCSR
16
AdcRead API 함수 – LgsSetType
ERROR LgsSetType(unsigned char port, unsigned char type) { if(type>MAX_LGS_TYPE)return UNKNOWN_LGS_TYPE; switch(port) case PORT_A6: m_SensorType1 = type; break; case PORT_A7: m_SensorType2 = type; default: return UNKNOWN_LGS_PORT; } return ERROR_NONE;
17
AdcRead API 함수 – LgsRead
unsigned int LgsRead(unsigned char port) { if((port == PORT_A6)||(port == PORT_A7)) return get_lego_sen(port); } else return AdcRead(port);
18
AdcRead API 함수 – get_lego_sen
uint16_t get_lego_sen(uint8_t Channel) { uint16_t ret =0; if(Channel == PORT_A6) Channel = 6; sbi(LEGO_SEN0_PORT, LEGO_SEN0_BIT); //PORTG, BIT_NUM0 micro_delay(100); cbi(LEGO_SEN0_PORT, LEGO_SEN0_BIT); } else if(Channel == PORT_A7) Channel = 7; sbi(LEGO_SEN0_PORT, LEGO_SEN1_BIT); //PORTG, BIT_NUM1 cbi(LEGO_SEN0_PORT, LEGO_SEN1_BIT); else return 0; micro_delay(5); ret = AdcRead(Channel); return ret;
19
AdcRead API 함수 – micro_delay
void micro_delay(unsigned int Time) { uint8_t time_500us = 0; char i = 0; while(Time--) for(time_500us=0;time_500us<100;time_500us++) i = i + time_500us; }
20
AdcRead API 함수 – LgsReadType
unsigned int LgsReadType(unsigned char port, unsigned char type) { unsigned int value = get_lego_sen(port); switch(type) case LGS_TYPE_LIGHT: value = value/10; break; case LGS_TYPE_TOUCH: if(value > 100) value = FALSE; else value = TRUE; } return value;
Similar presentations