BASIC4MCU | 질문게시판 | Atmaga128 인터럽트를 사용한 main문 재실행 질문입니다.
페이지 정보
작성자 나욜렌 작성일2022-06-08 02:14 조회1,314회 댓글5건본문
현재 프로젝트를 위해 코드를 제작중인데,
atmega128의 PE4핀 (INT4)에 택트 스위치를 연결하여 외부 인터럽트로 동작시키려고 합니다.
void Interrupt_init(void)
{
EIMSK = 0x10;
EICRA = 0x00;
EICRB = 0x02;
EIFR = 0xFF;
sei();
}
인터럽트 초기화 함수는 다음과 같이 작성하였습니다.
다만 문제는 인터럽트 시 코드를 어떻게 작성해야 할 지 모르겠네요.
버퍼를 두어서 인터럽트 발생 시 버퍼 데이터를 바꾸어 해보려고도 했으나 반복문을 이런식으로 탈출하기는 불가능했습니다.
exit(0); 를 사용을 해보았는데 이 경우에도 먹통이었고요...
리셋버튼은 이미 있기에 main문 만을 처음부터 다시 돌리도록 하고싶습니다만, 좋은 방법이 있을까요?
댓글 5
조회수 1,314master님의 댓글
master 작성일
volatile char flag4=0; // 전역변수 추가, 코드비젼이라면 volatile 필요 없슴
ISR(INT4_vect){
flag4=1; // flag4 set
}
int main(){
start:; // 어드레스 라벨
while(
if(flag4){ flag4=0; goto start; } // 인터럽트4가 발생했다면 start로 강제 점프
}
}
goto는 같은 함수 내에서 사용하세요
다른 함수로 점프하면 안됩니다.
나욜렌님의 댓글
나욜렌
감사합니다
나욜렌님의 댓글
나욜렌
혹시 while문 내에서 다른 조건 발생 시 delay가 다수 포함되는 동작코드가 있다면 어떤식으로 적용을 해줘야할까요? 제가 이부분을 빼고 질문을 올려 이 방식으로는 사용이 불가능하네요 ㅠㅠ
master님의 댓글
master 작성일
_delay_ms(3000);
이렇게 무지막지한 딜레이가 있다면 딜레이를 쪼개야 합니다.
for(i=0;i<300;i++){ _delay_ms(10); if(flag4){ flag4=0; goto start; } }
10ms 마다 플래그를 체크 하도록 변경 했습니다.
딜레이나 루프가 여러개면 플래그 체크 문장을 여러개 모두 넣어야 합니다.
나욜렌님의 댓글
나욜렌
감사합니다. 코드가 길어진다고해도 다른 방법이 없다면 이 방법으로 해야겠네요 ㅠㅠ