[완료]ADC관련입니다..동작이 되지않아서 질문드립니다.
글쓴이: singularof / 작성시간: 수, 2009/10/07 - 7:32오후
AT91SAM9260으로 내부 ADC를 제어하려고 합니다.
다른 코드는 정상적으로 동작하는것 확인 했고 ADC를 함수로 추가하는데 ADC가 제대로 동작하지 않네요.
ADC코드부분은
virt_addr = init(AT91C_BASE_ADC);
AT91F_ADC_CfgModeReg(virt_addr, 0);
AT91F_ADC_CfgTimings(virt_addr, 96, 1, 256, 16000);
AT91F_ADC_EnableChannel (virt_addr, (AT91C_ADC_CH0));
AT91F_ADC_EnableChannel (virt_addr, (AT91C_ADC_CH1));
AT91F_ADC_StartConversion (virt_addr);
while (!((AT91F_ADC_GetStatus (virt_addr)) && (1<<7) ) ); <--------요기
nAdc0 = AT91F_ADC_GetConvertedDataCH0 (virt_addr);
nAdc1 = AT91F_ADC_GetConvertedDataCH1 (virt_addr);
printf("%03x\n",nAdc0);
입니다.
여기서 virt_addr는 보드에서 AT91C_BASE_ADC의 주소로 직접 접근이 안되어서 virtual address를 받아서 접근하려고 한것입니다.
Forums:
ADC는 보통 동작에
ADC는 보통 동작에 관한 설정(채널이나 입력 레벨, 변환 비트수 등)을 먼저 해주고(보통 레지스터 설정을 통해 이루어 집니다) 시작할 시점에 시작 명령을 줍니다(AD 시작명령은 보통 특정 레지스터를 설정하거나 특정 핀을 이용합니다). 그리고, 얼마 후의 시간이 지나면 AD가 끝나고 상태 레지스터에 AD가 끝났다는것을 알리는 표시가 생깁니다.
구체적인 동작은 칩의 데이터시트를 보셔야 하는데, 아직 칩의 데이터시트를 보지 않으신 것 같네요. 칩의 데이터시트를 보고 해당 명령들이 잘 설정되었는지 확인해보세요.
&& 연산에 대해서
&& 연산에 대해서 알아보세요
OTL
Atmel website에 가시면 softpack이라고 있습니다.
http://www.atmel.com/dyn/products/tools_card.asp?tool_id=4343
에 보시면 해당하시는 chip인 AT91SAM9260-EK의 softpack이 있습니다.
download후 압축을 푸시면 sample code와 관련 document가 있습니다.
참고하시면 되겠네요..
당장 무한루프를
당장 무한루프를 도는 이유는 && 때문이네요..
&&는 &의 오타로 보이고요..
그런데 &로 고친다고해서 잘 될것 같지는 않네요.
자료를 많이 찾아보셔야할듯..
해결했습니다.
&&은 오타 맞고요...
설정은 전부 다 맞게 했는데.. 클럭을 활성화해야 하는데 활성화 하는부분이 없어서.. 계속 무한 루프에 빠져있었네요..
AT91F_PMC_EnablePeriphClock ( virt_addr, 1 << AT91C_ID_ADC ); <---- 클럭
AT91F_ADC_SoftReset (virt_addr); <---- 소프트트리거 리셋 해주었습니다.
AT91F_ADC_CfgModeReg(virt_addr, 0);
AT91F_ADC_CfgTimings(virt_addr, 96, 1, 256, 16000);
AT91F_ADC_EnableChannel (virt_addr, (AT91C_ADC_CH0));
AT91F_ADC_EnableChannel (virt_addr, (AT91C_ADC_CH1));
AT91F_ADC_StartConversion (virt_addr);
while (!((AT91F_ADC_GetStatus (virt_addr)) & (1<<0) ) );
while (!((AT91F_ADC_GetStatus (virt_addr)) & (1<<1) ) );
댓글 달기