libpruio  0.2
Input/Output driver for digital/analog lines on Beagleboard hardware
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
pwm_cap.c
Go to the documentation of this file.
1 
20 #define _GNU_SOURCE 1
22 #include "stdio.h"
23 #include <termios.h>
24 #include <unistd.h>
25 #include <errno.h>
26 #include "../c_wrapper/pruio.h"
27 #include "../c_wrapper/pruio_pins.h"
28 
30 #define P_OUT P9_21
31 #define P_IN P9_42
33 
41 int
42 isleep(unsigned int mseconds)
43 {
44  fd_set set;
45  struct timeval timeout;
46 
47  /* Initialize the file descriptor set. */
48  FD_ZERO(&set);
49  FD_SET(STDIN_FILENO, &set);
50 
51  /* Initialize the timeout data structure. */
52  timeout.tv_sec = 0;
53  timeout.tv_usec = mseconds * 1000;
54 
55  return TEMP_FAILURE_RETRY(select(FD_SETSIZE,
56  &set, NULL, NULL,
57  &timeout));
58 }
59 
61 int main(int argc, char **argv)
62 {
63  pruIo *Io = pruio_new(PRUIO_DEF_ACTIVE, 0x98, 0, 1);
64  do {
65  if (Io->Errr) {
66  printf("initialisation failed (%s)\n", Io->Errr); break;}
67 
68  if (pruio_cap_config(Io, P_IN, 2.)) { // configure input pin
69  printf("failed setting input @P_IN (%s)\n", Io->Errr); break;}
70 
71  float_t
72  f1 // Variable for calculated frequency.
73  , d1 // Variable for calculated duty cycle.
74  , f0 = 31250 // The required frequency.
75  , d0 = .5; // The required duty cycle.
76  if (pruio_pwm_setValue(Io, P_OUT, f0, d0)) {
77  printf("failed setting output @P_OUT (%s)\n", Io->Errr); break;}
78 
79  // pin config OK, transfer local settings to PRU and start
80  if (pruio_config(Io, 1, 0x1FE, 0, 4)) {
81  printf("config failed (%s)\n", Io->Errr); break;}
82 
83  struct termios oldt, newt; // make terminal non-blocking
84  tcgetattr( STDIN_FILENO, &oldt );
85  newt = oldt;
86  newt.c_lflag &= ~( ICANON );
87  newt.c_cc[VMIN] = 0;
88  newt.c_cc[VTIME] = 1;
89  tcsetattr( STDIN_FILENO, TCSANOW, &newt );
90 
91  while(1) { // run endless loop
92  if (1 == isleep(1)) {
93  switch (getchar()) { // evaluate keystroke
94  case '0' : d0 = 0.0; break;
95  case '1' : d0 = 0.1; break;
96  case '2' : d0 = 0.2; break;
97  case '3' : d0 = 0.3; break;
98  case '4' : d0 = 0.4; break;
99  case '5' : d0 = 0.5; break;
100  case '6' : d0 = 0.6; break;
101  case '7' : d0 = 0.7; break;
102  case '8' : d0 = 0.8; break;
103  case '9' : d0 = 0.9; break;
104  case ',' : d0 = 1.0; break;
105  case 'm' : f0 = (f0 > 5.5 ? f0 - 5. : .5); break;
106  case 'p' : f0 = (f0 < 999995. ? f0 + 5. : 1000000.); break;
107  case '*' : f0 = (f0 < 1000000 ? f0 * 2 : 1000000.); break;
108  case '/' : f0 = (f0 > .5 ? f0 / 2 : .5); break;
109  case '+' : f0 = 1000000; break;
110  case '-' : f0 = .5; break;
111  default: goto finish;
112  };
113  if (pruio_pwm_setValue(Io, P_OUT, f0, d0)) { // set new output
114  printf("failed setting PWM output (%s)\n", Io->Errr); break;}
115 
116  printf("\n--> Frequency: %10f , Duty: %10f\n", f0, d0); // info
117  }
118 
119  if (pruio_cap_Value(Io, P_IN, &f1, &d1)) { // get current input
120  printf("failed reading input @P_IN (%s)\n", Io->Errr); break;}
121 
122  printf("\r Frequency: %10f , Duty: %10f ", f1, d1); // info
123  fflush(STDIN_FILENO);
124  }
125 
126 finish:
127  tcsetattr( STDIN_FILENO, TCSANOW, &oldt ); // reset terminal
128 
129  printf("\n");
130  } while (0);
131 
132  pruio_destroy(Io); /* destroy driver structure */
133  return 0;
134 }
char * pruio_pwm_setValue(pruIo *Io, uint8 Ball, float_t Hz, float_t Du)
Wrapper function for PwmMod::setValue().
Float_t d1
Variable for calculated duty cycle.
Definition: pwm_cap.bas:40
int isleep(unsigned int mseconds)
Wait for keystroke or timeout.
Definition: pwm_cap.c:42
Float_t f1
Variable for calculated frequency.
Definition: pwm_cap.bas:40
Wrapper structure for PruIo.
Definition: pruio.h:403
pruIo * pruio_new(uint16 Act, uint8 Av, uint32 OpD, uint8 SaD)
Wrapper function for the constructor PruIo::PruIo().
char * Errr
pointer for error messages
Definition: pruio.h:411
void pruio_destroy(pruIo *Io)
Wrapper function for the destructor PruIo::~PruIo.
float float_t
float data type
Definition: pruio.h:40
#define P_IN
The pin for CAP input.
Definition: pwm_cap.c:32
activate all devices
Definition: pruio.h:385
Float_t d0
The required duty cycle.
Definition: pwm_cap.bas:43
int main(int argc, char **argv)
The main function.
Definition: pwm_cap.c:61
#define P_OUT
The pin for PWM output.
Definition: pwm_cap.c:30
char * pruio_cap_Value(pruIo *Io, uint8 Ball, float_t *Hz, float_t *Du)
Wrapper function for CapMod::Value().
char * pruio_cap_config(pruIo *Io, uint8 Ball, float_t FLow)
Wrapper function for CapMod::config().
char * pruio_config(pruIo *Io, uint32 Samp, uint32 Mask, uint32 Tmr, uint16 Mds)
Wrapper function for PruIo::config().
Float_t f0
The required frequency.
Definition: pwm_cap.bas:42