도와주세요!!
글 수 15,339
2008.11.06 19:06:57 (*.78.160.146)
12692
port : 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 메세지가 출력이 되더라구요...
버튼을 누르면 인터럽트 함수가 실행되는데 눌렀을 때, 버튼을 땠을때 두번연속으로 인터럽트 함수가 실행됩니다.
여기서 상승에지만 인트럽트 함수를 실행시키려면 어떻게 해야 하나요?
다만 버튼을 눌렀을 채터링이 발생하여 인터럽트가 여러번 걸린거지요
버튼을 눌렀을때 우리가 원하는 파형은 (상승에지)
+-----+
| |
-----------+ +------------- 이지만 실제로는
+++---+
||| |
-----------+++ +------------- 이렇게 잡음이 하드웨어적으로 발생합니다.
앞쪽의 이런 채터링을 제거하셔야 합니다. 콘덴서를 달거나 기타 하드웨어를 추가하여
잡음을 제거하는 는 방법도 있지만 쉽게는 소프트웨어로 처리하실 수도 있습니다.
첫번째 인터럽트 이후 인터럽트를 disable_irq(my_irq) 하신후 10msec 타이머에서
다시 enable_irq(my_irq) 하면 해결되죠