2013-05-08 3 views
2

나는 이것이 다소 우스운 것 같음). 그러나 가능성을 제거하려고합니다 :Arduino에서 인터럽트가 너무 빠르게 작동합니다.

Arduino Uno에 나는 휘발성으로 정의 된 long 카운터를 증가시키는 루틴에 HIGH로 트리거 된 인터럽트를 첨부했습니다. 이 카운터는 LCD 화면에 표시됩니다. 주파수가 1   Hz 인 펄스 발생기를 TTL 레벨로 연결하면 카운터가 약 1 초당 증가 할 것으로 예상됩니다. 그러나 이것은 그렇지 않습니다.

빈도가 1   Hz (듀티 사이클 50 %)이므로 카운터가 증가하면 IRS가 종료되고 인터럽트 플래그가 지워질 수 있습니다. 그러나 INT0 레벨이 여전히 HIGH이므로 ISR이 계속 높음 다시 전화하게? ""외부 ", 및 1   Hz에서 50 % 듀티에서, HIGH 어떤 아두 이노의 중심에 ... 500   ms 동안 16   MHz에서

+0

인터럽트가 low에서 high 로의 'transition'에서 트리거되고 하이 레벨에서 트리거되지 않을 것이라고 기대합니다. 레벨에서 트리거 할 것은 없습니다. ISR은 어떤 빈도로 실행됩니까? – Arno

답변

1

프로세서를 유지 할 것은 인터럽트의 두 가지 종류가있다 핀 교환 ". ATmega168/328 (즉, Arduino Uno/Nano/Duemilanove)에는 두 개의 외부 인터럽트 핀 (INT0 및 INT1)이 있으며 Arduino 핀 2 및 3에 매핑됩니다. 이러한 인터럽트는 RISING 또는 신호 가장자리가 떨어지거나 낮은 레벨입니다. 트리거는 하드웨어에 의해 해석되며 인터럽트는 매우 빠릅니다. Arduino Mega에는 몇 가지 외부 인터럽트 핀이 있습니다.

따라서 댓글이 달린 부분 : 가장자리에서 트리거됩니다!

Arduino Playground 웹 페이지에 대한 자세한 내용을 참조하십시오.

1

두 가지 전기적 이유로 인해 인터럽트가 필요한만큼 작동하지 않는 이유를 설명 할 수 있습니다.

1- 펄스 발생기 출력과 MCU 입력에 임피던스 불일치가있을 수 있으며 파형 에지에서 신호음이 발생할 수 있습니다. 예를 들어, 함수 생성기가 고주파수를 생성 할 수있는 50 옴 출력을 갖는 경우 낮은 주파수에서 Arduino와 같이 높은 임피던스 입력을 유도하는 데 문제가 발생할 수 있습니다.

"펄스 발생기"라는 이름은 날카로운 모서리를 가진 매우 짧은 펄스를 만들기위한 50 ohm 출력 장치라고 생각합니다. 이 경우 대상 (부하)에 종단 저항을 추가하여 소스 (펄스 발생기)의 임피던스와 일치시킵니다. 50 옴 출력의 경우 47 옴이면 충분합니다. 출력이 100kohm이면 Arduino에 일치하는 저항을 배치하십시오.

2 정반대로, 생성기 파형 에지가 너무 느려 전압이 TTL 0에서 1로 여러 번 지나갈 수 있습니다. 신호 입력에 노이즈가 있으면 느린 에지로 인해 여러 트리거가 발생할 수 있습니다. 예를 들어, 전원 공급 장치 및 접지 문제로 60Hz 리플을 픽업하는 경우 구형파 에지는 생각한 것처럼 정사각형이되지 않습니다.

이러한 경우 히스테리 시스가 해결책입니다. 코드에서 디 글리 치 (디 바운스)하는 데는 여러 가지 방법이 있습니다. 모든 문제에 적합한 대답은 없습니다. 간단한 예로 ISR을 사용하면 가장자리가 허용되도록 입력을 두 번 읽는 것이 필요합니다.

+0

답변 해 주셔서 감사합니다. 문제가 해결되었습니다. # $ % $ # %^& $ # @ 연결이 잘못되었습니다. ..... INT0 = 핀 2와 INT1 = 핀 3 .... 매력 넘치는 것처럼 작동합니다. –

관련 문제