_delay_ms 함수의 부정확성
2019. 5. 24. 02:48ㆍ임베디드/ATmega128
atmel studio의 _delay_ms는 소프트웨어적으로 F_CPU값 기반 하에 libc에서 함수를 만들어서 제공한다. 그래서 사용자는 해당 라이브러리 함수를 사용하면서 쉽게 delay를 이끌어 낼 수 있다. 하지만 어느정도 정밀을 요구하는 프로그램에서는 _delay_ms 함수에 주의를 기울여야 한다.
그 이유는 인터럽트에 있다. 인터럽트 조건이 만족되면 제어권은 잠시 ISR로 넘어가며, main과는 다른 영역으로 main에서 실행되는 _delay_ms 함수는 흘러가지 않는다. 따라서 ISR이 실행되는 시간만큼 지연이 되기 마련이다.
해답은 클럭 카운트를 셀 수 있는 타이머카운터 기능을 이용하는 것이다. 다만 누적오차가 발생하지 않으려면 CTC 비교매치 및 PWM 등 자동으로 타이머 카운터가 갱신되는 모드로 사용하는 것이 좋다
[추가] 19.06.06
외부클럭인 16MHz는 정밀도가 그리 높지 않은 클럭이다. 따라서 소프트웨어적인 _delay_ms 함수와 실제 클럭이 맞다는 보장이 없다. 따라서 외부클럭 혹은 하드웨어 시계를 사용하는 것이 좋다
'임베디드 > ATmega128' 카테고리의 다른 글
#include "" 와 <>의 차이 (0) | 2019.05.26 |
---|---|
atmel studio에서 src 폴더로 관리할 때 build (0) | 2019.05.26 |
멤브레인 4x4 키패드 동작 (0) | 2019.05.22 |
ADC 값을 이용한 random seed 바꾸기 (0) | 2019.05.21 |
ADC 단일 입력의 취약점 (0) | 2019.05.21 |