@@ -20,13 +20,13 @@ sudo apt install git
|
||||
git clone https://github.com/WiringPi/WiringPi.git
|
||||
cd WiringPi
|
||||
./build debian
|
||||
mv debian-template/wiringpi-3.1x.deb .
|
||||
mv debian-template/wiringpi_3.16_arm64.deb .
|
||||
```
|
||||
|
||||
**Debian-Paket installieren:**
|
||||
|
||||
```bash
|
||||
sudo apt install ./wiringpi-3.1x.deb
|
||||
sudo apt install ./wiringpi_3.16_arm64.deb
|
||||
```
|
||||
|
||||
**Debian-Paket deinstallieren:**
|
||||
@@ -125,10 +125,8 @@ mehr benutzt werden!
|
||||
|
||||
**Ab Version 3.4:**
|
||||
``wiringPiSetupPinType`` entscheidet ob nun WiringPi, BCM oder physische Pin-Nummerierung verwendet wird, anhand des Parameters pinType. Es führt also die ersten 3 Setup-Funktionen auf eine zusammen.
|
||||
``wiringPiSetupGpioDevice`` ist der Nachfolger der ``wiringPiSetupSys`` Funktion und verwendet nun "GPIO Character Device Userspace API" in Version 1 (ab Kernel 5.10 verfügbar). Nähere Informationen findet man bei https://docs.kernel.org/driver-api/gpio/driver.html. Anhand des Parameters pinType wird wieder entschieden, welche Pin-Nummerierung verwendet wird.
|
||||
Bei dieser Variante wird nicht direkt auf den GPIO-Speicher (DMA) zugegriffen sondern über eine Kernel Schnittstelle, die mit Benutzerrechten verfügbar ist. Nachteil ist der eingeschrenkte Funktionsumfang und die niedrige Performance.
|
||||
|
||||
<!-- Achtung Code der die neunen Funktionen benutzt ist nicht mehr mit der älterer Library Versionen 2 kompatibel! -->
|
||||
``wiringPiSetupGpioDevice`` ist der Nachfolger der ``wiringPiSetupSys`` Funktion und verwendet nun "GPIO Character Device Userspace API" in Version 2 (ab WiringPi Version 3.16). Nähere Informationen findet man bei https://docs.kernel.org/driver-api/gpio/driver.html. Anhand des Parameters pinType wird wieder entschieden, welche Pin-Nummerierung verwendet wird.
|
||||
Bei dieser Variante wird nicht direkt auf den GPIO-Speicher (DMA) zugegriffen sondern über eine Kernel Schnittstelle, die mit Benutzerrechten verfügbar ist. Nachteil ist der eingeschränkte Funktionsumfang und die niedrige Performance.
|
||||
|
||||
|
||||
### wiringPiSetup V2 (veraltet)
|
||||
@@ -288,37 +286,62 @@ if (value==HIGH)
|
||||
### wiringPiISR
|
||||
|
||||
Registriert eine Interrupt Service Routine (ISR) bzw. Funktion die bei Flankenwechsel ausgeführt wird.
|
||||
Es werden bei dieser klassischen Version keine Parameter and die ISR übergeben.
|
||||
|
||||
>>>
|
||||
```C
|
||||
int wiringPiISR(int pin, int edgeMode, void (*function)(struct WPIWfiStatus wfiStatus), unsigned long bouncetime);
|
||||
int wiringPiISR(int pin, int mode, void (*function)(void));
|
||||
```
|
||||
|
||||
``pin``: Der gewünschte Pin (BCM\-, WiringPi\- oder Pin\-Nummer).
|
||||
|
||||
``edgeMode``: Auslösende Flankenmodus
|
||||
``pin``: Der gewünschte Pin (BCM-, WiringPi- oder Pin-Nummer).
|
||||
``mode``: Auslösende Flankenmodus
|
||||
- INT_EDGE_RISING ... Steigende Flanke
|
||||
- INT_EDGE_FALLING ... Fallende Flanke
|
||||
- INT_EDGE_BOTH ... Steigende und fallende Flanke
|
||||
|
||||
``*function``: Funktionspointer für ISR mit Rückgabeparameter struct WPIWfiStatus:
|
||||
```C
|
||||
``*function``: Funktionspointer für ISR
|
||||
``Rückgabewert``:
|
||||
> 0 ... Erfolgreich
|
||||
<!-- > <>0 ... Fehler, zur Zeit nicht implementiert -->
|
||||
|
||||
Beispiel siehe [wiringPiISRStop](#wiringPiISRStop).
|
||||
|
||||
### wiringPiISR2
|
||||
|
||||
Registriert eine Interrupt Service Routine (ISR) bzw. Funktion die bei Flankenwechsel ausgeführt wird.
|
||||
Es werden erweiterte Parameter an die ISR übergeben.
|
||||
|
||||
>>>
|
||||
```C
|
||||
int wiringPiISR2(int pin, int edgeMode, void (*function)(struct WPIWfiStatus wfiStatus, void* userdata), unsigned long debounce_period_us, void* userdata);
|
||||
```
|
||||
|
||||
``pin``: Der gewünschte Pin (BCM\-, WiringPi\- oder Pin\-Nummer).
|
||||
|
||||
``edgeMode``: Auslösender Flankenmodus
|
||||
|
||||
- INT_EDGE_RISING ... Steigende Flanke
|
||||
- INT_EDGE_FALLING ... Fallende Flanke
|
||||
- INT_EDGE_BOTH ... Steigende und fallende Flanke
|
||||
|
||||
``*function``: Funktionspointer für ISR mit Parameter struct WPIWfiStatus und einem Pointer:
|
||||
```C
|
||||
struct WPIWfiStatus {
|
||||
int status; // -1: error, 0: timeout, 1: valid values for edge and timeStamp_us
|
||||
unsigned int gpioPin; // gpio as BCM pin
|
||||
int edge; // One of INT_EDGE_FALLING or INT_EDGE_RISING
|
||||
long long int timeStamp_us; // time stamp in microseconds, when interrupt happened
|
||||
int statusOK; // -1: error (return of 'poll' command), 0: timeout, 1: irq processed, next data values are valid if needed
|
||||
unsigned int pinBCM; // gpio as BCM pin
|
||||
int edge; // INT_EDGE_FALLING or INT_EDGE_RISING
|
||||
long long int timeStamp_us; // time stamp in microseconds
|
||||
};
|
||||
```
|
||||
```
|
||||
|
||||
``bouncetime``: Entprellzeit in Microsekunden, 0 ms schaltet das Entprellen ab
|
||||
``debounce_period_us``: Entprellzeit in Microsekunden, 0 schaltet das Entprellen ab
|
||||
``userdata``: Pointer der beim Aufruf der ISR übergeben wird
|
||||
|
||||
``Rückgabewert``:
|
||||
> 0 ... Erfolgreich
|
||||
<!-- > <>0 ... Fehler, zur Zeit nicht implementiert -->
|
||||
|
||||
Beispiel siehe waitForInterrupt.
|
||||
|
||||
Beispiel siehe [waitForInterrupt2](#waitForInterrupt2).
|
||||
|
||||
### wiringPiISRStop
|
||||
|
||||
@@ -326,56 +349,86 @@ Deregistriert die Interrupt Service Routine (ISR) auf einem Pin.
|
||||
|
||||
>>>
|
||||
```C
|
||||
int wiringPiISRStop (int pin)
|
||||
int wiringPiISRStop (int pin);
|
||||
```
|
||||
|
||||
``pin``: Der gewünschte Pin (BCM-, WiringPi- oder Pin-Nummer).
|
||||
``Rückgabewert``:
|
||||
|
||||
> 0 ... Erfolgreich
|
||||
<!-- > <>0 ... Fehler, zur Zeit nicht implementiert -->
|
||||
|
||||
|
||||
**Beispiel:**
|
||||
|
||||
>>>
|
||||
```C
|
||||
static volatile int edgeCounter;
|
||||
|
||||
static void isr(void) {
|
||||
edgeCounter++;
|
||||
}
|
||||
|
||||
int main (void) {
|
||||
wiringPiSetupPinType(WPI_PIN_BCM);
|
||||
edgeCounter = 0;
|
||||
|
||||
wiringPiISR(17, INT_EDGE_RISING, &isr);
|
||||
|
||||
Sleep(1000);
|
||||
printf("%d rising edges\n", edgeCounter);
|
||||
|
||||
wiringPiISRStop(17);
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
### waitForInterrupt
|
||||
|
||||
Funktion ist nicht mehr verfügbar, es wird nur noch die ``waitForInterrupt2`` unterstützt!
|
||||
|
||||
|
||||
### waitForInterrupt2
|
||||
|
||||
Wartet auf einen Aufruf der Interrupt Service Routine (ISR) mit Timeout und Entprellzeit in Mikrosekunden.
|
||||
Blockiert das Programm bis zum Eintreffen der auslösenden Flanke oder bis zum Ablauf des Timeouts.
|
||||
Diese Funktion sollte nicht verwendet werden.
|
||||
|
||||
>>>
|
||||
```C
|
||||
struct WPIWfiStatus wfiStatus waitForInterrupt (int pin, int edgeMode, int mS, unsigned long bouncetime)
|
||||
struct WPIWfiStatus wfiStatus waitForInterrupt2(int pin, int edgeMode, int ms, unsigned long debounce_period_us)
|
||||
```
|
||||
|
||||
``pin``: Der gewünschte Pin (BCM\-, WiringPi\- oder Pin\-Nummer).
|
||||
``edgeMode``: Auslösender Flankenmodus
|
||||
|
||||
``edgeMode``: Auslösende Flankenmodus
|
||||
- INT_EDGE_RISING ... Steigende Flanke
|
||||
- INT_EDGE_FALLING ... Fallende Flanke
|
||||
- INT_EDGE_BOTH ... Steigende und fallende Flanke
|
||||
|
||||
``mS``: Timeout in Milisekunden.
|
||||
- \-1 warten ohne timeout
|
||||
- 0 wartet nicht
|
||||
- 1...n wartet maximal n mS Millisekunden
|
||||
``ms``: Timeout in Milisekunden.
|
||||
- \-1 ... Warten ohne Timeout
|
||||
- 0 ... Wartet nicht
|
||||
- 1-n ... Wartet maximal n Millisekunden
|
||||
|
||||
``bouncetime``: Entprellzeit in Microsekunden, 0 schaltet Entprellen ab.
|
||||
``debounce_period_us``: Entprellzeit in Microsekunden, 0 schaltet Entprellen ab.
|
||||
|
||||
``Rückgabewert``:
|
||||
```C
|
||||
``Rückgabewert``:
|
||||
```C
|
||||
struct WPIWfiStatus {
|
||||
int status; // -1: error, 0: timeout, 1: valid values for edge and timeStamp_us
|
||||
unsigned int gpioPin; // gpio as BCM pin
|
||||
int edge; // One of INT_EDGE_FALLING or INT_EDGE_RISING
|
||||
long long int timeStamp_us; // time stamp in microseconds, when interrupt happened
|
||||
int statusOK; // -1: error (return of 'poll' command), 0: timeout, 1: irq processed, next data values are valid if needed
|
||||
unsigned int pinBCM; // gpio as BCM pin
|
||||
int edge; // INT_EDGE_FALLING or INT_EDGE_RISING
|
||||
long long int timeStamp_us; // time stamp in microseconds
|
||||
};
|
||||
```
|
||||
|
||||
**Beispiel:**
|
||||
|
||||
```C
|
||||
```C
|
||||
/*
|
||||
* isr_debounce.c:
|
||||
* Wait for Interrupt test program WiringPi >=3.16 - ISR method
|
||||
* Wait for Interrupt test program WiringPi >=3.16 - ISR2 method
|
||||
*
|
||||
*
|
||||
*/
|
||||
@@ -386,7 +439,6 @@ struct WPIWfiStatus {
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <wiringPi.h>
|
||||
|
||||
#include <time.h>
|
||||
|
||||
#define BOUNCETIME 3000 // microseconds
|
||||
@@ -398,26 +450,21 @@ struct WPIWfiStatus {
|
||||
// OUTpin : connected to a LED with 470 Ohm resistor in series to GND. Toggles LED with every push button pressed.
|
||||
//*************************************
|
||||
#define IRQpin 16
|
||||
#define OUTpin 12
|
||||
#define OUTpin 12
|
||||
|
||||
int toggle = 0;
|
||||
|
||||
/*
|
||||
* myInterrupt:
|
||||
*********************************************************************************
|
||||
*/
|
||||
|
||||
static void wfi (struct WPIWfiStatus wfiStatus) {
|
||||
static void wfi(struct WPIWfiStatus wfiStatus, void* userdata) {
|
||||
// struct timeval now;
|
||||
long long int timenow, diff;
|
||||
struct timespec curr;
|
||||
char *edgeType;
|
||||
|
||||
|
||||
if (clock_gettime(CLOCK_MONOTONIC, &curr) == -1) {
|
||||
printf("clock_gettime error");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
timenow = curr.tv_sec * 1000000LL + curr.tv_nsec/1000L; // convert to microseconds
|
||||
diff = timenow - wfiStatus.timeStamp_us;
|
||||
if (wfiStatus.edge == INT_EDGE_RISING)
|
||||
@@ -428,11 +475,11 @@ static void wfi (struct WPIWfiStatus wfiStatus) {
|
||||
edgeType = "none";
|
||||
printf("gpio BCM = %d, IRQ edge = %s, timestamp = %lld microseconds, timenow = %lld, diff = %lld\n", wfiStatus.gpioPin, edgeType, wfiStatus.timeStamp_us, timenow, diff);
|
||||
if (toggle == 0) {
|
||||
digitalWrite (OUTpin, HIGH) ;
|
||||
digitalWrite (OUTpin, HIGH);
|
||||
toggle = 1;
|
||||
}
|
||||
else {
|
||||
digitalWrite (OUTpin, LOW) ;
|
||||
digitalWrite (OUTpin, LOW);
|
||||
toggle = 0;
|
||||
}
|
||||
}
|
||||
@@ -441,55 +488,50 @@ static void wfi (struct WPIWfiStatus wfiStatus) {
|
||||
int main (void)
|
||||
{
|
||||
int major, minor;
|
||||
|
||||
wiringPiVersion(&major, &minor);
|
||||
|
||||
printf("\nISR debounce test (WiringPi %d.%d)\n\n", major, minor);
|
||||
|
||||
wiringPiSetupGpio() ;
|
||||
|
||||
wiringPiSetupGpio();
|
||||
pinMode(IRQpin, INPUT);
|
||||
|
||||
// pull up/down mode (PUD_OFF, PUD_UP, PUD_DOWN) => down
|
||||
pullUpDnControl(IRQpin, PUD_UP);
|
||||
|
||||
pinMode(OUTpin, OUTPUT);
|
||||
digitalWrite (OUTpin, LOW) ;
|
||||
|
||||
printf("Testing waitForInterrupt on both edges IRQ @ GPIO%d, timeout is %d\n", IRQpin, TIMEOUT);
|
||||
struct WPIWfiStatus wfiStatus = waitForInterrupt(IRQpin, INT_EDGE_BOTH, TIMEOUT, BOUNCETIME_WFI );
|
||||
printf("Testing waitForInterrupt on both edges IRQ @ GPIO%d, timeout is %d\n", IRQpin, TIMEOUT);
|
||||
struct WPIWfiStatus wfiStatus = waitForInterrupt2(IRQpin, INT_EDGE_BOTH, TIMEOUT, BOUNCETIME_WFI);
|
||||
if (wfiStatus.status < 0) {
|
||||
printf("waitForInterrupt returned error\n");
|
||||
pinMode(OUTpin, INPUT);
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
else if (wfiStatus.status == 0) {
|
||||
printf("waitForInterrupt timed out\n\n");
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (wfiStatus.edge == INT_EDGE_FALLING)
|
||||
printf("waitForInterrupt: GPIO pin %d falling edge fired at %lld microseconds\n\n", wfiStatus.gpioPin, wfiStatus.timeStamp_us);
|
||||
printf("waitForInterrupt: GPIO pin %d falling edge fired at %lld microseconds\n\n", wfiStatus.gpioPin, wfiStatus.timeStamp_us);
|
||||
else
|
||||
printf("waitForInterrupt: GPIO pin %d rising edge fired at %lld microseconds\n\n", wfiStatus.gpioPin, wfiStatus.timeStamp_us);
|
||||
printf("waitForInterrupt: GPIO pin %d rising edge fired at %lld microseconds\n\n", wfiStatus.gpioPin, wfiStatus.timeStamp_us);
|
||||
}
|
||||
|
||||
printf("Testing IRQ @ GPIO%d with trigger @ GPIO%d on both edges and bouncetime %d microseconds. Toggle LED @ OUTpin on IRQ.\n\n", IRQpin, IRQpin, BOUNCETIME, OUTpin);
|
||||
printf("Testing IRQ @ GPIO%d on both edges and bouncetime %d microseconds. Toggle LED @ GPIO%d on IRQ.\n\n", IRQpin, BOUNCETIME, OUTpin);
|
||||
printf("To stop program hit return key\n\n");
|
||||
|
||||
wiringPiISR (IRQpin, INT_EDGE_BOTH, &wfi, BOUNCETIME) ;
|
||||
|
||||
|
||||
wiringPiISR2(IRQpin, INT_EDGE_BOTH, &wfi, BOUNCETIME, NULL);
|
||||
|
||||
getc(stdin);
|
||||
|
||||
wiringPiISRStop (IRQpin) ;
|
||||
|
||||
wiringPiISRStop (IRQpin);
|
||||
pinMode(OUTpin, INPUT);
|
||||
|
||||
return 0 ;
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
Output auf dem Terminal:
|
||||
Ausgabe am Terminal:
|
||||
|
||||
```
|
||||
```
|
||||
pi@RaspberryPi:~/wiringpi-test-v3.16 $ gcc -o isr_debounce isr_debounce.c -l wiringPi
|
||||
pi@RaspberryPi:~/wiringpi-test-v3.16 $ ./isr_debounce
|
||||
|
||||
@@ -498,7 +540,7 @@ ISR debounce test (WiringPi 3.16)
|
||||
Testing waitForInterrupt on both edges IRQ @ GPIO16, timeout is 10000
|
||||
waitForInterrupt: GPIO pin 16 falling edge fired at 256522528012 microseconds
|
||||
|
||||
Testing IRQ @ GPIO16 with trigger @ GPIO16 on both edges and bouncetime 3000 microseconds. Toggle LED @ OUTpin on IRQ.
|
||||
Testing IRQ @ GPIO16 on both edges and bouncetime 3000 microseconds. Toggle LED @ GPIO12 on IRQ.
|
||||
|
||||
To stop program hit return key
|
||||
|
||||
@@ -515,7 +557,7 @@ gpio BCM = 16, IRQ edge = falling, timestamp = 256543320012 microseconds, timeno
|
||||
gpio BCM = 16, IRQ edge = rising, timestamp = 256544092021 microseconds, timenow = 256544092029, diff = 8
|
||||
^C
|
||||
pi@RaspberryPi:~/wiringpi-test-v3.16 $
|
||||
```
|
||||
```
|
||||
|
||||
|
||||
## Hardware PWM (Pulsweitenmodulation)
|
||||
@@ -648,9 +690,21 @@ int fd = wiringPiI2CSetupInterface("/dev/i2c-1", 0x20);
|
||||
```
|
||||
|
||||
|
||||
### wiringPiI2CWrite / wiringPiI2CWriteReg8 / wiringPiI2CWriteReg16 / wiringPiI2CWriteBlockData
|
||||
### wiringPiI2CWrite
|
||||
|
||||
...
|
||||
Einfaches schreiben auf einen I2C-Slave. Manche Geräte benötigen keine Adressierung eines Registers.
|
||||
|
||||
### wiringPiI2CWriteReg8
|
||||
|
||||
Schreibt 8-Bit Daten auf ein Register am Geräte.
|
||||
|
||||
### wiringPiI2CWriteReg16
|
||||
|
||||
Schreibt 16-Bit Daten auf ein Register am Geräte.
|
||||
|
||||
### wiringPiI2CWriteBlockData
|
||||
|
||||
Schreibt entsprechend der angeben Größe Daten auf ein Register am Geräte.
|
||||
|
||||
### wiringPiI2CRawWrite
|
||||
|
||||
@@ -683,9 +737,25 @@ if (fd>0) {
|
||||
}
|
||||
```
|
||||
|
||||
### wiringPiI2CRead / wiringPiI2CReadReg8 / wiringPiI2CReadReg16 / wiringPiI2CReadBlockData
|
||||
|
||||
...
|
||||
### wiringPiI2CRead
|
||||
|
||||
Einfaches lesen vom I2C-Slave. Manche Geräte benötigen keine Adressierung eines Registers.
|
||||
|
||||
### wiringPiI2CReadReg8
|
||||
|
||||
Liest 8-Bit Daten vom Register am Geräte.
|
||||
|
||||
|
||||
### wiringPiI2CReadReg16
|
||||
|
||||
Liest 16-Bit Daten vom Register am Geräte.
|
||||
|
||||
|
||||
### wiringPiI2CReadBlockData
|
||||
|
||||
Liest entsprechend der angeben Größe Daten vom Register am Geräte.
|
||||
|
||||
|
||||
### wiringPiI2CRawRead
|
||||
|
||||
@@ -732,8 +802,10 @@ Die alten Funktionen bleiben erhalten beziehen sich allerdings immer auf den SPI
|
||||
|
||||
>>>
|
||||
```C
|
||||
int wiringPiSPISetup (int channel, int speed)
|
||||
int wiringPiSPISetup (int channel, int speed, int mode)
|
||||
int wiringPiSPISetup(int channel, int speed)
|
||||
|
||||
int wiringPiSPISetupMode(int channel, int speed, int mode)
|
||||
|
||||
int wiringPiSPIxSetupMode(const int number, const int channel, const int speed, const int mode)
|
||||
```
|
||||
|
||||
|
||||
@@ -22,13 +22,13 @@ sudo apt install git
|
||||
git clone https://github.com/WiringPi/WiringPi.git
|
||||
cd WiringPi
|
||||
./build debian
|
||||
mv debian-template/wiringpi-3.0-1.deb .
|
||||
mv debian-template/wiringpi_3.16_arm64.deb .
|
||||
```
|
||||
|
||||
**Install Debian package:**
|
||||
|
||||
```bash
|
||||
sudo apt install ./wiringpi-3.0-1.deb
|
||||
sudo apt install ./wiringpi_3.16_arm64.deb
|
||||
```
|
||||
|
||||
**Uninstall Debian package:**
|
||||
@@ -120,11 +120,10 @@ Outdated functions (no longer use):
|
||||
|
||||
**Since Version 3.4:**
|
||||
|
||||
``wiringPiSetupPinType`` decides whether WiringPi, BCM or physical PIN numbering is now used, based on the parameter pinType. So it combines the first 3 setup functions together.
|
||||
``wiringPiSetupGpioDevice`` is the successor to the ``wiringPiSetupSys`` function and now uses "GPIO Character Device Userspace API" in version 1 (from kernel 5.10). More information can be found at [docs.kernel.org/driver-api/gpio/driver.html](https://docs.kernel.org/driver-api/gpio/driver.html) on the parameter pintype, it is again decided which pin numbering is used.
|
||||
``wiringPiSetupPinType`` decides whether WiringPi, BCM or physical pin numbering is used, based on the parameter pinType. So it combines the first 3 setup functions together.
|
||||
``wiringPiSetupGpioDevice`` is the successor to the ``wiringPiSetupSys`` function and now uses "GPIO Character Device Userspace API" in version 2 (WiringPi version 3.16 or higher). More information can be found at [docs.kernel.org/driver-api/gpio/driver.html](https://docs.kernel.org/driver-api/gpio/driver.html) on the parameter pintype, it is again decided which pin numbering is used.
|
||||
In this variant, there is no direct access to the GPIO memory (DMA) but rather through a kernel interface that is available with user permissions. The disadvantage is the limited functionality and low performance.
|
||||
|
||||
<!-- Attention code that uses the nine functions is no longer compatible with the older library version 2! -->
|
||||
|
||||
### wiringPiSetup V2 (outdated)
|
||||
|
||||
@@ -294,14 +293,15 @@ if (value == HIGH)
|
||||
|
||||
### wiringPiISR
|
||||
|
||||
Registers an Interrupt Service Routine (ISR) / function that is executed on edge detection.
|
||||
Registers an Interrupt Service Routine (ISR) / function that is executed on edge detection.
|
||||
In this classic version, no parameters are passed to the ISR.
|
||||
|
||||
```C
|
||||
int wiringPiISR(int pin, int mode, void (*function)(void));
|
||||
```
|
||||
|
||||
``pin``: The desired Pin (BCM-, WiringPi-, or Pin-number).
|
||||
``mode``: Triggering edge mode...
|
||||
``pin``: The desired pin (BCM-, WiringPi-, or Pin-number).
|
||||
``mode``: Triggering edge mode
|
||||
|
||||
- `INT_EDGE_RISING` ... Rising edge
|
||||
- `INT_EDGE_FALLING` ... Falling edge
|
||||
@@ -311,14 +311,50 @@ int wiringPiISR(int pin, int mode, void (*function)(void));
|
||||
``Return Value``:
|
||||
|
||||
> 0 ... Successful
|
||||
|
||||
<!-- > <>0 ... Error not implemented at the moment. -->
|
||||
|
||||
For example see **[wiringPiISRStop](#wiringpiisrstop)**.
|
||||
For example see [wiringPiISRStop](#wiringPiISRStop).
|
||||
|
||||
|
||||
### wiringPiISR2
|
||||
|
||||
Registers an Interrupt Service Routine (ISR) / function that is executed on edge detection.
|
||||
Extended parameters are passed to the ISR.
|
||||
|
||||
>>>
|
||||
```C
|
||||
int wiringPiISR2(int pin, int edgeMode, void (*function)(struct WPIWfiStatus wfiStatus, void* userdata), unsigned long debounce_period_us, void* userdata);
|
||||
```
|
||||
|
||||
``pin``: The desired pin (BCM-, WiringPi-, or Pin-number).
|
||||
``edgeMode``: Triggering edge mode
|
||||
|
||||
- `INT_EDGE_RISING` ... Rising edge
|
||||
- `INT_EDGE_FALLING` ... Falling edge
|
||||
- `INT_EDGE_BOTH` ... Rising and falling edge
|
||||
|
||||
``*function``: Function pointer for ISR with the parameter struct WPIWfiStatus and a pointer.
|
||||
```C
|
||||
struct WPIWfiStatus {
|
||||
int statusOK; // -1: error (return of 'poll' command), 0: timeout, 1: irq processed, next data values are valid if needed
|
||||
unsigned int pinBCM; // gpio as BCM pin
|
||||
int edge; // INT_EDGE_FALLING or INT_EDGE_RISING
|
||||
long long int timeStamp_us; // time stamp in microseconds
|
||||
};
|
||||
```
|
||||
|
||||
``debounce_period_us``: Debounce time in microseconds, 0 disables debouncing.
|
||||
``userdata``: Pointer that is passed when calling the ISR.
|
||||
|
||||
``Return Value``:
|
||||
> 0 ... Successful
|
||||
|
||||
For example see [waitForInterrupt2](#waitForInterrupt2).
|
||||
|
||||
|
||||
### wiringPiISRStop
|
||||
|
||||
Deregisters the Interrupt Service Routine (ISR) on a Pin.
|
||||
Deregisters the Interrupt Service Routine (ISR) on a pin.
|
||||
|
||||
```C
|
||||
int wiringPiISRStop (int pin);
|
||||
@@ -344,7 +380,7 @@ int main (void) {
|
||||
wiringPiSetupPinType(WPI_PIN_BCM);
|
||||
edgeCounter = 0;
|
||||
|
||||
wiringPiISR (17, INT_EDGE_RISING, &isr);
|
||||
wiringPiISR(17, INT_EDGE_RISING, &isr);
|
||||
|
||||
Sleep(1000);
|
||||
printf("%d rising edges\n", edgeCounter);
|
||||
@@ -355,18 +391,171 @@ int main (void) {
|
||||
|
||||
### waitForInterrupt
|
||||
|
||||
Waits for a previously defined interrupt ([wiringPiISR](#wiringpiisr)) on the GPIO pin. This function should not be used.
|
||||
The function is no longer available, only ``waitForInterrupt2``!
|
||||
|
||||
|
||||
### waitForInterrupt2
|
||||
|
||||
Waits for a call to the Interrupt Service Routine (ISR) with a timeout and debounce time in microseconds. Blocks the program until the triggering edge occurs or the timeout expires.
|
||||
|
||||
```C
|
||||
int waitForInterrupt (int pin, int mS);
|
||||
struct WPIWfiStatus wfiStatus waitForInterrupt2(int pin, int edgeMode, int ms, unsigned long debounce_period_us)
|
||||
```
|
||||
|
||||
``pin``: The desired Pin (BCM-, WiringPi-, or Pin-number).
|
||||
``mS``: Timeout in milliseconds.
|
||||
``Return Value``: Error
|
||||
> 0 ... Successful
|
||||
> -1 ... GPIO Device Chip not successfully opened
|
||||
> -2 ... ISR was not registered (WiringPiISR must be called)
|
||||
``ms``: Timeout in milliseconds.
|
||||
- \-1 ... Wait without timeout
|
||||
- 0 ... No wait
|
||||
- 1-n ... Waits for a maximum of n milliseconds
|
||||
|
||||
``debounce_period_us``: Debounce time in microseconds, 0 disables debouncing.
|
||||
|
||||
``Return Value``:
|
||||
```C
|
||||
struct WPIWfiStatus {
|
||||
int statusOK; // -1: error (return of 'poll' command), 0: timeout, 1: irq processed, next data values are valid if needed
|
||||
unsigned int pinBCM; // gpio as BCM pin
|
||||
int edge; // INT_EDGE_FALLING or INT_EDGE_RISING
|
||||
long long int timeStamp_us; // time stamp in microseconds
|
||||
};
|
||||
```
|
||||
|
||||
**Example:**
|
||||
|
||||
```C
|
||||
/*
|
||||
* isr_debounce.c:
|
||||
* Wait for Interrupt test program WiringPi >=3.16 - ISR2 method
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <wiringPi.h>
|
||||
#include <time.h>
|
||||
|
||||
#define BOUNCETIME 3000 // microseconds
|
||||
#define BOUNCETIME_WFI 300
|
||||
#define TIMEOUT 10000
|
||||
//*************************************
|
||||
// BCM pins
|
||||
// IRQpin : setup as input with internal pullup. Connected with push button to GND with 1K resistor in series.
|
||||
// OUTpin : connected to a LED with 470 Ohm resistor in series to GND. Toggles LED with every push button pressed.
|
||||
//*************************************
|
||||
#define IRQpin 16
|
||||
#define OUTpin 12
|
||||
|
||||
int toggle = 0;
|
||||
|
||||
static void wfi(struct WPIWfiStatus wfiStatus, void* userdata) {
|
||||
// struct timeval now;
|
||||
long long int timenow, diff;
|
||||
struct timespec curr;
|
||||
char *edgeType;
|
||||
|
||||
if (clock_gettime(CLOCK_MONOTONIC, &curr) == -1) {
|
||||
printf("clock_gettime error");
|
||||
return;
|
||||
}
|
||||
|
||||
timenow = curr.tv_sec * 1000000LL + curr.tv_nsec/1000L; // convert to microseconds
|
||||
diff = timenow - wfiStatus.timeStamp_us;
|
||||
if (wfiStatus.edge == INT_EDGE_RISING)
|
||||
edgeType = "rising";
|
||||
else if (wfiStatus.edge == INT_EDGE_FALLING)
|
||||
edgeType = "falling";
|
||||
else
|
||||
edgeType = "none";
|
||||
printf("gpio BCM = %d, IRQ edge = %s, timestamp = %lld microseconds, timenow = %lld, diff = %lld\n", wfiStatus.gpioPin, edgeType, wfiStatus.timeStamp_us, timenow, diff);
|
||||
if (toggle == 0) {
|
||||
digitalWrite (OUTpin, HIGH);
|
||||
toggle = 1;
|
||||
}
|
||||
else {
|
||||
digitalWrite (OUTpin, LOW);
|
||||
toggle = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int main (void)
|
||||
{
|
||||
int major, minor;
|
||||
wiringPiVersion(&major, &minor);
|
||||
printf("\nISR debounce test (WiringPi %d.%d)\n\n", major, minor);
|
||||
|
||||
wiringPiSetupGpio();
|
||||
pinMode(IRQpin, INPUT);
|
||||
// pull up/down mode (PUD_OFF, PUD_UP, PUD_DOWN) => down
|
||||
pullUpDnControl(IRQpin, PUD_UP);
|
||||
pinMode(OUTpin, OUTPUT);
|
||||
digitalWrite (OUTpin, LOW) ;
|
||||
|
||||
printf("Testing waitForInterrupt on both edges IRQ @ GPIO%d, timeout is %d\n", IRQpin, TIMEOUT);
|
||||
struct WPIWfiStatus wfiStatus = waitForInterrupt2(IRQpin, INT_EDGE_BOTH, TIMEOUT, BOUNCETIME_WFI);
|
||||
if (wfiStatus.status < 0) {
|
||||
printf("waitForInterrupt returned error\n");
|
||||
pinMode(OUTpin, INPUT);
|
||||
return 0;
|
||||
}
|
||||
else if (wfiStatus.status == 0) {
|
||||
printf("waitForInterrupt timed out\n\n");
|
||||
}
|
||||
else {
|
||||
if (wfiStatus.edge == INT_EDGE_FALLING)
|
||||
printf("waitForInterrupt: GPIO pin %d falling edge fired at %lld microseconds\n\n", wfiStatus.gpioPin, wfiStatus.timeStamp_us);
|
||||
else
|
||||
printf("waitForInterrupt: GPIO pin %d rising edge fired at %lld microseconds\n\n", wfiStatus.gpioPin, wfiStatus.timeStamp_us);
|
||||
}
|
||||
|
||||
printf("Testing IRQ @ GPIO%d on both edges and bouncetime %d microseconds. Toggle LED @ GPIO%d on IRQ.\n\n", IRQpin, BOUNCETIME, OUTpin);
|
||||
printf("To stop program hit return key\n\n");
|
||||
|
||||
wiringPiISR2(IRQpin, INT_EDGE_BOTH, &wfi, BOUNCETIME, NULL);
|
||||
|
||||
getc(stdin);
|
||||
|
||||
wiringPiISRStop (IRQpin);
|
||||
pinMode(OUTpin, INPUT);
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
Output on terminal:
|
||||
|
||||
```
|
||||
pi@RaspberryPi:~/wiringpi-test-v3.16 $ gcc -o isr_debounce isr_debounce.c -l wiringPi
|
||||
pi@RaspberryPi:~/wiringpi-test-v3.16 $ ./isr_debounce
|
||||
|
||||
ISR debounce test (WiringPi 3.16)
|
||||
|
||||
Testing waitForInterrupt on both edges IRQ @ GPIO16, timeout is 10000
|
||||
waitForInterrupt: GPIO pin 16 falling edge fired at 256522528012 microseconds
|
||||
|
||||
Testing IRQ @ GPIO16 on both edges and bouncetime 3000 microseconds. Toggle LED @ GPIO12 on IRQ.
|
||||
|
||||
To stop program hit return key
|
||||
|
||||
gpio BCM = 16, IRQ edge = rising, timestamp = 256522668010 microseconds, timenow = 256522668017, diff = 7
|
||||
gpio BCM = 16, IRQ edge = falling, timestamp = 256536364014 microseconds, timenow = 256536364021, diff = 7
|
||||
gpio BCM = 16, IRQ edge = rising, timestamp = 256536952011 microseconds, timenow = 256536952018, diff = 7
|
||||
gpio BCM = 16, IRQ edge = falling, timestamp = 256537856010 microseconds, timenow = 256537856016, diff = 6
|
||||
gpio BCM = 16, IRQ edge = rising, timestamp = 256538744011 microseconds, timenow = 256538744018, diff = 7
|
||||
gpio BCM = 16, IRQ edge = falling, timestamp = 256539664010 microseconds, timenow = 256539664017, diff = 7
|
||||
gpio BCM = 16, IRQ edge = rising, timestamp = 256540516010 microseconds, timenow = 256540516016, diff = 6
|
||||
gpio BCM = 16, IRQ edge = falling, timestamp = 256541560013 microseconds, timenow = 256541560022, diff = 9
|
||||
gpio BCM = 16, IRQ edge = rising, timestamp = 256542360010 microseconds, timenow = 256542360016, diff = 6
|
||||
gpio BCM = 16, IRQ edge = falling, timestamp = 256543320012 microseconds, timenow = 256543320020, diff = 8
|
||||
gpio BCM = 16, IRQ edge = rising, timestamp = 256544092021 microseconds, timenow = 256544092029, diff = 8
|
||||
^C
|
||||
pi@RaspberryPi:~/wiringpi-test-v3.16 $
|
||||
```
|
||||
|
||||
|
||||
## Hardware Pulse Width Modulation (PWM)
|
||||
|
||||
@@ -498,15 +687,15 @@ Simple device write. Some devices accept data this way without needing to access
|
||||
|
||||
### wiringPiI2CWriteReg8
|
||||
|
||||
Writes a 8-bit data value into the device register indicated.
|
||||
Writes 8-bit data value to the device register.
|
||||
|
||||
### wiringPiI2CWriteReg16
|
||||
|
||||
Writes a 16-bit data value into the device register indicated.
|
||||
Writes 16-bit data value to the device register.
|
||||
|
||||
### wiringPiI2CWriteBlockData
|
||||
|
||||
...
|
||||
Writes specified byte data values to the device register.
|
||||
|
||||
### wiringPiI2CRawWrite
|
||||
|
||||
@@ -541,21 +730,24 @@ else {
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
### wiringPiI2CRead
|
||||
|
||||
Simple device read. Some devices accept data this way without needing to access any internal registers.
|
||||
|
||||
Simple read from I2C slave. Some devices accept data this way without needing to access any internal registers.
|
||||
|
||||
### wiringPiI2CReadReg8
|
||||
|
||||
Reads an 8-bit data value into the device register indicated.
|
||||
Reads 8-bit data value from the device register.
|
||||
|
||||
### wiringPiI2CReadReg16
|
||||
|
||||
Reads an 16-bit data value into the device register indicated.
|
||||
Reads 16-bit data value from the device register.
|
||||
|
||||
|
||||
### wiringPiI2CReadBlockData
|
||||
|
||||
...
|
||||
Reads specified byte data values from the device register.
|
||||
|
||||
### wiringPiI2CRawRead
|
||||
|
||||
@@ -599,9 +791,9 @@ Functions that start with ``wiringPiSPIx`` are new since version 3, allowing th
|
||||
Opens the specified SPI bus. The Raspberry Pi has 2 channels, 0 and 1. The speed parameter is an integer in the range of 500,000 through 32,000,000 and represents the SPI clock speed in Hz.
|
||||
|
||||
```C
|
||||
int wiringPiSPISetup (int channel, int speed);
|
||||
int wiringPiSPISetup(int channel, int speed);
|
||||
|
||||
int wiringPiSPISetup (int channel, int speed, int mode);
|
||||
int wiringPiSPISetupMode(int channel, int speed, int mode);
|
||||
|
||||
int wiringPiSPIxSetupMode(const int number, const int channel, const int speed, const int mode);
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user