[실험 3] 정확한 시간 지연 함수 만들기
(0) [실험2]에서 사용한 delay( ) 함수는 저오학한 시간지연을 얻을 수 없다. 따라서 실행시간을 알 수 있는 어셈블리 명령어를 사용하여 시잔지연함수를 만들어 보고, 시간지연함수를 사용하여, 1초 간격으로 LED를 반복 작동시켜 보자.
(1) 다음 프로그램을 작성하라.
#include <avr/io.h> void msec_delay(int ms); int main() { DDRA = 0xFF; while(1) { PORTA = 0xF0; msec_delay(1000); PORTA = 0x0F; msec_delay(1000); } return 0; } void msec_delay(int ms) { unsigned int i; for( ; ms>0; ms--) { for(i=0; i<2000; i++) { asm("nop"::); } } } |
- asm("nop"::); 는 단순히 1클록을 어셈블리 nop 명령을 c프로그램에서 수행하도록 하는 명령문이다.
(2) 프로그램을 컴파일 및 다운로드하고, 정상작동 여부를 확인하라.
(3) 프로그램의 의미를 파악하라.
- 작성한 시간지연함수는 msec_delay()는 컴파일러의 코드 최적화 또는 사용한 클록속도에 따라 차이를 나타낼 수 있다.
[실험 4]
(0) AVR-Studio의 <avr/delay.h>에 포함되어 있는 개발자용 시간지연함수를 사용하여 보자.
(개발자용 함수명(변수명)은 보통 _(밑줄, under bar)로 시작된다.)
(1) 다음 프로그램을 작성하라
#include <avr/io.h> #define F_CPU 16000000 #include <util/delay.h> int main() { DDRA = 0xFF; while(1) { PORTA = 0xF0; _delay_ms(1000); PORTA = 0x0F; _delay_ms(1000); } return 0; } |
- "define F_CPU 16000000"는 MCU에서 사용된 클록 주파수가 16MHZ임을 의미하고, 만일 정의하지 않으면 클록 주파수를 1MHZ로 정의되므로 주의가 필요하다.
- <util/dealy.h>는 [ms] 시간지연함수 _dealy_ms()가 정의되어있는 header 파일이고, <util/delay.h>에는 [us] 시간지연함수인 _delay_us()도 있다.
- "#define F_CPU 16000000"이 #include <util/delay.h>" 뒤에 오면 warning 발생 됨.
(2) 프로그램을 컴파일 및 다운로드하고, 정상작동 여부를 확인하라.
(3) 프로그램을 의미를 파악하라.
'Mcu 만져보기' 카테고리의 다른 글
Atmega128 7-Segment (0) | 2024.03.04 |
---|---|
Atmega128 LED 구동하기 4 (0) | 2024.03.03 |
Atmega128 LED 구동하기2 (0) | 2024.03.01 |
Atmega128로 LED구동하기 (0) | 2024.03.01 |
MCU vs MPU 둘의 차이는 무엇일까? (2) | 2024.02.01 |