8051/PIC > DT516-020.c 13비트 타이머인터럽트0

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

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


BASIC4MCU | 8051/PIC | DT-516 강좌 | DT516-020.c 13비트 타이머인터럽트0

페이지 정보

작성자 키트 작성일2017-08-21 17:08 조회306회 댓글0건

첨부파일

본문

//-------------------------------------------------------------
// 82G516 E/V BOARD ( DT-516 )
//-------------------------------------------------------------
// XTAL : 22.1184Hz
//-------------------------------------------------------------
// filename: DT516-020.c
// 13비트 타이머인터럽트0
//-------------------------------------------------------------
#include <REG_MPC82G516.H>
//
unsigned int delay_buf=0;
bit delay_flg=0;
//
// TMOD 레지스터 default 13비트 타이머모드,// 225Hz = 4.444ms 주기 @22.1184Hz
void Timer_0_Interrupt(void) interrupt 1{  // Timer_0_Interrupt
    if(delay_buf){                         // 0이 아니면
        if(--delay_buf==0)delay_flg=1;     // 1을 뺀 후 0이면 플래그 SET
    }
}
//
void delay_ms(unsigned int d){ 
    delay_buf=(unsigned int)((float)d*0.225); // 딜레이 값 계산
    if(delay_buf==0)delay_buf=1;              // 0이면 1로 설정해서 무한루프에 빠지는 것 방지
    TH0=0;                 // 카운터초기화
    delay_flg=0;           // 플래그 크리어
    while(!delay_flg);     // 플래그 SET 될 때까지 대기
}
//
void main(){
    char c;
    ET0=1; TR0=1; // 타이머0 인터럽트이네이블, 타이머0 카운터개시
    EA=1;         // 전체인터럽트허가
    while(1){
        for(c=0;c<8;c++){ P1=~(1<<c); delay_ms(100); }
    }
}
//-------------------------------------------------------------

// 22118400Hz / 12 / 8192 = 225Hz

225Hz = 4.44ms의 주기라서 최대 4.44ms의 계산상의 오차가 발생 하지만, 누적오차는 없습니다.

수ms의 딜레이는 먼저번 함수로 만든 딜레이를 사용 하는 것이 좋습니다.

1ms 주기의 오버플로우 인터럽트는 다음번에 만들기로 하죠

 

이 인터럽트는 정확한 시간을 만드는 용도로 사용 하기 위해서 만든 것입니다.

 

//-------------------------------------------------------------

//-------------------------------------------------------------

 

설명이 전혀 없으면 어렵겠죠?

간단하게 적겠습니다,

상세한 것은 데이터시트를 보세요

 

//-------------------------------------------------------------

TMOD=0xXX; // 타이머1 모드 지정

TMOD=0xXX; // 타이머0 모드 지정

모드가 0이면 13비트 타이머 모드입니다.

//

TLx 는 5비트 프리스케일러로 동작 하고

THx는 카운터입니다.

//

TR0=1; // 카운트 개시

TR0=0; // 카운트 정지

//

인터럽트 함수에서 THx를 갱신 하고 있지 않으므로 0~255까지 계속 동작 합니다.

22118400Hz / 12 / 32(TLx) / 256(THx) = 225Hz // 12는 I/O 클럭 분주비

//

인터럽트 함수에서 THx를 갱신 해주면 타이머 주기를 변경 할 수 있습니다.

//

void Timer_0_Interrupt(void) interrupt 1{  // Timer_0_Interrupt
    TR0=0; TH0=(256-n); TR0=1; // TH0 변경, 22118400Hz / 12 / 32(TLx) / n(THx) = ??Hz

    if(delay_buf){                         // 0이 아니면
        if(--delay_buf==0)delay_flg=1;     // 1을 뺀 후 0이면 플래그 SET
    }
} 

 

//--------------------------------

 

 

 
    ET0=1; TR0=1; // 타이머0 인터럽트이네이블, 타이머0 카운터개시
    EA=1;         // 전체인터럽트허가
위 설정에 의해서 아래 인터럽트가 4.44ms 마다 실행 됩니다.

//
// TMOD 레지스터 default 13비트 타이머모드,// 225Hz = 4.444ms 주기 @22.1184Hz
void Timer_0_Interrupt(void) interrupt 1{  // Timer_0_Interrupt
    if(delay_buf){                         // 0이 아니면
        if(--delay_buf==0)delay_flg=1;     // 1을 뺀 후 0이면 플래그 SET
    }
}
매번 실행 되지만 delay_buf가 0이므로 if(delay_buf){}이 실행 되지 않습니다.

void delay_ms(unsigned int d){} 함수에서 delay_buf에 값을 넣어준 후 부터 if(delay_buf){}이 실행 됩니다.

댓글 0

조회수 306

등록된 댓글이 없습니다.

8051/PICHOME > 8051/PIC > 전체 목록

게시물 검색

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 ⓒ 2017
모바일버전으로보기