안녕하세요 쭌지 입니다.

오늘은 avr을 쓸때 필수적으로 쓰게되는 delay 소스를 알아 보겠습니다.










딜레이 소스


void delay_us(unsigned char time_us) { // time delay(us)

  register unsigned char i;

  for(i = 0; i < time_us; i++) {                // 4 cycle

      asm volatile("PUSH R0 ");          // + 2 cycle

asm volatile("POP  R0 ");   // + 2 cycle

asm volatile("PUSH R0 ");   // + 2 cycle

asm volatile("POP  R0 ");   // + 2 cycle 

      asm volatile("PUSH R0 ");   // + 2 cycle

asm volatile("POP  R0 ");   // + 2 cycle

  // 16 cycle = 1 us at 16.000MHZ

  }

}


void delay_ms(unsigned int time_ms) {   // time delay(ms)

  register unsigned int i;

  for(i = 0; i < time_ms; i++) {

      delay_us(250);

delay_us(250);

delay_us(250);

delay_us(250);

  }

}




 위의 소스가 16Mhz의 딜레이 소스 입니다.

이제 하나씩 집어 보도록 하겠습니다.


우리가 딜레이를 줄때 보통

delay_ms(500);

이렇게 주는데요 ms를쓰게됩니다.

하지만 atmega의 cycle의 단위는 ns 두단계 밑의 단위의 시간을 씁니다.


그래서 의미없는 사이클을 만들어서 딜레이를 주는것이죠.


그럼 delay_ms(500); 을 넣었을때를 보도록 하겠습니다.(0.5초)

void delay_ms(unsigned int time_ms)<< 여기 괄호 안에 500이 들어가게 됩니다.

                                                         for(i = 0; i < time_ms; i++) { <<그리고 for문을 500번 반복합니다

                                                                                    delay_us(250);

delay_us(250);

delay_us(250);

delay_us(250);

                                                                  } (us가 250으로 잡혀 있으므로 4번 하게되면 1ms가 됩니다.)


for문 안을 들어가보면 delay_us를 호출하도록 해놨어요.

호출을 하게되면 밑의 함수들을 실행하게 됩니다.


 void delay_us(unsigned char time_us) {      // time delay(us)

  register unsigned char i;

  for(i = 0; i < time_us; i++) {                // 4 cycle

      asm volatile("PUSH R0 ");           // + 2 cycle

asm volatile("POP  R0 ");   // + 2 cycle

asm volatile("PUSH R0 ");   // + 2 cycle

 asm volatile("POP  R0 ");     // + 2 cycle 

      asm volatile("PUSH R0 ");   // + 2 cycle

asm volatile("POP  R0 ");   // + 2 cycle

       // 16 cycle = 1 us at 16.000MHZ

  }                                                

}                                                  


for믄은 4사이클을 사용하게 되고

push와 pop은 2사이클식 사용하게 됩니다.

프로세서에 의미없는 작업을 시켜주는 것이죠.

그럼 총 16사이클이 되어서 16Mhz에서 정확히 1us를 사용하게 됩니다.

(8Mhz라면 8사이클을 만듭니다 <<이런식으로 사이클 수정해주시면 됩니다.)

이렇게 for문을 250회를 4번을 해주면 1ms 가 되는것 입니다.


이렇게 해서 딜레이 함수의 설명이 끝났네요.

그럼 다들 딜레이 함수 잘쓰시고 

오늘은 이만 물러나겠습니다~~



delay, led, fnd 헤더파일



'avr 기초' 카테고리의 다른 글

atmega led switch  (0) 2016.03.07
atmega로 led켜기  (0) 2016.03.04
delay, led, fnd 헤더파일  (0) 2016.03.02
헤더파일 불러오기  (0) 2016.03.02
avr 헤더파일 만들기  (0) 2016.02.28
Posted by 탕구이

블로그 이미지
엔지니어를 꿈꾸는 공대생
탕구이

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.4
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

최근에 올라온 글

글 보관함