|
|
View previous topic :: View next topic |
Author |
Message |
Einly
Joined: 10 Sep 2003 Posts: 60
|
How to achieve faster communication |
Posted: Wed Jun 02, 2004 8:09 pm |
|
|
Dear all,
I am using pic16f876 to receive data from AD7716. Below is some of my command line:
byte chan[16];
for(i=0;i<128;i++)
{
output_high(SCLK);
delay_cycles(1);
output_low(SCLK);
shift_left(chan0,16,input(SDATA));
}
When I check with the oscilloscope, I notice that it takes me quite a lot of time to execute the whole for loop (more than 1ms). I notice that time taken for the command shift_left is the problem. May I know:
1) How can I check the time taken for each command, e.g. output_high, shift_left?
2) I would like to shift in 128 bits from the adc? How can I maximize the speed? Is there any other way so that I can shift in all the bits in a faster way? What is the fastest way to do this?
Thanks for your reply.
Einly _________________ Einly |
|
|
Hans Wedemeyer
Joined: 15 Sep 2003 Posts: 226
|
|
Posted: Wed Jun 02, 2004 9:14 pm |
|
|
Try about using hardware the SPI ?
You did not tell us the speed of you oscillator !
If you are running it at 20MHz the SPI can do as fast as 5MHz..... |
|
|
Haplo
Joined: 06 Sep 2003 Posts: 659 Location: Sydney, Australia
|
|
Posted: Wed Jun 02, 2004 10:39 pm |
|
|
How about something like this, it should be much faster:
Code: | byte bit_pattern={1,2,4,8,16,32,64,128};
byte i,j;
byte chan[16];
for(i=16;i>0;i--)
{
chan[i-1]=0
for(j=8;j>0;j--)
{
output_high(SCLK);
delay_cycles(1);
output_low(SCLK);
if (input(SDATA))
chan[i-1]|=bit_pattern[j-1];
}
} |
|
|
|
Ttelmah Guest
|
Re: How to achieve faster communication |
Posted: Thu Jun 03, 2004 2:36 am |
|
|
Einly wrote: | Dear all,
I am using pic16f876 to receive data from AD7716. Below is some of my command line:
byte chan[16];
for(i=0;i<128;i++)
{
output_high(SCLK);
delay_cycles(1);
output_low(SCLK);
shift_left(chan0,16,input(SDATA));
}
When I check with the oscilloscope, I notice that it takes me quite a lot of time to execute the whole for loop (more than 1ms). I notice that time taken for the command shift_left is the problem. May I know:
1) How can I check the time taken for each command, e.g. output_high, shift_left?
2) I would like to shift in 128 bits from the adc? How can I maximize the speed? Is there any other way so that I can shift in all the bits in a faster way? What is the fastest way to do this?
Thanks for your reply.
Einly |
Really the best way to calculate the times, is to look at the assembler listing. You can though also use the MPLAB simulator to step through routines like this and find out what is going on.
Now you don't say the processor clock rate (critical lacking data!...). The time taken for the 'output_high', and 'output_low', will depend on what I/O mode is seected for the port. The fastest mode is to use #fast_io, set the pins as an output and an input respectively, and these instructions are then just simple single instructions on the processor. The shift will involve the shifting each byte in turn, and handling the carry. The loop itself, will involve the incrementing of the byte, subtracting 128, testing for carry, and jumping if required.
Your loop will be slightly faster, if you count down from 128 to 0, but the change will only be a couple of instructions. It is the operation of shifting 16 bytes for every incoming bit that is the 'killer'.
You will therefore get more speed with:
[code]
byte chan[16];
int8 * addr;
int i,j;
j=0;
addr=&char[j];
do {
for(i=8;i;i--)
{
output_high(SCLK);
delay_cycles(1);
output_low(SCLK);
shift_left(addr,1,input(SDATA));
}
addr++;
j++;
}
while (j<16);
[code]
I'd have to sit down and work out which way the counters need to be, to get the bits in the right order (the above is only a guess...).
The key points are that only one byte is being rotated inside the data transfer loop. The address changes in the outer loop, and the change is done by simply incrementing the pointer (which is more efficient than looking us the address of an array element each time).
Combine this with using fast_io, and I'd expect a total time perhaps 1/4 your current figure.
Seperately, it is worth realising, that the entire inner loop, can be replaced using the SPI hardware, which does exactly this operation, at a maximum rate just 1/4 the incoming processor clock.
Best Wishes |
|
|
Einly
Joined: 10 Sep 2003 Posts: 60
|
Do you have example code of how to do hardware spi? |
Posted: Sun Jun 06, 2004 9:31 pm |
|
|
Dear all,
Thanks for your reply. I am using 20MHz processor clock. I would like to know can anyone give me some lines of how to do hardware spi? _________________ Einly |
|
|
Haplo
Joined: 06 Sep 2003 Posts: 659 Location: Sydney, Australia
|
|
Posted: Sun Jun 06, 2004 10:31 pm |
|
|
Take a look at the file ex_spi.c in the \Examples directory. |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|