이번에 Wemos D1 mini 를 이용하여 프로젝트를 하나 진행 중에 외부 인터럽트를 사용하려고 시도하던 중 에러가 발생했다.
시리얼 모니터를 확인하니 이런 에러코드만 뜨면서 계속 재부팅이 되었다.
처음에는 뭐가 잘 못 되었는지 이해가 되질 않았다.
Wemos D1 mini는 모든 GPIO를 외부 인터럽트로 사용할 수 있기 때문이다.(GPIO16 제외)
그래서 우연히 검색하던 중 한 블로그를 접하게 되었다.
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=mkhee77&logNo=221463453343
운 좋게도 해결 방법이 담겨 있었다.
간단히 설명 하자면
ISR 함수 앞에 ICACHE_RAM_ATTR 를 붙여 주면 된다.
기존에는
attachInterrupt(left_cds, check_outgoing, RISING);
void check_outgoing()
{
Serial.println("인터럽트 실행");
}
로 인터럽트를 구성했었다면
attachInterrupt(left_cds, check_outgoing, RISING);
ICACHE_RAM_ATTR void check_outgoing()
{
Serial.println("인터럽트 실행");
}
위와 같이 ICACHE_RAM_ATTR 을 앞에 붙여주면 된다.
정상적으로 센서 신호값이 변함에 따라서 인터럽트가 실행 되는 것을 확인할 수 있었다.
왜 이렇게 해야하는지에 대한 이유는 좀 더 살펴봐야겠다.
일단 해결책을 찾았기에 기록해본다.
'코딩 > 아두이노' 카테고리의 다른 글
아두이노 delay 없이 1초마다 작동하는 코드 (1) | 2022.07.18 |
---|---|
LOLIN D32 코드 업로드 오류(fatal error) 뜰 때, 해결 방법 (0) | 2022.06.09 |
아두이노 wifi보드, Wemos D1 mini 스펙과 핀맵 (10) | 2022.05.26 |
아두이노 네오픽셀로 LED 색 조절하는 방법 (0) | 2021.10.14 |
아두이노와 블루투스모듈 ZS-040로 스마트폰과 통신하기 (0) | 2021.04.30 |
댓글