상승에지 걸렸을때만 인터럽트를 발생하려고 했는데요, 상승, 하강 둘다 인트럽트가 발생하네요. 무엇이 문제가요?
글쓴이: falhed / 작성시간: 목, 2008/11/06 - 6:54오후
at91_sys_write(AT91_PIOA + PIO_PER, AT91_PIN_PA19);
at91_sys_write(AT91_PIOA + PIO_ODR, AT91_PIN_PA19);
at91_sys_write(AT91_PIOA + PIO_IER, AT91_PIN_PA19);
printk("Request SRAM mem region............\n");
irq = request_irq(AT91_PIN_PA19, &busy_interrupt, 0, "ram", NULL);
if(irq < 0)
{
printk("interrupt error\n");
return;
}
set_irq_type(AT91_PIN_PA19, IRQT_RISING);
enable_irq(AT91_PIN_PA19);
인터럽트를 함수를 등록하였고 상승에지만 인터럽트 발생하도록 set_irq_type 사용하여 등록하였습니다.
이렇게 insmod ram.ko하여 보드로 적재하니
enable_irq(51) unbalanced from bf00208c 메세지가 출력이 되더라구요...
버튼을 누르면 인터럽트 함수가 실행되는데 눌렀을 때, 버튼을 땠을때 두번연속으로 인터럽트 함수가 실행됩니다.
여기서 상승에지만 인트럽트 함수를 실행시키려면 어떻게 해야 하나요?
Forums:
인터럽트 핀에
인터럽트 핀에 스위치를 연결해 두고 테스트를 하고 있으면, 스위치를 누르거나 뗄때 하드웨어적으로 신호가 심하게 흔들리는 현상이 발생합니다. 이때 신호가 심하게 흔들리면서 프로세서쪽에서 상승, 하강신호를 여러번 입력받게 되는데, 이것때문에 그런거 같습니다.
스위치랑 인터럽트 핀 사이에 슈미트 트리거가 달린 버터나 적당한 C 랑 R, 다이오드 등으로 신호가 흔들리는걸 막을 수 있습니다. 관련회로는... 같은 팀에 하드웨어 하시는 분께 물어보시면 알껍니다.
하드웨어적으로 스위치 동작시 신호가 떨리는걸 잡는다 해도 먼지가 쌓이거나 회로가 노화되면 떨림이 또 생길 수 있는데, 이런 경우는 소프트웨어적으로 처리를 해 주어야 합니다. 스위치는 사람이 제어 하므로, 이벤트 사이의 시간이 너무 짧은 이벤트(예를들어 대략 100ms 이내의 이벤트)를 무시하는 방법으로 소프트웨어에서 처리해 줄 수 있습니다.
댓글 달기