PIC 16F877 and DS18B20 problem

Beta Testing discussion on mikroBasic PRO for PIC.
Post Reply
Author
Message
zoomtronic
Posts: 3
Joined: 20 Nov 2010 09:38

PIC 16F877 and DS18B20 problem

#1 Post by zoomtronic » 20 Nov 2010 09:48

I build thermometer with PIC 16F877 and DS18B20, Everything works justi fine, till i expose sensor to negative temperature.
Instead putting negative mark (-) at front of measured temperature, it just continues to measeure down to zero, and up, like is measuring positive temp. Here is the code, tell me where i'm wrong.
it measures for instance 5.00,4.00,3.00,2.00,1.00,0.00,1.00,2.00,3.00,4.00,5.00....

dim LCD_RS as sbit at RD2_bit
LCD_EN as sbit at RD3_bit
LCD_D4 as sbit at RD4_bit
LCD_D5 as sbit at RD5_bit
LCD_D6 as sbit at RD6_bit
LCD_D7 as sbit at RD7_bit
LCD_RS_Direction as sbit at TRISD2_bit
LCD_EN_Direction as sbit at TRISD3_bit
LCD_D4_Direction as sbit at TRISD4_bit
LCD_D5_Direction as sbit at TRISD5_bit
LCD_D6_Direction as sbit at TRISD6_bit
LCD_D7_Direction as sbit at TRISD7_bit
' End Lcd module connections

' Set TEMP_RESOLUTION to the corresponding resolution of used DS18x20 sensor:
' 18S20: 9 (default setting can be 9,10,11,or 12)
' 18B20: 12
const TEMP_RESOLUTION as byte = 12

dim text as char[9]
temp as word

sub procedure Display_Temperature( dim temp2write as word )
const RES_SHIFT = TEMP_RESOLUTION - 8

dim temp_whole as byte
temp_fraction as word

text = "000.0000"
' Check if temperature is negative
if (temp2write and 0x8000) then
text[0] = "-"
temp2write = not temp2write + 1
end if

' Extract temp_whole
temp_whole = word(temp2write >> RES_SHIFT)

' Convert temp_whole to characters
if ( temp_whole div 100 ) then
text[0] = temp_whole div 100 + 48
else
text[0] = " "
end if

text[1] = (temp_whole div 10)mod 10 + 48 ' Extract tens digit
text[2] = temp_whole mod 10 + 48 ' Extract ones digit

' Extract temp_fraction and convert it to unsigned int
temp_fraction = word(temp2write << (4-RES_SHIFT))
temp_fraction = temp_fraction and 0x000F
temp_fraction = temp_fraction * 625

' Convert temp_fraction to characters
text[4] = word(temp_fraction div 1000) + 48 ' Extract thousands digit
text[5] = word((temp_fraction div 100)mod 10 + 48) ' Extract hundreds digit
text[6] = word((temp_fraction div 10)mod 10 + 48) ' Extract tens digit
text[7] = word(temp_fraction mod 10) + 48 ' Extract ones digit


Lcd_Out(2, 2, text)
end sub

main:
ANSEL = 0 ' Configure AN pins as digital I/O
ANSELH = 0

text = "000.0000"
Lcd_Init() ' Initialize Lcd
Lcd_Cmd(_LCD_CLEAR) ' Clear Lcd
Lcd_Cmd(_LCD_CURSOR_OFF) ' Turn cursor off
Lcd_Out(1, 1, " Outside temp: ")
Lcd_Chr(2,13,223) ' u drugom redu na 13. mestu ' Print degree character, "C" for Centigrades
' Different Lcd displays have different char code for degree
Lcd_Chr(2,14,"C") ' u drugom redu na 14. mestu ' If you see greek alpha letter try typing 178 instead of 223

'--- Main loop
while (TRUE)
'--- Perform temperature reading DQ linija
Ow_Reset(PORTC, 2) ' Onewire reset signal
Ow_Write(PORTC, 2, 0xCC) ' Issue command SKIP_ROM
Ow_Write(PORTC, 2, 0x44) ' Issue command CONVERT_T
Delay_us(170)

Ow_Reset(PORTC, 2)
Ow_Write(PORTC, 2, 0xCC) ' Issue command SKIP_ROM
Ow_Write(PORTC, 2, 0xBE) ' Issue command READ_SCRATCHPAD

temp = Ow_Read(PORTC, 2)
temp = (Ow_Read(PORTC, 2) << 8) + temp

'--- Format and display result on Lcd

Display_Temperature(temp)

Delay_ms(300)
wend
end.

igeorge
Posts: 593
Joined: 28 Dec 2005 09:15

Re: PIC 16F877 and DS18B20 problem

#2 Post by igeorge » 23 Dec 2010 03:05

you post it in the wrong place so i do not see getting the answer.
Post in General forum and you will get help
Experience is something you don't get until just after you need it

User avatar
filip
mikroElektronika team
Posts: 11874
Joined: 25 Jan 2008 09:56

Re: PIC 16F877 and DS18B20 problem

#3 Post by filip » 23 Dec 2010 15:18

Hi,

Please take a look at this post :
http://www.mikroe.com/forum/viewtopic.p ... re#p128649

Regards,
Filip.

igeorge
Posts: 593
Joined: 28 Dec 2005 09:15

Re: PIC 16F877 and DS18B20 problem

#4 Post by igeorge » 23 Dec 2010 17:52

Thank you Filip.
I did look at it .
I use the same DS1820 and PIC18F4620 and for me was easy , because i did not use the negative temperatures.
Now i learned how to use them and is great
I would like to ask you kindly to look at this post

http://www.mikroe.com/forum/viewtopic.php?f=97&t=28378

I posted the same question 3 times in the same forum under different topic name and seems like nobody knows or is willing to help
Never got and answer.
All i need to have the extra lines on the ME code so i can WRITE or READ the day of the week.
I read the data sheet and know where is located, but the example masks the values and are returned as 0000
Please help me if you can. I do not feel comfortable with I2C protocol and i am late on this project.
After i finish it i will dedicate time to study the I2C protocol in deep.
Thanks
Ion
Experience is something you don't get until just after you need it

Post Reply

Return to “mikroBasic PRO for PIC Beta Testing”