I know there is a lot of examples on how to connect and read temperature from DS18B20 sensor. I'm using code from mikroc example library and i always get "000.5000" as result on my GLCD. Can someone please look at my code because i have no idea whats wrong I am using PIC18F4550, my sensor is connected to PORTC.F0
Code: Select all
char GLCD_DataPort at PORTD;
sbit GLCD_CS1 at RB1_bit;
sbit GLCD_CS2 at RB0_bit;
sbit GLCD_RS at RB2_bit;
sbit GLCD_RW at RB3_bit;
sbit GLCD_EN at RB4_bit;
sbit GLCD_RST at RB5_bit;
sbit GLCD_CS1_Direction at TRISB1_bit;
sbit GLCD_CS2_Direction at TRISB0_bit;
sbit GLCD_RS_Direction at TRISB2_bit;
sbit GLCD_RW_Direction at TRISB3_bit;
sbit GLCD_EN_Direction at TRISB4_bit;
sbit GLCD_RST_Direction at TRISB5_bit;
const unsigned short TEMP_RESOLUTION = 9;
char *text = "000.0000";
unsigned temp;
void Display_Temperature(unsigned int temp2write) {
const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
char temp_whole;
unsigned int temp_fraction;
// check if temperature is negative
if (temp2write & 0x8000) {
text[0] = '-';
temp2write = ~temp2write + 1;
}
// extract temp_whole
temp_whole = temp2write >> RES_SHIFT;
// convert temp_whole to characters
if (temp_whole/100)
text[0] = temp_whole/100 + 48;
else
text[0] = '0';
text[1] = (temp_whole/10)%10 + 48; // Extract tens digit
text[2] = temp_whole%10 + 48; // Extract ones digit
// extract temp_fraction and convert it to unsigned int
temp_fraction = temp2write << (4-RES_SHIFT);
temp_fraction &= 0x000F;
temp_fraction *= 625;
// convert temp_fraction to characters
text[4] = temp_fraction/1000 + 48; // Extract thousands digit
text[5] = (temp_fraction/100)%10 + 48; // Extract hundreds digit
text[6] = (temp_fraction/10)%10 + 48; // Extract tens digit
text[7] = temp_fraction%10 + 48; // Extract ones digit
// print temperature on LCD
//Lcd_Out(2, 5, text);
Glcd_Write_Text(text, 0, 0, 1);
}
void main() {
ADCON1 = 0x0F;
CMCON = 7;
TRISA = 0x00; // PORTA as output (one LED on PORTA.F0)
//TRISC = 0xFF;
PORTA.F0 = 1;
Glcd_Init();
Glcd_Fill(0x00);
while(1) {
//--- perform temperature reading
Ow_Reset(&PORTC, 0); // Onewire reset signal
Ow_Write(&PORTC, 0, 0xCC); // Issue command SKIP_ROM
Ow_Write(&PORTC, 0, 0x44); // Issue command CONVERT_T
Delay_us(120);
Ow_Reset(&PORTC, 0);
Ow_Write(&PORTC, 0, 0xCC); // Issue command SKIP_ROM
Ow_Write(&PORTC, 0, 0xBE); // Issue command READ_SCRATCHPAD
temp = Ow_Read(&PORTC, 0);
temp = (Ow_Read(&PORTC, 0) << 8) + temp;
//--- Format and display result on Lcd
Display_Temperature(temp);
Delay_ms(500);
}
}