From 06d9302d121d8fbe5219afb81cc439b90db39f63 Mon Sep 17 00:00:00 2001 From: mstroh76 Date: Sun, 24 Mar 2024 11:08:12 +0100 Subject: [PATCH] new ISR example/test program --- examples/isr3.c | 169 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 examples/isr3.c diff --git a/examples/isr3.c b/examples/isr3.c new file mode 100644 index 0000000..36fb7f2 --- /dev/null +++ b/examples/isr3.c @@ -0,0 +1,169 @@ +/* + * isr3.c: + * Wait for Interrupt test program WiringPi >=3.2 - ISR method + * + * + */ + +#include +#include +#include +#include +#include +#include +#include + #include + +// globalCounter: +// Global variable to count interrupts +// Should be declared volatile to make sure the compiler doesn't cache it. + +static volatile int globalCounter; +volatile long long gStartTime, gEndTime; + +/* + * myInterrupt: + ********************************************************************************* + */ + +static void wfi (void) { + struct timeval now; + + gettimeofday(&now, 0); + if (0==gStartTime) { + gStartTime = now.tv_sec*1000000LL + now.tv_usec; + } else { + gEndTime = now.tv_sec*1000000LL + now.tv_usec; + } + globalCounter++; +} + +/* + ********************************************************************************* + * main + ********************************************************************************* + */ + +double StartSequence (int Enge, int OUTpin) { + int expected; + double timeExpected; + + gStartTime = 0; + gEndTime = 0; + globalCounter = 0; + printf("Start\n"); + digitalWrite(OUTpin, HIGH); + delay(200); + digitalWrite(OUTpin, LOW); + delay(100); + digitalWrite(OUTpin, HIGH); + delay(200); + digitalWrite(OUTpin, LOW); + delay(100); + printf("Stop\n"); + int globalCounterCopy = globalCounter; + + if (INT_EDGE_BOTH == Enge) { + expected = 4; + timeExpected = 500; + } else { + expected = 2; + timeExpected = 300; + } + + if(globalCounter==expected) { + double fTime = (gEndTime - gStartTime) / 1000000.0; + printf("IRQ worked %g sec (~%gs expected)\n\n", fTime, timeExpected/1000.0); + return fTime; + } else { + printf("IRQ not worked got %d iterations (%d exprected)\n\n", globalCounterCopy, expected); + return 0; + } +} + + +double DurationTime(int Enge, int OUTpin, int IRQpin) { + struct timeval now; + double fTime = 0.0; + + gStartTime = 0; + gEndTime = 0; + globalCounter = 0; + printf("Start\n"); + + if (INT_EDGE_RISING == Enge) { + digitalWrite(OUTpin, LOW); + wiringPiISR (IRQpin, INT_EDGE_RISING, &wfi) ; + sleep(1); + gettimeofday(&now, 0); + gStartTime = now.tv_sec*1000000LL + now.tv_usec; + digitalWrite(OUTpin, HIGH); + delay(20); + digitalWrite(OUTpin, LOW); + } else if (INT_EDGE_FALLING == Enge) { + digitalWrite(OUTpin, HIGH); + wiringPiISR (IRQpin, INT_EDGE_FALLING, &wfi) ; + sleep(1); + gettimeofday(&now, 0); + gStartTime = now.tv_sec*1000000LL + now.tv_usec; + digitalWrite(OUTpin, LOW); + } + + sleep(1); + fTime = (gEndTime - gStartTime); + printf("IRQ detect time %g usec\n\n", fTime); + wiringPiISRStop (IRQpin) ; + + return fTime; +} + +int main (void) +{ + const int IRQpin = 22 ; + const int OUTpin = 25 ; + int major, minor; + + wiringPiVersion(&major, &minor); + + printf("\nISR test (WiringPi %d.%d)\n", major, minor); + + wiringPiSetupGpio() ; + + pinMode(IRQpin, INPUT); + pinMode(OUTpin, OUTPUT); + digitalWrite (OUTpin, LOW) ; + + + printf("Testing IRQ @ GPIO%d with trigger @ GPIO%d rising\n", IRQpin, OUTpin); + wiringPiISR (IRQpin, INT_EDGE_RISING, &wfi) ; + sleep(1); + StartSequence (INT_EDGE_RISING, OUTpin); + printf("Testing close\n"); + + wiringPiISRStop (IRQpin) ; + + printf("Testing IRQ @ GPIO%d with trigger @ GPIO%d falling\n", IRQpin, OUTpin); + wiringPiISR (IRQpin, INT_EDGE_FALLING, &wfi) ; + sleep(1); + StartSequence (INT_EDGE_FALLING, OUTpin); + printf("Testing close\n"); + wiringPiISRStop (IRQpin) ; + + printf("Testing IRQ @ GPIO%d with trigger @ GPIO%d both\n", IRQpin, OUTpin); + wiringPiISR (IRQpin, INT_EDGE_BOTH, &wfi) ; + sleep(1); + StartSequence (INT_EDGE_BOTH, OUTpin); + printf("Testing close\n"); + wiringPiISRStop (IRQpin) ; + + for (int count=0; count<2; count++) { + printf("Measuring duration IRQ @ GPIO%d with trigger @ GPIO%d rising\n", IRQpin, OUTpin); + DurationTime(INT_EDGE_RISING, OUTpin, IRQpin); + + printf("Measuring duration IRQ @ GPIO%d with trigger @ GPIO%d falling\n", IRQpin, OUTpin); + DurationTime(INT_EDGE_FALLING, OUTpin, IRQpin); + } + pinMode(OUTpin, INPUT); + + return 0 ; +}