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

Problem with I2C and delay functions in PIC24FJ64GA306

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



Joined: 20 Jul 2011
Posts: 375

View user's profile Send private message

Problem with I2C and delay functions in PIC24FJ64GA306
PostPosted: Fri May 10, 2013 7:06 am     Reply with quote

Hi! I have PIC24FJ64GA306 connected to a sensor through I2C. I`ve used the sensor before with PIC18F2550, so I have no dоubt in the firmware. PIC24FJ64GA306 is working on 3.3V so I made a MOSFET bridge as the I2C datasheet says. So when I turn on the debugger I successfully intialize the sensor and read data, but when I tried to read data again the controller blocks on the first delay_ms(1) instruction.
Code:

#include <24FJ64GA306.h>
#FUSES HS,NOWDT
#use delay(clock=20M)
#use I2C(MASTER,I2C1,SCL=PIN_G2,SDA=PIN_G3)

int ReadData()
{
   
   status=0;
   i2c_start();
   status=i2c_write(sensorAddressWrite);
   status=i2c_write(0x00);
   i2c_stop();
   delay_ms(1);
        ..........
        //instructions for reading data


Any ideas what`s happening here? Is there anyking of "misunderstanding" between I2C and delay()?
Thanks!
temtronic



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

View user's profile Send private message

PostPosted: Fri May 10, 2013 7:32 am     Reply with quote

I don't use the 24 series but...

1) do you need to first define the 'pin selects' for your use ? newer PICs have 'programmable pins..is yours one of them ?

2) have you tried PCMP's i2c scanner program ? it'll confirm/deny hardware is correct !!

3) why the delay ? if removed does the program run fine
?


hth
jay
stoyanoff



Joined: 20 Jul 2011
Posts: 375

View user's profile Send private message

PostPosted: Fri May 10, 2013 10:07 am     Reply with quote

I don`t need to define CS. The sensor doen`t have SC. When I load I2C scanner, it finds the sensor, but after that it blocks and it can`t do the command i2c_stop() even without delays. What can cause this?
jeremiah



Joined: 20 Jul 2010
Posts: 1355

View user's profile Send private message

PostPosted: Fri May 10, 2013 3:13 pm     Reply with quote

I've not used that specific chip before, but have used many of that family (pic24fjxxgaxxx of various types).

Somethings I have found:

1. Check the silicon chip errata for your chip. A lot of these had issues with I2C, though I don't know about yours specifically.

2. On the PIC24fj64ga106, I had to use FORCE_SW on one of my I2C ports to get it to work with an EEPROM.

3. On the PIC24fj64ga004, I had to do some additional line manipulation outside the normal i2c calls to get it to work in slave mode.

That's all that comes to mind at the moment.



EDIT: in terms of blocking, what I find causing that most often is the assembly waiting for a line to change state that never does. Take a look at the assembly for each of the i2c instructions.

Also, he wasn't meaning CS, but "pin select" which is something different. However, on that family most don't need that as I2C is still on dedicated pins (uart and spi, however, typically need the pin select)
Ttelmah



Joined: 11 Mar 2010
Posts: 19545

View user's profile Send private message

PostPosted: Sat May 11, 2013 12:29 am     Reply with quote

Other comment. You do realise you need separate pull-up resistors on both sides of the MOSFET adapter?.
Lacking these on the PIC side, would cause a hang.

Best Wishes
stoyanoff



Joined: 20 Jul 2011
Posts: 375

View user's profile Send private message

PostPosted: Sat May 11, 2013 12:33 am     Reply with quote

OK! I opened the Disassembly list. The sensor I'm using demands a register address to be send before data extraction. So When I send the address I have to reverse the direction of the data flow. And in this moment my program blocks. When I tried to debug it from this program part:
Code:

81:                   data[1]=i2c_read(1);
  035E  200011     mov.w #0x1,0x0002
  0360  781F81     mov.w 0x0002,[0x001e++]
  0362  7800CF     mov.w [--0x001e],0x0002
  0364  020228     call 0x000228
  0368  B7E85F     mov.b 0x0000,0x085f


The code jumps to the I2C main directive in the top of the program and there it blocks on
Code:

 0246  AE2208     btss.b 0x0208,#1
 0248  37FFFE     bra 0x000246


This is some kind of waiting procedure but I'm not very good in assembler. Can you suppose what's happing here?

I have pull-up resitors on both sides! I tried to connect sensor directly to the controller with pull-up resistors connected to 3.3V. It does the same thing. It reads data one the first run correctly and on the second attempt it blocks!
Best wishes!
temtronic



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

View user's profile Send private message

PostPosted: Sat May 11, 2013 5:07 am     Reply with quote

You should send us the link to the 'sensor'. Maybe someone here has already used it or another pair of eyes scanning the datasheet might see something that you've overlooked.Perhaps the sensor doesen't follow the I2C protocol 100% ?

hth
jay
stoyanoff



Joined: 20 Jul 2011
Posts: 375

View user's profile Send private message

PostPosted: Sat May 11, 2013 6:27 am     Reply with quote

The sensor is new on the market and I`ve taken resposibility in front of the manufaturer not to share the datasheet!
Sorry!
jeremiah



Joined: 20 Jul 2010
Posts: 1355

View user's profile Send private message

PostPosted: Sat May 11, 2013 7:03 am     Reply with quote

The assembly you posted suggests that the sensor isn't sending the data fully. That leaves at least two options based on the info you provided:

1. Something on the sensor's end
2. Something in the level translation

So try two things:

1. add FORCE_SW to your #use i2c() call

and if that doesn't work:

2. post a clear schematic of the circuit including the PIC, sensor, and wiring
temtronic



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

View user's profile Send private message

PostPosted: Sat May 11, 2013 9:02 am     Reply with quote

Well since you can't tell us about the sensor, the only conclusion I can come up with is that it does not strictly conform to the well documented I2C protocol.
The comment about 'new to the market' hints as being an untested,unreliable unit NOT second sourced(big problem there).
There are obvious 'problem' areas such as timing,pullup values,capacitance,distances,etc. none of which we can comment on.

without knowing the sensor's details....I'm outta here.

jay
stoyanoff



Joined: 20 Jul 2011
Posts: 375

View user's profile Send private message

PostPosted: Sat May 11, 2013 12:25 pm     Reply with quote

That`s it! I added FORCE_SW and everything is fine!
Thanks a lot!
Ttelmah



Joined: 11 Mar 2010
Posts: 19545

View user's profile Send private message

PostPosted: Sat May 11, 2013 2:03 pm     Reply with quote

Almost certainly means your bus level translator is not bringing the line high/low properly. The software I2C uses the standard input levels of a PIC pin, which are normally higher for the 'low' level, and lower for the 'high' level, than the I2C spec. So the problem may not be the device.

Best Wishes
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