Hola!
He conectado un chip BH1750 a un PIC16f886 a través del bus I2C y mi objetivo es mostrar el valor de iluminación dado en un LCD de 2x16 caracteres. Hace poco que comencé a programar en CCS y nunca he realizado ningún proyecto en el que use el bus para enviar o recibir datos.
Llevo ya bastantes días peleándome con el código pero tengo el problema de que no encuentro ejemplos en la web (todos son para Arduino) y tampoco puedo simularlo en Proteus porque no existe el componente BH1750.
¿Alguien puede echarme una mano? alguna librería o pauta para conseguir configurar el BH1750 y guardar el valor en un registro del PIC.
Gracias!
Copio la última versión de código que he realizado a ver si alguien me puede decir que estoy haciendo mal...
Cuando pruebo todo esto, el LCD veo el mensaje "Luxometro" correctamente por lo que se que tanto el PIC como el LCD están bien. Pero la lectura que debería venirme del BH1750 se queda fija en el valor 54612...
Saludos.
He conectado un chip BH1750 a un PIC16f886 a través del bus I2C y mi objetivo es mostrar el valor de iluminación dado en un LCD de 2x16 caracteres. Hace poco que comencé a programar en CCS y nunca he realizado ningún proyecto en el que use el bus para enviar o recibir datos.
Llevo ya bastantes días peleándome con el código pero tengo el problema de que no encuentro ejemplos en la web (todos son para Arduino) y tampoco puedo simularlo en Proteus porque no existe el componente BH1750.
¿Alguien puede echarme una mano? alguna librería o pauta para conseguir configurar el BH1750 y guardar el valor en un registro del PIC.
Gracias!
Copio la última versión de código que he realizado a ver si alguien me puede decir que estoy haciendo mal...
Código:
//******************LUXOMETRO*****************************
//
#Include <16f886.h>
#fuses INTRC_IO,NOWDT,PUT,MCLR,BROWNOUT,NOLVP,NOCPD,NOPROTECT
#use delay (Internal=4000000)
#use fast_io(A)
#use standard_io(B)
#use fast_io(C)
#use I2C(MASTER, sda=PIN_C4, scl=PIN_C3, fast=450000)
#define PWR_DOWN 0x00
#define PWR_ON 0x01
#define RESET 0X07
#define MODE_HIGH_RES1 0X10
#define MODE_HIGH_RES2 0X11
#define MODE_LOW_RES 0x13
#define ADDRESS_L 0X23
#Include <lcd_portb.c>
//**********************VARIABLES GLOBALES****************************
unsigned long LUX;
char HB,LB;
//*******************FUNCIONES DE PROGRAMA*****************************
void lcd_defecto(){
lcd_init(); //función de inicialización del LCD
delay_ms(10);
lcd_putc('\f'); //se limpia el LCD
delay_ms(10);
lcd_gotoxy(2,1); //Apunta a posición 2, fila 1
delay_ms(10);
printf(lcd_putc, "LUXOMETRO");
delay_ms(10);
lcd_putc('\n'); //Apunta al inicio de la línea 2
delay_ms(10);
}
void BH1750_init(){
I2C_start();
I2C_write(ADDRESS_L);
I2C_write(PWR_ON);
delay_ms(100);
I2C_write(RESET);
delay_ms(100);
I2C_write(MODE_HIGH_RES1);
I2C_stop();
delay_ms(200);
}
//*********************PROGRAMA PRINCIPAL***************************
void main () {
set_tris_a(0x0F); //Configuración de I/O puerto A
set_tris_b(0x01); //Configuración de I/O puerto B
set_tris_c(0xC0); //Configuración de I/O puerto C
lcd_defecto();
BH1750_init();
while(TRUE){
I2C_start();
I2C_write(ADDRESS_L);
hb = I2C_read(1);
lb = I2C_read(0);
I2c_stop();
LUX = make16(hb, lb);
LUX = LUX/1.2;
delay_ms(500);
lcd_gotoxy(4,2);
printf(lcd_putc, "%5lu",LUX);
delay_ms(500);
};
}
Saludos.
Adjuntos
Última edición por un moderador: