<ARM>
=ADC
=ADC_Init()함수에 INIT FLAG 추가
=ADC_Run()함수 추가
1. Init 완료전이면 return -1;
2. ADC_DRDY가 HIGH(CONVERSION완료)되기까지 대기
![](https://t1.daumcdn.net/cfile/tistory/2177733755FA799E15)
![](https://t1.daumcdn.net/cfile/tistory/250C433755FA79A007)
3. 변환된 값중 하위 10 BIT 만 추출
![](https://t1.daumcdn.net/cfile/tistory/22460D3755FA79A239)
#define AT91C_ADC_LDATA (0x3FF << 0) // (ADC) Last Data Converted |
![](https://t1.daumcdn.net/cfile/tistory/2511A73755FA79A403)
=
<ADC.H>
#ifndef __ADC_H__ #define __ADC_H__ #include <AT91SAM7S256.h>
#define PRESCAL 8
void ADC_Init(void); int ADC_Run(void);
#endif //__ADC_H__ |
<ADC.C>
#include "adc.h"
unsigned int uiInitFlag = 0; // INIT FLAT
void ADC_Init(void) { *AT91C_PMC_PCER = 1<<AT91C_ID_ADC; //Peripheral Clock Enable Register //p34 // 전원 공급 *AT91C_ADC_CR = AT91C_ADC_SWRST; // (ADC) Software Reset *AT91C_ADC_CHER = AT91C_ADC_CH4; // (ADC) ADC Channel Enable Register *AT91C_ADC_MR = (5 << PRESCAL) &(~(AT91C_ADC_LOWRES_8_BIT));// PRESCALE : 5 -> 4M clk 분해능 10BIT uiInitFlag = 1; return; }
int ADC_Run(void) { if(0 == uiInitFlag) { return -1; }
*AT91C_ADC_CR = AT91C_ADC_START; // (ADC) Start Conversion while(0==(*AT91C_ADC_SR &AT91C_ADC_DRDY)); // High 신호 대기 (convert완료 대기 ) return (int)(*AT91C_ADC_LCDR& AT91C_ADC_LDATA); // 하위 10bit 추출 }
|
<PROJECT.H>
#ifndef _PROJECT_H #define _PROJECT_H
#include "AT91SAM7S256.h"
#define MCK 48000000
// 2008.09.10. #ifndef __ASSEMBLY__ #include "lcd.h" #include "adc.h"
void default_fiq_handler(); void default_irq_handler(); void default_spurious_handler(); #endif // 2008.09.10.
#endif // _PROJECT_H |
<MAIN.C>
#include <project.h>
void Init(void) { LCD_Init(); ADC_Init(); return; }
int main(void) { volatile unsigned int uiCnt; unsigned char ucVal[] = "1023"; int iVal; Init(); while (1) { iVal = ADC_Run(); if(-1 == iVal) { LCD_Print("Error"); while(1); } ucVal[0] = '0' + (iVal/1000); ucVal[1] = '0' + (iVal%1000)/100; ucVal[2] = '0' + (iVal%100)/10; ucVal[3] = '0' + (iVal%10); LCD_Inst(LCD_INST_HOME); LCD_Print(ucVal); for(uiCnt = 0; uiCnt < 65000; ++uiCnt); for(uiCnt = 0; uiCnt < 65000; ++uiCnt); for(uiCnt = 0; uiCnt < 65000; ++uiCnt); for(uiCnt = 0; uiCnt < 65000; ++uiCnt); } while (1); return 0; } |
=결과
1. 온도센서 연결
2. 전원 / GND 연결
-소스파일
20150917_ARM_ADC_LCD_DISPLAY.zip