ts-7000
[Top] [All Lists]

Re: [ts-7000] wanted: a C/BASH coded example of a program woken up by an

To: "" <>
Subject: Re: [ts-7000] wanted: a C/BASH coded example of a program woken up by an input momentary switch.
From: " [ts-7000]" <>
Date: Wed, 11 Jun 2014 09:34:00 -0700 (PDT)
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

<Prev in Thread] Current Thread [Next in Thread>
Admin

Disclaimer: Neither Andrew Taylor nor the University of NSW School of Computer and Engineering take any responsibility for the contents of this archive. It is purely a compilation of material sent by many people to the birding-aus mailing list. It has not been checked for accuracy nor its content verified in any way. If you wish to get material removed from the archive or have other queries about the archive e-mail Andrew Taylor at this address: andrewt@cse.unsw.EDU.AU