본문으로 바로가기
728x90
반응형

 오랜만에 Atmega로 펌웨어 프로그램 할 일이 생겨서 작업을 시작해 보았다.

 오랜만이라 툴도 제대로 안 깔려 있고 해서 툴부터 셋팅하고 ISP도 찾고 한 참 고생끝에 셋팅 완료....

 툴은 Atmel Studio 7.0, ISP는 Atmel MKII로 하였다.

 여기서 좀 황당했던게 예전에 ISP사용할 때는 그것 밖에 몰라서 그랬는지 당연하게 그냥 디버깅 안하고 사용했는데 디버깅이 안된다는걸 이번에 알았다.

 한동안 계속 JTAG을 사용했으니 당연히 된다고 생각하고 계속 시도하는데 안되어서 찾아보니 역시 사람은 좀 배워야 하나보다... ISP는 'In System Programming'으로 다운로드만 된다. 맨날 ISP라고만 했지 실제로 이 단어의 풀 네임을 몰랐으니 뭐....참고로 JTAG은 Joint Test Action Group라고 한다. 간단한 영어 해석 만으로도 이녀석들이 뭘하는지 알 수 있다. 여튼 한참 고생 후 ISP는 다운로드만 되는구나 라고 알고 디버깅이 안되니 통신부터 뚫어야 겠다는 생각으로 통신부터 뚫어나가기 시작했다.

 통신하면서도 고생했는데 이 에피소드는 나중으로 하고 일단 ADC를 하면서 주의점을 말해보겠다. 다른 사용법이나 예제는 다른 분들의 블로그에도 잘 나와 있으니 Pass하고 마지막에 살짝 코드를 보여드리겠다.

 ADC를 하면서 문제가 되었던 것이 뭐냐면 첨 시작하면 제대로 읽혀지고 한번 읽고 나면 값이 바뀌질 않는다는 점이었다.

 기본적으로 난 코드를 짧게 쓰려고 굉장히 노력하는 편이라 바로 ADC 값 레지스터를 저런 식으로 return 시켰다. 구문상 이상이 없고 값도 이상은 없는데 한번 읽고 나면 변경이 안되는 것이었다. ADC 값은 바뀌는 데 처음 읽은 값으로 계속 나오고 갱신이 안되는 것이었다. 

 결국 구글링하며 엄청 돌아다니다가 문제를 발견하게 되었다. 데이터 시트에 나와있는 내용이었는데 간과하고 넘어간 부분이었다. 대부분 MCU들이 거의 비슷하기 때문에 데이터 시트를 제대로 안 본게 문제였던 것이었다.

 

 아놔.....ADCL을 먼저 읽으면 안된다는 것이었다. ADCL을 읽을 때 ADCH를 읽을 때 까지 ADC Data Register가 업데이트가 안된다고 하네....내가 사용한 문법에 따르면 일단 한번 업데이트 되고 그 이후 ADCL은 읽고 ADCH는 쉬프트하게 되어 있는데 저 문법이 ADCH를 읽는 과정으로 판단이 안되는 것으로 보인다. 다른 사람들도 이런 과정을 격는 사람이 있었는데 쓰레기 값이 들어간다는 사람도 있고 여튼 난 업데이트가 안되었었다. 결론적으로 ADCL을 반드시 먼저 읽어야 한다는 것이다. 

 따로 변수 쓰는거 싫었는데 결국 adc_value라는 변수를 하나 만들어서 저렇게 하니까 잘 되더라.....이걸로 몇시간 헤메고 고생했던 거 생각하니 화가 날 지경이다. 대부분 사람들은 무의식적으로 변수 만들어서 ADCL부터 읽고 ADCH를 더해서 사용하는 경우가 많아서 잘 모르고 그냥 된 경우도 많은 것 같다. 내가 아는 지인분도 문제없이 썼다고 해서 그 코드 참조해서 한참 봤고 나중에 이 사실을 알고 말해줬더니 본인은 몰랐다고 하더라.....

 여튼 의외로 모르고 지나가는 사람도 많으니 나처럼 고생하는 사람이 없길 바란다. 아래는 내가 사용한 ADC 읽는 함수와 초기화 부분을 참고로 올린다. 5번 읽어서 최대값과 최소값을 빼서 평균 취하는 함수이다. ADC가 튈 수도 있다고 생각해서 넣은 함수고 샘플링이 충분할 때 쓸 수 있긴한데....뭐 MCU로 ADC하는게 엄청 정밀하게 보려고 하는 경우가 거의 없으니 왠만하면 다 사용할 수 있다고 생각된다.

 

<ADC Init>
<ADC 읽는 함수>

 

728x90
반응형