Я недавно пытался программировать, используя бесплатную загружаемую версию 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]