new ISR example/test program
This commit is contained in:
169
examples/isr3.c
Normal file
169
examples/isr3.c
Normal file
@@ -0,0 +1,169 @@
|
||||
/*
|
||||
* isr3.c:
|
||||
* Wait for Interrupt test program WiringPi >=3.2 - ISR method
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <wiringPi.h>
|
||||
#include <wpiExtensions.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
// 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 ;
|
||||
}
|
||||
Reference in New Issue
Block a user