_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 함수와 실제 클럭이 맞다는 보장이 없다. 따라서 외부클럭 혹은 하드웨어 시계를 사용하는 것이 좋다