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 support@ccsinfo.com

[SOLVED] Trouble interfacing PIC16F1509 with AD5263

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



Joined: 01 Mar 2010
Posts: 73

View user's profile Send private message

[SOLVED] Trouble interfacing PIC16F1509 with AD5263
PostPosted: Mon May 24, 2021 1:17 pm     Reply with quote

Hi all. Well, it's happened again. I've spent a full week trying to get something simple to happen and I can't seem to figure it out so I'm here. I'm using compiler V4.140. I'm trying to get my PIC16F1509 to change the AD5263 digipot value but I can't get anything to happen.

From what I can tell, the PIC is doing everything I've told it to do. Here's how I'm configuring the SPI:

Code:

#include <16f1509.h>
#fuses HS, NOWDT, NOLVP, PROTECT
#device ICD=TRUE
#device ADC=10
#use delay(clock=16000000, int)
#use rs232(UART1, baud=31250,parity=N,stop=1,bits=8, ERRORS)
#use spi(MASTER, IDLE=0, SAMPLE_RISE, SPI1, FORCE_HW, ENABLE=PIN_C6, STREAM=STREAM1, BAUD=400000)


This is how it looks on my scope. This looks good and normal to me but what is throwing me off a little bit is how the CS pin is low waaaay before the CLK starts getting generated which seems at odds with the timing diagram in the AD5263. see that here:

It seems from the datasheet that CLK isn't supposed to go low until the CLK is already doing it's thing? I don't know, I'm probably grasping at straws here but I'm at a point where I've read the datasheets many times and this seems to be the only thing I can find where there could be an issue. Anyway, just wanted to see if anyone knows or has any advice as to how to move forward. I also have a support email in with Analog Devices.


Last edited by picj1984 on Wed May 26, 2021 1:08 pm; edited 2 times in total
PCM programmer



Joined: 06 Sep 2003
Posts: 21477

View user's profile Send private message

PostPosted: Mon May 24, 2021 1:53 pm     Reply with quote

Show us your code that is doing the spi_xfer() to the AD chip.
Show us the whole loop code.
picj1984



Joined: 01 Mar 2010
Posts: 73

View user's profile Send private message

PostPosted: Mon May 24, 2021 2:07 pm     Reply with quote

the stuff commented out is just random things I've been trying to try and get something to happen.

From what I can tell, it's impossible to get spi_xfer to do anything besides a multiple of 8 bits (even though it lets you put in, say 10 bits, which is what the AD5263 wants).

Anyway, all that shouldn't be an issue because according to the AD5263 datasheet if you send 16 bits it'll just ignore the first 6 bits after CS comes back high (or at least that's how I'm interpreting it).

Code:

while(1)
{


//spi_xfer(STREAM1,0b0011111111,10);
//spi_xfer(STREAM1,0b0000000010101010,16);
//spi_xfer(STREAM1,0b0000001111111111,16);

//spi_xfer(STREAM1,0b000000000000000000000011,24);
spi_xfer(STREAM1,0,10);


delay_ms(1000);

}
}


I'm just sending a "zero" as my data because I'm trying to get something to happen at address 0, but I can never get it to change to anything besides the midpoint it boots up at (~25k... half of the 50k pot i'm using).
PCM programmer



Joined: 06 Sep 2003
Posts: 21477

View user's profile Send private message

PostPosted: Mon May 24, 2021 2:54 pm     Reply with quote

Try doing it like this, with the changes shown in bold below:
Quote:
#use spi(MASTER, BITS=10, FORCE_SW, IDLE=0, SAMPLE_RISE, SPI1, ENABLE=PIN_C6, STREAM=STREAM1, BAUD=400000)

//=====================================
void main()
{

while(TRUE)
{
spi_xfer(STREAM1, 0b0010101010, 10);
delay_ms(1000);
}

}

Make sure the FORCE_HW is removed.
picj1984



Joined: 01 Mar 2010
Posts: 73

View user's profile Send private message

PostPosted: Mon May 24, 2021 3:38 pm     Reply with quote

OK I just tried that I am indeed seeing 10 bit transfers on the scope now. Very cool. Still, the resistance on the 0 address of AD5263 is just staying the same. I think I need to take another look at the hardware / connections but if you have anything else you think I should try on the PIC end of things let me know.
PCM programmer



Joined: 06 Sep 2003
Posts: 21477

View user's profile Send private message

PostPosted: Mon May 24, 2021 6:03 pm     Reply with quote

Can you post a schematic ?
What are your connections to all the pins on the AD5263 ?
Ttelmah



Joined: 11 Mar 2010
Posts: 17322

View user's profile Send private message

PostPosted: Mon May 24, 2021 11:43 pm     Reply with quote

spi_xfer can send any number of bits you want. _Provided you use software
SPI
_. The point is the PIC hardware SPI port can only send multiples
of eight bits.
Now honestly the easiest way to get 10 bits then is to use software SPI.
I'd also operate CS myself rather than using the ENABLE setting.
This also then means that the PIC SDI pin becomes available to do
something else.
So:
Code:

#include <16f1509.h>
#fuses HS, NOWDT, NOLVP, PROTECT
#device ICD=TRUE
#device ADC=10
#use delay(clock=16000000, int)
#use rs232(UART1, baud=31250,parity=N,stop=1,bits=8, ERRORS)

#define CLOCK PIN_B6
#define DATA_OUT PIN_C7
#define SELECT PIN_C6

#use spi(MASTER, DO=DATA_OUT, CLK=CLOCK, BITS=10, FORCE_SW, MODE=0, STREAM=STREAM1, BAUD=400000)

//=====================================
void main()
{
   output_high(SELECT);
   delay_ms(10);
   while(TRUE)
   {
       output_low(SELECT); //select the chip
       spi_xfer(STREAM1, 0b0010101010, 10);
       output_high(SELECT);
       delay_ms(1000);
   }
}


Now this is to address channel 0, and assumes that DIS pin is pulled low.

To use the hardware SPI, has the disadvantage of wasting the SDI pin on
the PIC, and then means you would have to do 16bit transfers with the
required data as the last ten bits sent for the transfer.
picj1984



Joined: 01 Mar 2010
Posts: 73

View user's profile Send private message

PostPosted: Wed May 26, 2021 1:10 pm     Reply with quote

It was a very, very dumb hardware thing. There's a reset pin on the AD5263 that I thought had a pull-up on it but it needed to be tied high. I *really* appreciate y'all helping me and am pleased with how much I've learned about SPI (specifically the software options) through this frustration. Thank you so so much.
Ttelmah



Joined: 11 Mar 2010
Posts: 17322

View user's profile Send private message

PostPosted: Wed May 26, 2021 11:11 pm     Reply with quote

Good. At least you got there once PCM pointed out how to get 10bit operation.
It sounded like a hardware problem. Lesson is to never 'assume' pins will
pull up/down....
picj1984



Joined: 01 Mar 2010
Posts: 73

View user's profile Send private message

PostPosted: Thu May 27, 2021 1:00 pm     Reply with quote

Ttelmah wrote:
Good. At least you got there once PCM pointed out how to get 10bit operation.
It sounded like a hardware problem. Lesson is to never 'assume' pins will
pull up/down....


yes, and a very good lesson indeed.
picj1984



Joined: 01 Mar 2010
Posts: 73

View user's profile Send private message

PostPosted: Tue Jun 22, 2021 3:02 pm     Reply with quote

Ttelmah wrote:
Good. At least you got there once PCM pointed out how to get 10bit operation.
It sounded like a hardware problem. Lesson is to never 'assume' pins will
pull up/down....


I've got one more question on this... I guess I just assumed that it was pretty much always preferable to use these types of things in "hardware" mode (thinking it makes things easier on the PIC somehow with performance)... what (if any) are the downsides to using it in "software" mode... apologies in advance if this is documented elsewhere I just thought I'd ask. Thx!!
temtronic



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

View user's profile Send private message

PostPosted: Tue Jun 22, 2021 4:11 pm     Reply with quote

'bit banging' aka 'software mode' will usually not allow you interrupt capability, unless you play 'tricks' and even then, you're tying up the PIC to do 100% of the 'timing' needed for bits and bytes....
Depending on the hardware peripheral there may be other features you can't access..
Ttelmah



Joined: 11 Mar 2010
Posts: 17322

View user's profile Send private message

PostPosted: Thu Jun 24, 2021 12:14 am     Reply with quote

However (as is seen here), the software modes will often give extra
features (for example the ability to generate 'open collector' drives on
RS232, on chips that don't offer this), and in many cases the costs will
be tiny.
However the problems/costs are much more significant on asynchronous
communications than on synchronous. So I2C, and SPI, do not 'mind'
a momentary break in things on the master. However RS232 does. Then
the receive operations for these, are almost impossible to handle without
the hardware.
temtronic



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

View user's profile Send private message

PostPosted: Thu Jun 24, 2021 4:46 am     Reply with quote

hmm, reminds me of an early Microchip apnote using a small PIC in a 'mouse'. No HW UART in the small PIC, so 'bitbanging' was the only way.
What was clever, was the use of the 'dead time' between the rising edge and falling edge of a 'bit', to check the status of the left and right buttons, embed the result into the byte going to the PC.
Normally you'd set the pin high, run a delay loop, then set the pin low. The programmer found a way to do 'other stuff' instead of just wasting time.
It does requires knowledge of instruction set timings, it does show that sometimes 'bit banging' can be more useful than using an internal peripheral depending on the application.
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