(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
>


Reply via email to