BASIC4MCU | 질문게시판 | ATMEGA128 초음파센서 인터럽트 관련
페이지 정보
작성자 메시기모찌 작성일2023-12-01 13:21 조회1,344회 댓글0건본문
#define F_CPU 12000000UL // 12 MHz
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
volatile unsigned int start=0,end=0,dist=0;
ISR(INT4_vect){
if(EICRB==3) // 라이징엣지 인터럽트
{
start=TCNT1; //TCNT1에 값 저장
EICRB=2; // 다음 인터럽트=폴링엣지
}
else //폴링엣지 인터럽트
{
end=TCNT1; // TCNT1 값 저장
EICRB=3; // 다음 인터럽트=라이징엣지
dist=(int)((float)(end-start)/10.9); //거리 계산
}
}
int Timer_Init(void) //서보모터 타이머
{
TCCR3A = (1 << COM3A1) | (1 << WGM31); // Clear OC1A on Compare match, set Fast PWM
TCCR3B = (1 << WGM33) | (1 << WGM32) | (1 << CS31) | (1 << CS30); // Prescaler 64
ICR3 = 3749; // ICR1 set to TOP
OCR3A = 281; // 0 degree
TCNT3 = 0X00; // Strating point
}
int main(void){
DDRD &= ~((1 << PIN_BUTTON1) | (1 << PIN_BUTTON2));
DDRA = 0x01;
PORTA = 0x01;
DDRB=0x20; //트리거 출력(PB5)
TCCR1A=0x82; // FAST PWM
TCCR1B=0x0B; // 분주비 : 64 = 5.33us
OCR1A=1; // 트리거 펄스폭
ICR1=9381; // PWM 주기
DDRE=0x08; // PE3 out
EICRB=3; // INT4 폴링엣지 활성화
EIMSK=0x10; // INT4 활성화
EIFR=0x10; //플래그 레지스터 클리어
sei(); //전역 인터럽트 활성화
while(1){
if(dist<3){
PORTA = 0x01;
OCR3A = 190;
_delay_ms(1000);
}
else{
PORTA = 0x00;
OCR3A = 340;
_delay_ms(1000);
}
}
}
선생님 서보모터까지 집어넣었는데 이게 서보모터가 그냥 엄청짧게 왔다갔다만 반복합니다.. 뭐가 잘못된건지 말씀해주실수있으실까요?
서보모터는 sg90입니다.
댓글 0
조회수 1,344등록된 댓글이 없습니다.