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]