View previous topic :: View next topic |
Author |
Message |
towpew
Joined: 25 Sep 2015 Posts: 24 Location: sweden
|
BME280 debug output help / now error on PIC24 |
Posted: Sun Dec 20, 2020 5:35 am |
|
|
I am dealing with the bme280 driver and would like to enable the debug output.
But i am a bit confused. I can not get the macro debug_bme280 to output anything to my stream.
I have seen an example here in the forum that I just setup an own output
to my ordinary stream DEBUG that I use on Uart3.
Code: |
void debug_putc(int8 c)
{
fputc(c, DEBUG);
}
|
but nothing comes out from the
Code: |
debug_bme280(debug_putc,"xxx");
|
What have I missed ? Any more defines ??
Last edited by towpew on Sun Jan 03, 2021 6:08 am; edited 2 times in total |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9221 Location: Greensville,Ontario
|
|
Posted: Sun Dec 20, 2020 7:31 pm |
|
|
Now there are a few 'bme280 drivers' ont eh web, that's why I asked _which_ one.
If this bme280 driver is the CCS supplied one, contact CCS for support.
I don't have a recent version of the compiler.... |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sun Dec 20, 2020 10:25 pm |
|
|
Post your PIC and post your #use rs232() line for the DEBUG stream. |
|
|
towpew
Joined: 25 Sep 2015 Posts: 24 Location: sweden
|
|
Posted: Sun Dec 20, 2020 11:30 pm |
|
|
PCM programmer wrote: | Post your PIC and post your #use rs232() line for the DEBUG stream. |
I have the latest bme280.c from CCS
MCU is
#include <24FJ256GB406.h>
Stream
#use rs232(UART3, baud=19200, stream=DEBUG) //DEBUG |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19499
|
|
Posted: Mon Dec 21, 2020 1:40 am |
|
|
So, have you tested just printing something to the DEBUG stream?.
It could be something silly like the UART output being only 3.3v, and not
being enough to talk to your receiving device. You need to test one thing
at a time. UART3 is a PPS device, so your #PIN_SELECT lines for this
should be shown. Also, what compiler version?.
Start by verifying you have got the UART device working correctly. |
|
|
towpew
Joined: 25 Sep 2015 Posts: 24 Location: sweden
|
SOLVED |
Posted: Mon Dec 21, 2020 9:54 am |
|
|
Solved with help from CCS R.
Had to enable macro with
Code: | #define debug_bme280 printf |
and the function
Code: |
void debug_putc(char c)
{
fputc(c, DEBUG);
}
|
before the #include bme280.c
After that all debug pop up.
Ttelmah wrote: | So, have you tested just printing something to the DEBUG stream?.
It could be something silly like the UART output being only 3.3v, and not
being enough to talk to your receiving device. You need to test one thing
at a time. UART3 is a PPS device, so your #PIN_SELECT lines for this
should be shown. Also, what compiler version?.
Start by verifying you have got the UART device working correctly. |
Yes I use the DEBUG for my other debug output. Works OK and UART3 is hw pins.
I have a USB to TTL 3V3 adapter on 19200 baud to Siow.
One question about macro how do they actually work here is macro debug_bme280 suppose to call the debug_putc function I have setup ?
Like a normal function call ?
I use ios so my debug stream calls with the debug << "hello".
One way could be to replace all debug_bme280 macro with the debug << instead. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19499
|
|
Posted: Mon Dec 21, 2020 11:55 am |
|
|
Macros are simple preprocessor substitutions. Almost basic text
substitutions, but just a little more capable. So where the macro is typed
the right hand side text is substituted before compilation. |
|
|
towpew
Joined: 25 Sep 2015 Posts: 24 Location: sweden
|
Switch between two I2C bus with BME280 on |
Posted: Fri Dec 25, 2020 11:24 am |
|
|
I ran up to another question here with my BME280 readings.
On the PIC24FJ256GB406 there are 3 I2C channels and I use
I2C1 for the bus of number of 6 BME280 switching the SDA line with multiplexer.
On I2C3 i have 1 another BME280 connected and now to the problem.
I would like to use the same driver for both these busses and the easiest way I thought about was to use the
Code: |
#use i2c(MASTER, SCL=PIN_E6, SDA=PIN_E7, STREAM=STREAM_I2C_BME280, NOINIT,FAST=BME280_I2C_BAUD)
|
This is to switch PINs to I2C3 and then when I want to go back to the I2C1 bus i use:
Code: |
i2c(MASTER, SCL=PIN_BME280_SCL, SDA=PIN_BME280_SDA, STREAM=STREAM_I2C_BME280, NOINIT,FAST=BME280_I2C_BAUD)
|
When I run this code lines in runtime it does not work as I think ?
The program does not change the PIN, they are stuck on I2C1.
I should also say that the defines for the BME280 I2C pins is in the
beginning of the BME280.c driver as #defines.
Is the defines mandatory in any way and how can I change I2C bus in runtime ?
In the driver it talks about different streams to connect to different I2C addresses on the same bus ? It there a easy way to change stream in runtime ? |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19499
|
|
Posted: Fri Dec 25, 2020 12:16 pm |
|
|
Just change a variable defining the stream.
So have the first bus called STREAM_I2C_BME280, and the second
STREAM_I2C3_BME280
Then have a int16 variable 'called BME_i2c_stream. Use this variable for the
stream name in the function talking to the chip. When you want to talk to
I2C1, just set BME_i2c_stream=STREAM_I2C_BME280; Then when you
want to talk to the I2C3 stream just set
BME_i2c_stream=STREAM_I2C3_BME280;
The function will then talk to the new stream. |
|
|
towpew
Joined: 25 Sep 2015 Posts: 24 Location: sweden
|
|
Posted: Sat Dec 26, 2020 3:33 am |
|
|
Ttelmah wrote: | Just change a variable defining the stream.
So have the first bus called STREAM_I2C_BME280, and the second
STREAM_I2C3_BME280
Then have a int16 variable 'called BME_i2c_stream. Use this variable for the
stream name in the function talking to the chip. When you want to talk to
I2C1, just set BME_i2c_stream=STREAM_I2C_BME280; Then when you
want to talk to the I2C3 stream just set
BME_i2c_stream=STREAM_I2C_BME280;
The function will then talk to the new stream. |
Ok, I have setup another stream to I2C3 named:
Code: |
#use i2c(MASTER, I2C3, FAST, stream=STREAM_I2C3_BME280)
|
then for I2C1 I have the one already defined in the driver with the
Code: |
#use i2c(MASTER, SCL=PIN_BME280_SCL, SDA=PIN_BME280_SDA, STREAM=STREAM_I2C_BME280, NOINIT, FAST=BME280_I2C_BAUD) |
If understand you right I then change all the stream names in the driver that actually talk to the chip.
For example the first read function use i2c_start(BME_i2c_stream) here I change the stream name to the new int16 BME_i2c_stream name.
But this give an error even if I use:
BME_i2c_stream=STREAM_I2C3_BME280
I got Error 130 Stream must be a constant in the valid range. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19499
|
|
Posted: Sat Dec 26, 2020 5:24 am |
|
|
OK. Let me show you how to switch streams:
Code: |
typedef enum {I2C1=1,I2C2,I2C3,I2C4,I2C5} streamname;
#define M_I2C_write(n,x) i2c_write(bus##n,x)
#define M_I2C_start(n) i2c_start(bus##n)
#define M_I2C_stop(n) i2c_stop(bus##n)
#define M_I2C_read(n) i2c_stop(bus##n)
#use i2c(MASTER, I2C1, FAST, stream=bus1)
#use i2c(MASTER, I2C3, FAST, stream=bus2)
void i2c_test(int streamnum)
{
//routine doing basic I/O on selected stream
if (streamnum==1)
{
M_i2c_start(1);
M_i2c_write(1,0xA0);
M_i2c_write(1,0x10);
M_i2c_stop(1);
}
else
{
M_i2c_start(2);
M_i2c_write(2,0xA0);
M_i2c_write(2,0x10);
M_i2c_stop(2);
}
}
void main()
{
int stream=1; //port1 first
while(TRUE)
{
i2c_test(stream); //talk to port
stream=stream+1; //switch stream
if (stream>2)
stream=1;
}
}
|
The same function does it's I2C I/O to two different streams |
|
|
towpew
Joined: 25 Sep 2015 Posts: 24 Location: sweden
|
BME280 error reading on PIC24 |
Posted: Sun Jan 03, 2021 6:03 am |
|
|
First thanks for the switch stream code Ttelmah.
I have another problem now and that is that the latest driver I have got from CCS is not working any good for my PIC24FJ256GB406.
I got mostly error reading, but it seems to be OK because function report OK.
If I test the same driver on my first MCU PIC18LF2550 it all works OK
very stable.
I have looked into the I2C bus and there are same amount of data between PIC24 and PIC18 but something gets wrong on the PIC24.
I have raised this question to my contact at CCS but thought I could ask here also. What the differences may be between PIC18 and PIC24 that could cause bit/byte error as I see it ?
Should also mention that I run on Compiler version 5.076.
//PW |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19499
|
|
Posted: Sun Jan 03, 2021 9:00 am |
|
|
Try specifying the clock rate. So FAST=400000.
I have seen the PIC24 drivers sometimes 'push' the clock rates higher
than chips like. |
|
|
towpew
Joined: 25 Sep 2015 Posts: 24 Location: sweden
|
|
Posted: Sun Jan 03, 2021 9:17 am |
|
|
Ttelmah wrote: | Try specifying the clock rate. So FAST=400000.
I have seen the PIC24 drivers sometimes 'push' the clock rates higher
than chips like. |
I have tried that, same result. I have tested other speeds also.
I run on 10 kHz right now because i want to use longer I2C cables later.
I have checked freq with a Saleae Logic and its 10.05 kHz. I have the same
speed on PIC18LF2550 which work.
Strange !
I can see from I2C transaction that the faulty reading is clearly missing data, many 0x00. The working I2C is numbers in all bytes.
This is the data from OK I2C com from BME280 PIC18:
EE D0 EF 60
EE F7 EF 48 BD 00 7B D4 00 60 F4
This is the I2C from faulty reading from BME280 PIC24:
EE D0 EE 60
EE F7 EF 80 00 00 80 00 00 80 00
So we can see that it has not read in the 3 sensors right.
Any clue ? |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19499
|
|
Posted: Sun Jan 03, 2021 12:37 pm |
|
|
What are your pull up resistor values?. |
|
|
|