Buenos dias la verdad tengo un problema en la lectura de un sensor de luminosidad que su referencia es bh1750 , por alguna razon no he sido capaz de leerlo en pic y la verdad no entiendo, he utilizado otros perifericos i2c pero este es el unico que me da guerra, estoy utilizado un modulo i2c para la pantalla lcd y intento mostrar los datos del sensor pero no me deja.
Este es la libreria bh1750.c :
#include "BH1750.h"
void BH1750_init()
{
delay_ms(100);
BH1750_write(power_down);
}
void BH1750_write(unsigned char cmd)
{
I2C_start();
I2C_write(BH1750_address_w);
I2C_write(cmd);
I2C_stop();
}
unsigned long BH1750_read_word()
{
register unsigned long value = 0;
unsigned char lb = 0;
unsigned char hb = 0;
I2C_start();
I2C_write(BH1750_address_r); //BH1750_address_r
hb = I2C_read(1);
lb = I2C_read(0);
I2C_stop();
value = make16(hb, lb);
return value;
}
unsigned long get_lux_value(unsigned char mode, unsigned long delay_time)
{
register unsigned long lux_value = 0;
BH1750_write(power_up);
BH1750_write(mode);
lux_value = BH1750_read_word();
delay_ms(delay_time);
BH1750_write(power_down);
return lux_value;
} Y esta es la libreria BH1750.h:
#define PCF_SDA PIN_B5
#define PCF_SCL PIN_B4
#use i2c(master, sda=PCF_SDA, scl=PCF_SCL)
#define BH1750_address_w 0x46
#define BH1750_address_r 0x47
#define power_down 0x00
#define power_up 0x01
#define reset 0x07
#define cont_H_res_mode1 0x10
#define cont_H_res_mode2 0x11
#define cont_L_res_mode 0x13
#define one_time_H_res_mode1 0x20
#define one_time_H_res_mode2 0x21
#define one_time_L_res_mode 0x23
void BH1750_init();
void BH1750_write(unsigned char cmd);
unsigned long BH1750_read_word();
unsigned long get_lux_value(unsigned char mode, unsigned long delay_time);
y el codigo que estoy compilando al pic es:
#include <18F47J53.h>
#device ADC=12
#FUSES NOWDT //WDT disabled (enabled by SWDTEN bit)
#FUSES PLL3 //Divide by 3 (12 MHz oscillator input)
#FUSES NOPLLEN //PLL Disabled
#FUSES NOSTVREN //stack overflow/underflow reset enabled
#FUSES NOXINST //Extended instruction set disabled
#FUSES NOCPUDIV //No CPU system clock divide
#FUSES NOPROTECT //Program memory is not code-protected
#FUSES HSPLL //HS oscillator, PLL enabled, HSPLL used by USB
#FUSES SOSC_HIGH //High Power T1OSC/SOSC circuit selected
#FUSES CLOCKOUT //CLKO output enabled on the RA6 pin
#FUSES NOFCMEN //Fail-Safe Clock Monitor disabled
#FUSES NOIESO //Two-Speed Start-up disabled
#FUSES WDT32768 //Watchdog Postscaler 1:32768
#FUSES DSWDTOSC_INT //DSWDT uses INTOSC/INTRC as clock
#FUSES RTCOSC_INT //RTCC uses INTRC as clock
#FUSES NODSBOR //Zero-Power BOR disabled in Deep Sleep
#FUSES NODSWDT //Deep Sleep Watchdog Timer Disabled
//#FUSES DSWDT8192 //Deep Sleep Watchdog Postscaler: 1:8,192 (8.5 seconds)
#FUSES NOIOL1WAY //IOLOCK bit can be set and cleared
#FUSES ADC12 //ADC 10 or 12 Bit Select:12 - Bit ADC Enabed
#FUSES MSSPMSK7 //MSSP 7 Bit address masking
#FUSES NOWPFP //Write Protect Program Flash Page 0
#FUSES NOWPCFG //Write/Erase last page protect Disabled
#FUSES WPDIS //WPFP[5:0], WPEND, and WPCFG bits ignored
#FUSES WPEND //Start protection at page 0
#FUSES LS48MHZ //Low Speed USB mode with 48 MHz System clock at 48 MHz USB CLKEN divide-by is set to 8
#use delay(clock=48000000)
//#fuses INTRC_IO, PROTECT, NOWDT, BROWNOUT, NOWRT
//#fuses NODEBUG, NOIESO, PUT, NOMCLR, FCMEN, CPD
#define LOADER_END 0xFFF
#build(reset=LOADER_END+1, interrupt=LOADER_END+9) //Protege posiciones de memoria desde la 0x0000 hasta la 0x1000
#org 0, LOADER_END {}
#bit PLLEN = 0xf9b.6
#use delay (internal = 4MHz)
#define PCF_SDA PIN_B5
#define PCF_SCL PIN_B4
#use i2c(master, sda=PCF_SDA, scl=PCF_SCL)
#define PCF_ID 7
#define PCF 64
#define blacking P3
#define LCD_RS P0
#define LCD_RW P1
#define LCD_E P2
#define LCD_DB4 P4
#define LCD_DB5 P5
#define LCD_DB6 P6
#define LCD_DB7 P7
#include<LCD_PCF.C>
#include "BH1750.c"
void setup();
#zero_ram
void main()
{
PLLEN = 1; //Habilita PLL para generar 48MHz de oscilador*/\
unsigned long lux = 0;
setup();
while(TRUE)
{
lux = get_lux_value(cont_H_res_mode1, 180);
lcd_gotoxy(6, 2);
printf(lcd_putc, "%05lu ", lux);
delay_ms(100);
};
}
void setup()
{
disable_interrupts(global);
setup_oscillator(OSC_4MHz);
setup_WDT(WDT_OFF);
setup_comparator(NC_NC_NC_NC);
setup_SPI(SPI_disabled | SPI_SS_disabled);
setup_timer_0(0 | 0 | 0);
setup_timer_1(T1_disabled);
setup_timer_2(T2_disabled, 255, 1);
setup_CCP1(CCP_off);
set_timer0(0);
set_timer1(0);
set_timer2(0);
BH1750_init();
lcd_init();
lcd_putc("\f");
lcd_gotoxy(1, 1);
lcd_putc("Ambient Light/lx");
}
He mirado distintos foros y temas sobre el sensor pero no encuentro algo que me ayude, si alguno tiene una pista de que podria ser se lo agradeceria, de paso lo que me muestra en la lcd es 65535 el valor de lux parece que le esta enviando solamente unos tampoco entiendo porque. Muchas gracias de antemano