View previous topic :: View next topic |
Author |
Message |
Stiffyisworking
Joined: 03 Feb 2012 Posts: 4
|
Some problems to create a virtual table |
Posted: Sat Feb 18, 2012 12:47 pm |
|
|
Hey everybody !
I have a small problem I need your help. I need to create a virtual table in a PIC18F4580, globally receive information with my MUX (8 inputs coded into 8bits analogical information). And with my PIC18F4580 I choose each IN (from IN1 to IN8) from my MUX (MCP508), then each information need to be converted into Digital and put in a virtual table. But I don't know to create it, or how it works. I've never done that.
Here is my main program until yet :
Code: |
#include<18F4580.h>
#use delay (clock=4000000)
#define A0 PIN_A0
#define A1 PIN_A1
#define A2 PIN_A2
#define SS PIN_A6 // this introduce my TLC3545 to start the conversion
int a;
Void main(void)
// décodage 8 entrée analogique
{
while(a<8)
{
output_low(A0); // the different output value allowed to choose different IN on the MULTIPLEX for example the adress is A0=A1=A2= 0 so it select IN1
output_low(A1);
output_low(A2);
delay_ms(2);
output_low(SS);
delay-ms(2);
}
{
output_high(A0); // and if the adress is A0=1 ; A1=A2=0 so @=1 it select IN2 and it continu until IN8
output_low(A1);
output_low(A2);
delay_ms(2);
output_low(SS);
delay-ms(2);
}
{
output_low(A0);
output_high(A1);
output_low(A2);
delay_ms(2);
output_low(SS);
delay-ms(2);
}
{
output_high(A0);
output_high(A1);
output_low(A2);
delay_ms(2);
output_low(SS);
delay-ms(2);
}
{
output_low(A0);
output_low(A1);
output_high(A2);
delay_ms(2);
output_low(SS);
delay-ms(2);
}
{
output_high(A0);
output_low(A1);
output_high(A2);
delay_ms(2);
output_low(SS);
delay-ms(2);
}
{
output_low(A0);
output_high(A1);
output_high(A2);
delay_ms(2);
output_low(SS);
delay-ms(2);
}
{
output_high(A0);
output_high(A1);
output_high(A2);
delay_ms(2);
output_low(SS);
delay-ms(2);
}
} |
Please help me ! _________________ Impossible is nothing |
|
|
Mike Walne
Joined: 19 Feb 2004 Posts: 1785 Location: Boston Spa UK
|
Virtual table |
Posted: Sun Feb 19, 2012 2:36 am |
|
|
Hi.
You've had lots of views and no response.
It could be that nobody understands your question.
It seems silly to me that you generated code without much idea of where you were going.
I, for one, do not know what you mean by a virtual table.
Perhaps you could enlighten me?
Mike |
|
|
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Sun Feb 19, 2012 3:54 am |
|
|
It seems like the OP wanted to say that he has no clue how to operate the TLC3545 SPI interface, because there's only an output_low(SS) statement, but no 16 Bit SPI read and output_high(SS) afterwards. |
|
|
Stiffyisworking
Joined: 03 Feb 2012 Posts: 4
|
|
Posted: Sun Feb 19, 2012 8:45 am |
|
|
FvM wrote: | It seems like the OP wanted to say that he has no clue how to operate the TLC3545 SPI interface, because there's only an output_low(SS) statement, but no 16 Bit SPI read and output_high(SS) afterwards.
|
That's it ! I really have no clue how to operate the SPI interface of my TLC3545.
My PIC18f4580 as 3 different pins that I want to to use, but I'm not sure that it's done.
I have the : -SDO that is connected to the SOD of my TLC3545
-SCL that is connectec to the SCLK of my TLC3545
-But where does the SDI of my PIC go ? because I think that normally the SOD of my TLC3545 must be connected to that no ?
And then read the SDI pin ?
So if for one instruction for example I should do that is it ok ?
Code: |
#include<18F4580.h>
#use delay (clock=4000000)
#define A0 PIN_A0
#define A1 PIN_A1
#define A2 PIN_A2
#define SS PIN_A6
int a ;
Void main(void)
{
while(a<8)
{
output_low(A0);
output_low(A1);
output_low(A2);
delay_ms(2);
output_low(SS);
delay-ms(2);
// HERE is the problem I don't know how to make the PIC read the data that comes from my TLC3545
output_high(SS); // AD Chip select high to stop AD sending
return result;
}
|
Have you some idea ? Please can you give me an example because I'm a little confused. _________________ Impossible is nothing |
|
|
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Sun Feb 19, 2012 10:27 am |
|
|
SDO of the ADC has to be connected to SDI of the PIC, the PIC SPI clock output pin is named SCK. When using the hardware SPI interface, SDO has to be reserved as well, although not used with TLC3545. For the chip select function (SS at the ADC) any PIC pin can be used, not necessarily SS.
Alternatively CCS software SPI mode can be used with any combination of pins, but it's slower than hardware SPI.
Examples for SPI operation can be found with the CCS compiler, e.g. in the various SPI device drivers. |
|
|
Stiffyisworking
Joined: 03 Feb 2012 Posts: 4
|
|
Posted: Sun Feb 19, 2012 12:36 pm |
|
|
Code: |
#include<18F4580.h>
#use delay (clock=4000000)
#define A0 PIN_B0
#define A1 PIN_B1
#define A2 PIN_B4
#define SDO PIN_C5 //SPI_OUT RC5_bit /* Define SPI SDO signal to be PIC port RC5 */
#define SDI PIN_C4 //SPI_IN RC4_bit /* Define SPI SDI signal to be PIC port RC4 */
#define SCL PIN_C3 //SPI_CLK RC3_bit /* Define SPI CLK signal to be PIC port RC3 */
#define SS PIN_A5 //SPI_CS RA5_bit /* Define SPI CS signal to be PIC port RA5 */
int a;
Void main(void)
{
while(a<8)
{
output_low(A0);
output_low(A1);
output_low(A2);
delay_ms(2);
output_low(SS); // Falling Edge enable the CS input initiates the cycle.
delay_ms(2);
setup_spi(spi_master |spi_l_to_h | spi_clk_div_16 );
( !spi_data_is_in() && input(PIN_C4) );
if( spi_data_is_in() )
SPI_READ (SDI);
output_high(SS); // AD Chip select high to stop AD sending.
}
} |
If I do that is that RIGHT ? _________________ Impossible is nothing |
|
|
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Sun Feb 19, 2012 4:50 pm |
|
|
Two comments:
- setup_spi() needs to be performed only once at the begin of the application.
- A SPI master don't need to use spi_data_is_in(). It only should do two calls of spi_read(). All necessary timing is done inside the function. Then the bytes can be assembled by make16().
Code: | int8 bh,bl;
int16 result;
output_low(SS);
// no delay required
bh=spi_read();
bl=spi_read();
// shift right to get a 14-bit value
result = make16(bh,bl)>>2;
output_high(SS); |
|
|
|
|