CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

transferring data b/w two PICs at fast rate

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
engg_sajjad



Joined: 01 Sep 2014
Posts: 1
Location: Islamabad

View user's profile Send private message

transferring data b/w two PICs at fast rate
PostPosted: Mon Sep 01, 2014 11:17 am     Reply with quote

dear,
There is a master device PIC18F4520 and a slave device PIC16F690. The slave has to take data from ADC at 32K-sample/sec through SPI, and send this to master device. Each sample consist of 3 byte. There are four bit connected b/w two PIC and a sample_ready_interrupt and a nibble_ready_interrupt, connected to INTR2 and INTR0 of master PIC. So, 3 bytes are transferred using 6 interrupts at INTR0 and single interrupt at INTR2. The master has to dump all the received data to memory through SPI. Master Crystal= 40M and Slave = 20M.
Problem: In the master code, i am just buffering the received data. but still missing the data. any ideas?
_________________
sajjad
Ttelmah



Joined: 11 Mar 2010
Posts: 19520

View user's profile Send private message

PostPosted: Mon Sep 01, 2014 11:59 am     Reply with quote

Big change.

Use the interrupt flag, not the interrupt.

Problem is that calling an interrupt handler in the PIC takes a lot of time. Typically about 30 instructions to get into and out of the handler. Even if you don't use CCS's code and go DIY, perhaps half of this is necessary/inherent....

If instead you poll the interrupt bit, you can respond in a couple of instructions. You can also preload the table pointers, and do a direct byte write to the indf register, and just increment the pointer.
temtronic



Joined: 01 Jul 2010
Posts: 9229
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Mon Sep 01, 2014 5:02 pm     Reply with quote

If I'm reading this post right you're 'breaking' up the 3 bytes of data in 6 nibbles to transfer.

Have you 'done the math' to see if a simpler serial interface might be faster? While only one wire, it would eliminate the 'breaking up'
of the data in the Slave PIC AND the 'reconstruction' of the data in the Master PIC. You should be able to get 1Megabaud PIC to PIC,maybe faster depending on clocks and wiring.

just a thought

jay
Ttelmah



Joined: 11 Mar 2010
Posts: 19520

View user's profile Send private message

PostPosted: Tue Sep 02, 2014 2:14 am     Reply with quote

Agreed. The extra lines are just adding complexity.
The PIC SPI hardware 'knows' when a byte arrives. So just have the CS line triggering the jump to the receive code (one interrupt only), and then pump three bytes one after the other to the slave. All the slave does, is polls the SPI receive interrupt. Then either preload the array indexes as already mentioned, or (fastest way), use fixed indexes for the three bytes. So array[0], array[1], array[2]. With a fixed index, the code can do a single byte transfer to the location in only a couple of machine cycles. As soon as you use a 'variable' to do the access, this rises massively....

I have a couple of old systems that have been running for years, using PIC's at only 8MHz, and merrily 'burst transfer' 16 byte data blocks between the PIC's at 2Mbps, taking just on 1/10000th second to transfer the whole block. Key to the whole thing though is a single signal from the master to say 'block coming', a pause just long enough for the worst case interrupt latency on the slave, and then the direct transfer of 16bytes through the SPI hardware. The master uses an array and index, which slows it enough for the slave using fixed indexes (state machine), to save the data as it comes. Just fractionally over 160KBps, through processors at 2MIPS, versus the 5MIPS for the slowest processor here.

It is a matter of understanding the limitations, and also the capabilities of the hardware.
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
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