Re: [Xenomai-core] analogy - experimental branch

2010-07-19 Thread Alexis Berlemont
Hi,

Sorry for answering late. 

Stefan Schaal wrote:
 Hi Alexis,
 
   I managed to port some of the Comedi examples to Analogy. In particular, I 
 could configure one of my counter subdevices to become a high frequency 
 clock, following the gpct_pulse_generator.c example. I routed the output of 
 the clock to my PFI0 pin, and could visualize the signal on an oscilloscope. 
 Thus, I know have the clock I need to trigger CMD-based DIO, as you 
 suggested. (I will post some sample code of this in the near future after all 
 is cleaned up).
 
Next, I went back to cmd_bits.c and try to make it work on my NI6259 
 board. For scan_begin_src=TRIG_EXT   I need to choose scan_begin_arg = 28 
 (which is kCDO_Update_Source_SelectG0_Out in the NI documentation, and 
 NI_CDIO_SCAN_BEGIN_SRC_G0_OUT in the comedi.h file).
 
When running cmd_bits.c in this way and monitoring the DO channels on an 
 oscilloscope, the DO switches to HIGH when the acquisition is triggered 
 (i.e., the value of the first element in the FIFO), but the FIFO is not 
 processed any further, i.e., not emptied. If I DO NOT run the counter-clock 
 above, the DO does not even switch to HIGH. I also checked whether 28 is the 
 right value for scan_begin_arg by trying a wide range of values, but only for 
 scan_begin_arg = 28 I get the DO bit switched to HIGH at the beginning of the 
 acquisition.
 
   In Comedi, the cmd.flags is set to CMDF_WRITE for such externally triggered 
 acquisitions, which I tried, but it did not help.
 
   Thus, it appears that I still have a problem in processing the FIFO, 
 despite it appears that all other things are now correctly connected (Comedi 
 has an example do_waveform.c, which is pretty much what I try to use for 
 testing in my own code).
 
   Would you have any thoughts on what might go wrong? It looks like we are 
 just a tiny bit away from succeeding with cmd_bits.c on my board.
 

I had time to have a look at your problem. Unfortunately, I do not
have any solution. I just have some questions you may find stupid:

- Did you try to invert the sample clock polarity by setting the flag
  CR_INVERT in the command field scan_begin_arg?
- Which frequencies did you generate with the counter subdevice? Even
  the lowest one did nothing (Something like 10Hz)?
- Did you try to send 0 with cmd_bits ? Just to check that the DO stay
  to LOW, which would mean that the values (or at least the first one)
  are properly loaded into the device.
- So far, cmd_bits always sends the same value (the one you passed as
  argument); we should modify it so that the complement value is
  written every two samples. That would allow us to physically check
  how many samples are played by the DO. 

 Best wishes,
 
 -Stefan
 
 
 
 
 
 On Jul 14, 2010, at 17:46, Stefan Schaal wrote:
 
  Hi Alexis,
  
   in the Comedi examples 
  (http://www.comedi.org/download/comedilib-0.8.1.tar.gz, the do_waveform.c 
  example), they suggest to use a general purpose counter as clocking input 
  to a cmd-based DIO acquisition. This seems to be the signal 
  kCDO_Update_Source_SelectG0_Out= 28 from the enum you found 
  in the NI documentation.
  
  For this purpose, the counter needs to be configured and triggered. Does 
  Analogy already have the functionality to do such operations? The Comedi 
  libraries have an example for this, too, in gpct_pulse_generator.c, just 
  that this example uses a variety of function calls that I cannot directly 
  map to the current Analogy functionality.
  
  Or, do you happen to know whether there is another, easier to access, clock 
  source?
  
  Best wishes,
  
  -Stefan
  
  
  On Jul 14, 2010, at 14:03, Alexis Berlemont wrote:
  
  Stefan Schaal wrote:
  Hi Alexis,
  
  maybe it is more useful to mention what I actually want to achieve with 
  DIO on my NI6259.  My DIO communication involves a series of interactions 
  with another board to collect sensory data from a robot, and to send out 
  commands to this board. For instance, to read one of the sensors, a 
  sequence of DIO values need to be written to tell the board to send the 
  data. I programmed this initially with synchronous instructions using 
  a4l_sync_dio(), but this turns out to be too slow. Thus, the hope is to 
  use commands, i.e., fill the FIFO with the sequence of values which I 
  need to execute, and then use asynchronous DIO to obtain much higher 
  speed of communicating the values in the FIFO.
  
   Thus, what I essentially try to do is to put about 10-20 scans in the 
  FIFO, and then write the FIFO as fast as possible to my NI6259 DIO 
  subdevice.
  
  Would you have any ideas how to do this fast writing of the scans in the 
  FIFO with the current analogy functionality?
  
  Right now, I don't know. I think your idea of using DIO commands may
  be suitable (I don't know your timing constraints). So what not
  proceeding ?
  
  Thanks a lot!
  
  -Stefan
  
  
  On Jul 12, 2010, at 22:51, Stefan Schaal wrote:
  
  

Re: [Xenomai-core] analogy - experimental branch

2010-07-19 Thread Stefan Schaal
Hi Alexis,

  as usually, we are more than grateful that you are willing to spend time on 
this issue. Here are answers to your questions:

1) I tried CR_INVERT -- no success
2) I tried very slow frequencies like 10Hz in the counter clock (which is 
nicely visualized on my oscilloscope) -- no success
3) I tried to send a 0 with cmd_bits -- and interestingly, this ALSO takes my 
DIO line high (sorry, I thought I had tested this before). This would indicate 
that we do not access the FIFO at all?
4) I have my own test program to send alternating 0x and 0x0 values to 
the devices to generate a square wave on the oscilloscope. I cannot see 
anything of the square wave executed.

Best wishes,

-Stefan


On Jul 19, 2010, at 15:01, Alexis Berlemont wrote:

 Hi,
 
 Sorry for answering late. 
 
 Stefan Schaal wrote:
 Hi Alexis,
 
  I managed to port some of the Comedi examples to Analogy. In particular, I 
 could configure one of my counter subdevices to become a high frequency 
 clock, following the gpct_pulse_generator.c example. I routed the output of 
 the clock to my PFI0 pin, and could visualize the signal on an oscilloscope. 
 Thus, I know have the clock I need to trigger CMD-based DIO, as you 
 suggested. (I will post some sample code of this in the near future after 
 all is cleaned up).
 
   Next, I went back to cmd_bits.c and try to make it work on my NI6259 
 board. For scan_begin_src=TRIG_EXT   I need to choose scan_begin_arg = 28 
 (which is kCDO_Update_Source_SelectG0_Out in the NI documentation, and 
 NI_CDIO_SCAN_BEGIN_SRC_G0_OUT in the comedi.h file).
 
   When running cmd_bits.c in this way and monitoring the DO channels on an 
 oscilloscope, the DO switches to HIGH when the acquisition is triggered 
 (i.e., the value of the first element in the FIFO), but the FIFO is not 
 processed any further, i.e., not emptied. If I DO NOT run the counter-clock 
 above, the DO does not even switch to HIGH. I also checked whether 28 is the 
 right value for scan_begin_arg by trying a wide range of values, but only 
 for scan_begin_arg = 28 I get the DO bit switched to HIGH at the beginning 
 of the acquisition.
 
  In Comedi, the cmd.flags is set to CMDF_WRITE for such externally triggered 
 acquisitions, which I tried, but it did not help.
 
  Thus, it appears that I still have a problem in processing the FIFO, 
 despite it appears that all other things are now correctly connected (Comedi 
 has an example do_waveform.c, which is pretty much what I try to use for 
 testing in my own code).
 
  Would you have any thoughts on what might go wrong? It looks like we are 
 just a tiny bit away from succeeding with cmd_bits.c on my board.
 
 
 I had time to have a look at your problem. Unfortunately, I do not
 have any solution. I just have some questions you may find stupid:
 
 - Did you try to invert the sample clock polarity by setting the flag
  CR_INVERT in the command field scan_begin_arg?
 - Which frequencies did you generate with the counter subdevice? Even
  the lowest one did nothing (Something like 10Hz)?
 - Did you try to send 0 with cmd_bits ? Just to check that the DO stay
  to LOW, which would mean that the values (or at least the first one)
  are properly loaded into the device.
 - So far, cmd_bits always sends the same value (the one you passed as
  argument); we should modify it so that the complement value is
  written every two samples. That would allow us to physically check
  how many samples are played by the DO. 
 
 Best wishes,
 
 -Stefan
 
 
 
 
 
 On Jul 14, 2010, at 17:46, Stefan Schaal wrote:
 
 Hi Alexis,
 
 in the Comedi examples 
 (http://www.comedi.org/download/comedilib-0.8.1.tar.gz, the do_waveform.c 
 example), they suggest to use a general purpose counter as clocking input 
 to a cmd-based DIO acquisition. This seems to be the signal 
 kCDO_Update_Source_SelectG0_Out= 28 from the enum you found 
 in the NI documentation.
 
 For this purpose, the counter needs to be configured and triggered. Does 
 Analogy already have the functionality to do such operations? The Comedi 
 libraries have an example for this, too, in gpct_pulse_generator.c, just 
 that this example uses a variety of function calls that I cannot directly 
 map to the current Analogy functionality.
 
 Or, do you happen to know whether there is another, easier to access, clock 
 source?
 
 Best wishes,
 
 -Stefan
 
 
 On Jul 14, 2010, at 14:03, Alexis Berlemont wrote:
 
 Stefan Schaal wrote:
 Hi Alexis,
 
 maybe it is more useful to mention what I actually want to achieve with 
 DIO on my NI6259.  My DIO communication involves a series of interactions 
 with another board to collect sensory data from a robot, and to send out 
 commands to this board. For instance, to read one of the sensors, a 
 sequence of DIO values need to be written to tell the board to send the 
 data. I programmed this initially with synchronous instructions using 
 a4l_sync_dio(), but this turns out to be too slow. Thus, the