2016. 3. 3. 10:35 avr 기초
delay.h 헤더파일 소스 설명
안녕하세요 쭌지 입니다.
오늘은 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 가 되는것 입니다.
이렇게 해서 딜레이 함수의 설명이 끝났네요.
그럼 다들 딜레이 함수 잘쓰시고
오늘은 이만 물러나겠습니다~~
'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 |