This solution sounds cool.

Did you try it with a real case ?

I would like to run some real working code based on this idea. If you have some 
code ready to run, can you post it ? Otherwise we can collaborate to develop 
some working code and test it.

Best regards,
Giovanni


spargelzack <[EMAIL PROTECTED]> wrote:                                  (sorry 
if this shows up twice, i'm not familiar with the yahoo groups
 interface yet)
 
 Hi Everybody
 
 I found a cheap + fast solution for using servos with the foxboard.
 
 First, there is a way to use the i/o lines not described on the
 acmesystems website (it's well known on the axis developer website
 though). You can use write() on Ports A+B after proper initialization.
 
 The Clock interval is around 5 us, so you have to pass about 4000
 values for a full 2ms period.
 
 But as i found out, the 20ms interval isn't all that important. What
 matters is the length of the pulse.
 
 So, here's my code:
 
 --
 #include <stdio.h>
 #include "stdlib.h"
 #include "unistd.h"
 #include "sys/ioctl.h"
 #include "fcntl.h"
 #include <sys/time.h>
 #include <asm/etraxgpio.h>
 
 int main(int argc, char **argv){
         int fd;
         int i;
         int pos;
         unsigned char mask;
         unsigned char period[4000];
 
 if(argc > 1)
                 pos = atoi(argv[1]);
         else
                 pos = 100;
 
 // better use memset() here, but this is proof-of-concept code
         for(i=0; i<pos+1; i++){
                 if(pos > i)
                         period[i] = 0xFF;
                 else
                         period[i] = 0;
         }
 
 fd = open("/dev/gpiob", O_RDWR);
 
 if(!fd){
                 printf("open error\n");
                 exit(-1);
         }
 
 mask = 1<<6 | 1<<7; // use pins PB6 and PB7 according to the
 fox pinout
 
 // prepare for write()
         if(ioctl(fd, _IO(ETRAXGPIO_IOCTYPE, IO_CFG_WRITE_MODE),
 IO_CFG_WRITE_MODE_VALUE(1, mask, 1<<1))){
                 perror("ioctl error");
                 exit(-1);
         }
 
 for(;;){
                 write(fd, &period, pos+1); // write the pulse,
 followed by a zero to set the output
                 usleep(5000); // let the CPU breathe a bit..
         }
 }
 --
 
 This only works with ports A and B, not with the G line.
 
 Supply any value between 100 and 400 as first argument to set the
 position of two servos connected to PB6 and PB7.
 
 example:
 
 ./motor 180
 
 This uses LESS THAN 1% CPU when running.
 
 This is proof of concept code, so it's UGLY AND NOT USEFUL OUT OF THE
 BOX. Also, my english sucks a bit.
 
 --- In [email protected], "zooltheno1" <[EMAIL PROTECTED]> wrote:
 >
 > Hi
 > I want to use RC-Servos with the Foxboard, the normal interfall is
 > 1-2ms and 20ms pause. 
 > I tried to use udelay for the delay, put the minimum is 40ms,
 > which is far to slow, even normal AC is faster.
 > How could I get the nesasery delay without 100% CPU load ?
 > 
 > Bye
 > Ralph
 >
 
 
     
                       


------------------------------------------------
Resources are limited, Imagination is unlimited.
 
---------------------------------
Want to start your own business? Learn how on Yahoo! Small Business.

[Non-text portions of this message have been removed]

Reply via email to