Autor Tema: Problemas con BH1750 en pic 18f47j53  (Leído 2285 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado fanta007

  • PIC10
  • *
  • Mensajes: 7
Problemas con BH1750 en pic 18f47j53
« en: 28 de Noviembre de 2018, 09:58:25 »
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 :
Código: [Seleccionar]
#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:
Código: [Seleccionar]
#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:
Código: [Seleccionar]
#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

Desconectado rafagranada

  • PIC10
  • *
  • Mensajes: 7
Re:Problemas con BH1750 en pic 18f47j53
« Respuesta #1 en: 11 de Diciembre de 2018, 09:40:02 »
hola que tal?

yo estoy tambien iniciadome en ese luxometro con pic y proteus?

en proteus lo has podido simular? como has generado el integrado?

gracias y un saludo