안녕하세요, ATmega8의 인터럽트 기능과 카운터를 사용하여 신호 하나가 들어갔을 때 상승엣지에서 시작하고, 다시 한번 신호가 들어갔을 때 상승엣지를 기준으로 끝내어 그 사이 시간 동안에 다른 펄스가 몇개가 들어갔는지를 카운터하고 시리얼 통신을 하려고 합니다.
제가 처음해 보는거라 ... 많이 부족합니다 도움좀 부탁드립니다.
void main(void)
{
DDRB=0xf3; //포트B의 2,3비트를 제외하고 출력으로 쓰겠음
DDRD=0xfe; //포트D의 0비트를 제외하고 출력으로 쓰겠음
DDRC =0xc0; //포트C의 6,7비트를 출력으로 쓰겠음
PORTB =0; //포트B 초기화
MCUCR = 0x0f;//int0, int1 상승 엣지에서 인터럽트 요청
GIFR = 0xc0;
Serial_init(); //초기화
_SEI(); //인터럽트 활성화
while(1)
{
if(PORTD & 0x04)
{
cbi(PORTD,3);
}
else if(PORTD & 0x08)
{
cbi(PORTD,2);
}
}
}
앞의 글과 거의 비슷한 내용이네요.
여기에 붙여 넣기 신공을 사용하겠습니다.^^
=======================================================
올려 주신 코드는 폴링 방식으로 펄스를 체크하는 방식입니다.
이런 방식은 정확한 시간을 측정하기 어렵습니다.
INT0, INT1 을 사용하신거 같은데 상승 에지를 디텍트 하려면
기본 레지스터를 설정하고
MCUCR = 0x0F; // INT0, INT1 상승에지 사용
GICR = 0xC0 ; // INT0, INT1 인터럽트 사용
_SEI(); // 전체 인터럽트 인에이블
while(1) {} // 무한 루프
인터럽트 루틴을 따로 처리하면 됩니다.
int starttime=0;
int endtime=0;
// INT0 걸리면
ISR(INT0_vect)
{
// INT0 처리
starttime = TCNT0;
}
// INT1 걸리면
ISR(INT1_vect)
{
// INT1 처리
endtime = TCNT0;
}
시간 차 구하기
시간차 = (endtime - starttime)/ 스케일값 ; 입니다.
(이 값은 클럭 속도와 DIV 값에 따라 달라지므로 스케일값을 구해서 계산하시면 됩니다.)