TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: villa en 20 de Junio de 2016, 15:31:31
-
Hola a todos! He leído bastante pero nunca había escrito en este foro...
Me ha surgido un problema en un proyecto. 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.
Adjunto el programa que he realizado:
//******************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);
};
}
Cuando pruebo todo esto, en 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.
-
has pasado por el foro del CCS?
https://www.ccsinfo.com/forum/viewtopic.php?t=50385
-
Hola, pues la verdad es que si había probado ese código y no me funcionaba. Pero he vuelto a intentarlo y ahora si. :-)
Imagino que habría escrito algo incoherente entre el programa y mi cabecera... la verdad es que he hecho tantas pruebas que ya no lo se, jeje. :oops:
Gracias!
-
Puedes subir el codigo corregido por favor
-
Puedes subir el codigo corregido por favor
Lo tenes en el link que paso PalitroqueZ, ese es el codigo de la libreria. Incluso te dice el nombre que deben tener los archivos.
En un main.c luego haces:
#include "BH1750.h"
Con lo cual:
- Tendrias Configurado el I2C
- En la parte de setup simplemente usas BH1750_init();
- Para leer el dispositivo usas get_lux_value(unsigned char mode, unsigned long delay_time);
Donde los modos estan en el .h ( los defines ) y el delay_time es para la demora de adentro, tendrias que ver el datasheet cual es el minimo.
-
estaba revisando ese codigo pero no entiendo bien estoy usando un pic 18f4550 no se que modificaciones tengo que hacer podrias explicarme un poco mas por favor