Вы когда-нибудь связывали датчик MAX44009 с uC? - PullRequest
0 голосов
/ 10 июля 2019

Я недавно пытался программировать, используя бесплатную загружаемую версию MikroC для IDE dsPIC, датчик MAX44009 для взаимодействия с микроконтроллером PIC24FJ64GB002.Результат люкса датчика должен отображаться на ЖК-дисплее.Код компилируется без сбоев, но он не работает.Когда я смотрю линии SDA и SCL с помощью осциллографа, они всегда держатся высоко.Но если я преобразую:

яркость с плавающей запятой -> внутренняя яркость

и

FloatToStr (яркость, люкс) -> IntToString (яркость, люкс)

, затем код загружается на встроенное устройство, и осциллограф показывает, что связь I2C происходит, но значение, отображаемое на ЖК-дисплее, не дает никаких ценных данных.Экран люкс -17204, и он никогда не меняется.

Я пытался отобразить «экспоненту» на ЖК-дисплее, и он отображал: -17204 Я пытался отобразить «мантиссу» на ЖК-дисплее, и он отображал: 255

Когда я пытался отладить код, когда яркость объявляется как число с плавающей точкой, я получаю сообщение об ошибке: «Ошибка симуляции: ПК выходит за рамки [0x0011F0]», когда я меняю значение с плавающей точки на int;Я могу отладить код, но вывод значения на ЖК-дисплее бесполезен.

//LCD module connections
sbit LCD_RS at LATB2_bit;
sbit LCD_EN at LATB3_bit;
sbit LCD_D4 at LATB5_bit;
sbit LCD_D5 at LATB7_bit;
sbit LCD_D6 at LATB13_bit;
sbit LCD_D7 at LATB14_bit;

sbit LCD_RS_Direction at TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB5_bit;
sbit LCD_D5_Direction at TRISB7_bit;
sbit LCD_D6_Direction at TRISB13_bit;
sbit LCD_D7_Direction at TRISB14_bit;
//End LCD Module connections

//Global Constants
char txt1[] = "LUX:";
char txt2[] = "check";
//End Global Constants


// Global var.
unsigned int buff[2];
//unsigned char b1Index;
int mantissa;
int exponent;
float luminance;
char lux[16];
//end of Global variable declaration

//Function declaration
void MAX44009_getvalue();
//end of function declaration

void main(){
AD1PCFG = 0xffff;                        //Configure AN pins as digital 
I/O
Delay_ms(500);
I2C1_Init(100000);                       //Initialize I2C communication 
on SDA1 and SCL1
I2C1_Start();                  //Wake-up I2C components
I2C1_Write(0x96);              //Address MAX44009 lux sensor 
specifically, and prepare for write command
I2C1_Write(0x02);              //Address specific register 02 (interupt 
register) for MAX44009
I2C1_Write(0x40);              //Continuous mode, 100ms integration time
I2C1_Stop();                   //issue I2C stop signal
Delay_ms(300);                 //Because Arduino said so....

Lcd_Init();                              //Initialize LCD
Lcd_Cmd(_LCD_CLEAR);                     //Clear LCD
Lcd_Cmd(_LCD_CURSOR_OFF);                //Cursor Off

/*Delay_ms(1000);
Lcd_Out(2,1,txt2);
Delay_ms(1000);*/

while (1){
    MAX44009_getvalue();
    exponent = (buff[0] & 0xF0) >> 4;
    mantissa = ((buff[0] & 0x0F ) << 4) | (buff[1] & 0x0F);
    luminance = pow(2, exponent)*mantissa*0.045;

    FloatToStr(luminance, lux);

    Lcd_Out(1,1,txt1);
    Lcd_Out(2,1,lux);
    Delay_ms(500);
}
}

void MAX44009_getvalue(){

I2C1_Start();
I2C1_Write(0x96);
I2C1_Write(0x03);             //MAX44009 LUX High-Byte Register 0x03
I2C1_Restart();
I2C1_Write(0x97);

buff[0] = I2C1_Read(0);

I2C1_Restart();

I2C1_Write(0x96);
I2C1_Write(0x04);              //MAX44009 LUX Low-Byte Register 0x04
I2C1_Restart();
I2C1_Write(0x97);

buff[1] = I2C1_Read(0);

I2C1_Stop();
}     

Ожидаемые результаты: Рабочий код датчика MAX44009 люкс, отображение значений люкс на ЖК-дисплее

Ошибка моделирования: ПКвыходит за рамки [0x0011F0]

...