AVR > 인터럽트 함수내의 실행 코드 실행 시간에 주의하세요

TODAY657 TOTAL2,920,946
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


BASIC4MCU | AVR | 외부인터럽트 | 인터럽트 함수내의 실행 코드 실행 시간에 주의하세요

페이지 정보

작성자 키트 작성일2017-08-29 09:16 조회4,044회 댓글0건

본문

#include <mega128.h> 
#include <delay.h>

//

interrupt [TIM0_COMP] void timer0_comp_isr(void){

    delay_ms(1);

}

//
void main(void){

    DDRA=1; // PA0 out

    TCCR0=0x0C; OCR0=249;  TIMSK=2;  //16000000/  64/(1+249)= 1000Hz=1ms
    #asm("sei")
    while(1){ PORTA^=1; } // PA0 토글
}
//

아주 간단한 코드라서 설명이 따로 필요 없을겁니다.

인터럽트가 없다면

    while(1){ PORTA^=1; } // PA0 토글
PA0는 수MHz의 펄스가 나오게 됩니다.

1ms마다 한번씩 인터럽트가 실행 되고

이 시간동안 PA0 출력은 변화가 생기지 않습니다.

코드비젼의 딜레이 함수가 아주 정확하다고(0.0001us의 오차도 없다고) 가정하죠

위 코드를 실행 하면 인터럽트 주기와 딜레이 시간이 같으므로

딜레이를 마치자마자 다음 인터럽트 플래그가 set 됩니다.

일단 메인으로 복귀 하게되고

메인에 와서 PORTA^=1; 이 코드를 실행 한 뒤에

(엄밀하게는 c에서 PORTA^=1;이 코드는 어셈블러로 한 라인이 아닐 수도 있습니다. 최적화 옵션에 따라서도 달라짐)

다시 인터럽트가 실행 됩니다.

계속해서 시간이 밀리므로 언젠가 인터럽트가 한번 덜 실행 되게 됩니다.

(인터럽트 안에서는 다시 인터럽트가 실행되지 못하고 메인에 일단 나갔다가 와야 합니다.)

 

interrupt [TIM0_COMP] void timer0_comp_isr(void){

    delay_us(900);

}

이렇게 하면 인터럽트가 시간을 900us 점유하고 메인이 100us 사용합니다.

 

interrupt [TIM0_COMP] void timer0_comp_isr(void){

    delay_us(100);

}

이렇게 하면 인터럽트가 시간을 100us 점유하고 메인이 900us 사용합니다.

//

인터럽트 플래그가 set되어서 인터럽트 함수를 실행 하고 리턴 하는데에도 약간의 시간이 걸립니다.

댓글 0

조회수 4,044

등록된 댓글이 없습니다.

AVRHOME > AVR > 외부인터럽트 목록

게시물 검색

2022년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2021년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2020년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2019년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2018년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
Privacy Policy
MCU BASIC ⓒ 2020
모바일버전으로보기