본문 바로가기
Mcu 만져보기

Atmega128 LED 구동하기 3

by 닉네임 없네용 2024. 3. 2.

[실험 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()는 컴파일러의 코드 최적화 또는 사용한 클록속도에 따라 차이를 나타낼 수 있다.

 

실험3 결과

 

[실험 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) 프로그램을 컴파일 및 다운로드하고, 정상작동 여부를 확인하라.

 

실험4 결과

 

(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