You need write a driver that services the dio port interrupt. Then your user
program sleeps on the driver via the polling mechanism i.e. by select() and is
woken up when a interrupt occurs.
Mike McDonald
On Wednesday, June 11, 2014 12:03:31 PM, " [ts-7000]"
<> wrote:
OK, so I have DIO.C working perfectly (code below) and I have a Momentary
switch hooked up to DIO_40, and an LED hooked up to DIO_33 and everything
works perfectly. I can turn on and off the LED, with a "./dio set " command,
and when I look at pin 40 with the "./dio get 40" command it properly answers
with a 0 or 1 depending on the state of the push button.
What I want is a program that is interrupt based that uses little to no CPU
time but wakes up when the DIO_40 changes states, I know I can put the
"getdiopin(pin);" statement in a while loop and have it break out when the
state changes, but that burns a lot of CPU time, or if "sleep" is utilized,
then there will be a delay to respond.
Is there any way to make a [threaded?] program where you have [a child thread
that is just] waiting for the change of state of pin 40, not looping, and
checking, When I write ethernet drivers, I have a multithreaded process where
a child thread is waiting on an inbound message and it just sits there doing
nothing, buring no CPU, until it gets woken up by traffic on the IP port. I
want something similar for an input button. Any Ideas?
/*******************************************************************************
* Program:
* Get DIO (dio.c)
* Technologic Systems TS-7500 with TS-752 Development Board
*
* Summary:
* This program will accept any pin number between 5 and 40 and attempt to get
* or set those pins in a c program rather than scripted. You will need the
* TS-7500 and TS-752 development board. Although this program will enable the
* use of said pins, it will primarily enable the use of the 8 Inputs, 3 Outputs,
* and Relays on the TS-752. Keep in mind that if a GND or PWR pin is read (or
* something else unlogical, we don't necessarily care about the output because
* it could be simply "junk".
* Notice careful semaphore usage (sbuslock, sbusunlock) within main.
*
* Usage:
* ./dio <get|set> <pin#> <set_value (0|1|2)>
*
* 0 - GND
* 1 - 3.3V
* 2 - Z (High Impedance)
*
* Examples:
* To read an input pin (such as 1 through 8 on the TS-752):
* ts7500:~/sbus# ./dio get 40
* Result of getdiopin(38) is: 1
*
* To set an output pin (such as 1 through 3 or relays on the TS-752):
* ts7500:~/sbus# ./dio set 33 0
* Pin#33 has been set to 0 [You may verify with DVM]
*
* Compile with:
* gcc -mcpu=arm9 dio.c sbus.c -o dio
Date Whom Notes.
100112 JL Lets give it a try.
*******************************************************************************/
#include "sbus.h"
#include <assert.h>
#include <string.h>
#include <stdio.h>
#define DIO_Z 2
/*******************************************************************************
* Main: accept input from the command line and act accordingly.
*******************************************************************************/
int main(int argc, char **argv)
{
int pin;
int val;
int returnedValue;
// Check for invalid command line arguments
if ((argc > 4) | (argc < 3))
{
printf("Usage: %s <get|set> <pin#> <set_value (0|1|2)>\n", argv[0]);
return 1;
}
// We only want to get val if there are more than 3 command line arguments
if (argc == 3)
pin = strtoul(argv[2], NULL, 0);
else
{
pin = strtoul(argv[2], NULL, 0);
val = strtoul(argv[3], NULL, 0);
}
// If anything other than pins 5 through 40, fail program
assert(pin <= 40 && pin >= 5);
// Parse through the command line arguments, check for valid inputs, and exec
if (!(strcmp(argv[1], "get")) && (argc == 3))
{
sbuslock();
returnedValue = getdiopin(pin);
sbusunlock();
printf("pin#%d = %d \n", pin, returnedValue);
}
else if(!(strcmp(argv[1], "set")) && (argc == 4) && (val <= 2))
{
sbuslock();
setdiopin(pin, val);
sbusunlock();
printf("pin#%d set to %d\n", pin, val);
}
else
{
printf("Usage: %s <get|set> <pin#> <set_value (0|1|2)>\n", argv[0]);
return 1;
}
return 0;
}
// EOF
|