Problem med DS18B20 temp sensorer.

Övriga diskussioner relaterade till komponenter. Exempelvis radiorör, A/D, kontaktdon eller sensorer.
lennie
Inlägg: 26
Blev medlem: 30 juni 2007, 22:38:44
Ort: Malmö

Problem med DS18B20 temp sensorer.

Inlägg av lennie »

Har ett litet problem.
är ganska ny på avr så jag tror att det är jag som gör fel och inte fel på själva temp sensorn.
Jag programmerar i MikroBasic använder en ATMEGA16
följande kod använder jag.
---------------------------------------
Dim j1 as byte
temp as char[6]
Main:
Lcd_init(PORTD, 6, 4, PORTA, LCD_HI_NIBBLE
Do
ow_reset(PORTC,7)
ow_write($CC)
ow_write($44)
delay_ms(120)
ow_reset(PORTC,7)
ow_write($CC)
ow_write($BE)
delay_ms(200)
J1 = ow_read
ByteToStr(j1,temp)
lcd_out(1,1,temp)
Loop until false
End.
------------------------------------------------------
När jag kör denna koden så får jag ut att tempaturen ska vara 135c grader.
först tänkte jag att den kanske skickade ut det i Fahrenheit. Men 135 gahrenheit är 57grader celsius..
och jag har runt 22 grader i lägenheten.
Vad gör jag för fel?
Tack på förhand.
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Inlägg av v-g »

Det finns en fahrenheit och en celsius variant.

Troligen får du fel data från kretsen eller så är det störningar. Ett bra sätt att veta att man får rätt data är CRC kontrollen.
lennie
Inlägg: 26
Blev medlem: 30 juni 2007, 22:38:44
Ort: Malmö

Inlägg av lennie »

Vet inte om det är en Fahrenheit eller Celsius variant. men på sensorn står det följande
dallas
18B20
0633C3
+447AB
Var tvungen att hämta ett förstornings glas för att kunna läsa det.
Som sagt.. är ganska ny på avr.
Hur gör jag en CRC kontroll.
Jag har rom commands flow chart till DS18B20 framför mig.
men jag har lite problem att förstå dem.
kimmi
Inlägg: 221
Blev medlem: 13 april 2007, 12:25:00

Inlägg av kimmi »

hi ,
Jeg er inte bra på MikroBasic men testa denne setup

Kod: Markera allt

Dim j1 as byte 
Dim j2 as byte 
temp as char[6] 
Main: 
Lcd_init(PORTD, 6, 4, PORTA, LCD_HI_NIBBLE 
Do 
ow_reset(PORTC,7) 
ow_write($CC) 
ow_write($44) 
delay_ms(120) 
ow_reset(PORTC,7) 
ow_write($CC) 
ow_write($BE) 
delay_ms(1000) 
J1 = ow_read
j2 = ow_read 
j1 = j1 >> 1
ByteToStr(j1,temp) 
lcd_out(1,1,temp) 
Loop until false 
End.
@ EDIR :
link http://www.mikroelektronika.co.yu/forum ... c258edacb1
Senast redigerad av kimmi 1 juli 2007, 14:37:03, redigerad totalt 1 gång.
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Inlägg av v-g »

Jadu, jag har själv trixxat igenom det hela i VB och på parallellporten. Det är i princip det jag lyckats med. Fick till en början koda en rutin för att kunna göra korta delay då 1 ms är minsta i VB annars.

Men CRC _TROR_ jag enklast görs mha en lookuptable. "Skulle" förstå hur de på DS räknade ut den men fick det aldrig rätt. Värdena för LuT finns det gott om på nätet har för mig att det även finns exempel på DS hemsida i både asm och c.

Tyvärr är jag en PICman själv så jag kan inte hjälpa så mycket med AVR-programmering, det jag däremot VET är att någon måste ha gjort det innan dig. Har du googlat en timme? Jag letade säkert 4-5 timmar innan jag fann alla sidor (tyvärr borta nu) som jag behövde.

Söktermer är ds1820 "code example" routines osv.

Men följden som jag kört är denna: (Jag körde INTE i parasitemode)
1. Sätt ingången låg i 500ms
2. Sätt ingången hög. DS1820 ska nu dra den låg om allt är ok.

Sen ska kommandona in och det är "read scratchpad" som du bör vara intresserad av.

3. Skicka 0xCC (skip ROM command)
4. Skicka 0x44 (start conversion) dvs kör en temperaturkonvertering.
5. Man kan nu antigen vänta enligt databladet eller så ger man ut "read-time-slots" och då svarar DS1820 med 0:or tills den är klar och med en etta när den ÄR klar.

Så då är det bara att läsa av scrathpaden kvar.
6. Resetta kretsen (steg 1&2)
7. Skicka 0xCC (skip ROM command)
8. Skicka 0xBE (Read Scratchpad)

Sen är det "bara" att ta emot datat kvar.

***

Om du trots detta kommer ingenstans så rekommenderar jag att läsa ut serienumret först det kan man göra direkt efter reset och skip rom command.

Fel kan ha uppenbarat sig då detta är avskrivet mitt VBprogram+fritt ur minnet+databladet. Massor att hålla koll på.
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Inlägg av v-g »

Skriver ett nyy inlägg för överskådlighetens skull.

Detta är en "lookuptable" som fungerar:

Kod: Markera allt

0,94,188,226,97,63,221,131,194,156,126,32,163,253,31,65,
157,195,33,127,252,162,64,30,95,1,227,189,62,96,130,220,
35,125,159,193,66,28,254,160,225,191,93,3,128,222,60,98,
190,224,2,92,223,129,99,61,124,34,192,158,29,67,161,255,
70,24,250,164,39,121,155,197,132,218,56,102,229,187,89,7,
219,133,103,57,186,228,6,88,25,71,165,251,120,38,196,154,
101,59,217,135,4,90,184,230,167,249,27,69,198,152,122,36,
248,166,68,26,153,199,37,123,58,100,134,216,91,5,231,185,
140,210,48,110,237,179,81,15,78,16,242,172,47,113,147,205,
17,79,173,243,112,46,204,146,211,141,111,49,178,236,14,80,
175,241,19,77,206,144,114,44,109,51,209,143,12,82,176,238,
50,108,142,208,83,13,239,177,240,174,76,18,145,207,45,115,
202,148,118,40,171,245,23,73,8,86,180,234,105,55,213,139,
87,9,235,181,54,104,138,212,149,203,41,119,244,170,72,22,
233,183,85,11,136,214,52,106,43,117,151,201,74,20,246,168,
116,42,200,150,21,75,169,247,182,232,10,84,215,137,107,53
Alltså: Får du CRCvärde "2" från kretsen så ska "svaret" vara 188

1 ger 94 osv.

Edit:Just ja. För att räkna ut din crcsumma så tar du allt mottaget data och gör såhär:
1. CRC=0
2. CRCtmp = CRC xor Byte8 (sen 7,6,5,4,3,2,1,0)
3. CRC=lookup(CRCtemp)
4. Gå till stegt två tills byten = 0.

För att vara supergenerös så bjuder jag på en TestCRC som du bör få rätt innan funktionen sätts i drift.
Byte1=2
Byte2=28
Byte3=184
Byte4=1
Byte5=0
Byte6=0
Byte7=0
Byte8=162

Hoppas inga skrivfel smugit sig in nu :shock:
Senast redigerad av v-g 1 juli 2007, 14:50:02, redigerad totalt 1 gång.
lennie
Inlägg: 26
Blev medlem: 30 juni 2007, 22:38:44
Ort: Malmö

Inlägg av lennie »

kimmi skrev:hi ,
Jeg er inte bra på MikroBasic men testa denne setup

Kod: Markera allt

Dim j1 as byte 
Dim j2 as byte 
temp as char[6] 
Main: 
Lcd_init(PORTD, 6, 4, PORTA, LCD_HI_NIBBLE 
Do 
ow_reset(PORTC,7) 
ow_write($CC) 
ow_write($44) 
delay_ms(120) 
ow_reset(PORTC,7) 
ow_write($CC) 
ow_write($BE) 
delay_ms(1000) 
J1 = ow_read
j2 = ow_read 
j1 = j1 >> 1
ByteToStr(j1,temp) 
lcd_out(1,1,temp) 
Loop until false 
End.
@ EDIR :
link http://www.mikroelektronika.co.yu/forum ... c258edacb1
Jag testade den koden och då får jag ut svaret 68. vilket kan vara i Fahrenheit. vilket ger 20 grader Celsius. vilket kan stämma att jag har i lägenheten.
jag ska förlänga temp sensorn och lägga in den i kylen och frysen och se vilka värden jag får där så ska vi se om den levererar rätt info till mig nu.
Nu ska jag bara hitta en formel som gör om F till C. men det är typ 1 min googlande sen har man hittat det.

Tack för hjälpen.
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Inlägg av v-g »

Håll sensorn i handen så ser du om det förändras.
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

I mitt datablad över DS18B20 står det INGET om att det finns en Fahrenheit och en Celcius version, det finns bara Celcius.
kimmi
Inlägg: 221
Blev medlem: 13 april 2007, 12:25:00

Inlägg av kimmi »

Hi,
i bascomAvr we take scratchpad byte 1 & 2 make it to a int the *10 then /16

Kod: Markera allt

'Makes a integer value of the first two bytes in scratchpad'''''''''''''
'Works on DS18 B 20 , observe "B". The R0 and R1 in Sc(5) tells you how many bits are accurate
function Decigrades(Byval Sc(9) as byte)
 Decigrades = 0
 Decigrades = Makeint(Sc(1) , Sc(2))
 Decigrades = Decigrades * 10
 Decigrades = Decigrades / 16
end function
@ EDIT :
denna code vil gi dig 0.1 ºC res

Kod: Markera allt

******************************************************************************* 
'* Project Name : One Wire Interface Test 
'* Date/Author : 2005-12-11 VD 
'* Description : This program demonstrates how to use OWI library. 
'* Environment : The program has been tested with ATmega16, @8MHz, 
'* crystal oscillator, Easy AVR 3 board. 
'* Notes : If you are using the Easy AVR board, you need to 
'* put DS18B20 in proper place, and put jemper J8 to 
'* in position to select PORTC.7, turn off LED on PORTC. 
'* put LCD in proper position. 
'* Writing on LCD temerature measured by 
'* Dallas One Wire DS18B20 Sensore 
'******************************************************************************* 
program DS18B20_test 

dim Raw_temp as word 
TempC, comma as word 
i, j1, j2, minus as byte 
text as char[14] 

main: 
'DDRC.3 =1 ' put RW on GND --> PORTC.3=0 
'PORTC.3 =0 ' to work on GLCD connector 

Lcd_Init(PORTC, 4, 2, PORTA, LCD_HI_NIBBLE) 
Lcd_Out(1,1,"Temeperature :") 
Lcd_Cmd(LCD_CURSOR_OFF) 
do 
ow_reset(PORTC,7) ' onewire reset signal 
ow_write($CC) ' issue command to DS1820 
ow_write($44) ' issue command to DS1820 
delay_us(120) 
i = ow_reset(PORTC,7) 
ow_write($CC) ' issue command to DS1820 
ow_write($BE) ' issue command to DS1820 

j1 = ow_read ' get result 
j2 = ow_read ' get result (assuming the temperature is positive) 

minus= j2 >> 3 

if minus = $1F then ' Checking temp.(+ or -) 
j2= not j2 
j1=-j1 
end if 

Raw_temp= (j2 << 8)  or j1 ' Getting RAW data 

if minus = $1F then 
Lcd_Chr(2,1,"-") ' Write temp. sign (+ or -) on LCD 
else 
Lcd_Chr(2,1,"+") 
end if 

TempC=(Raw_temp and $0FF0) >> 4 ' WHOLE NUMBER 
comma=(j1 and $0F) * 625 ' DECIMAL 

WordToStr(TempC,text) ' Write temp. whole number on LCD 
Lcd_Chr(2, 2, text[0]) 
Lcd_Chr(2, 3, text[1]) 
Lcd_Chr(2, 4, 46) '"." 
WordToStr(comma,text) ' Write temp. decimal number on LCD 
Lcd_Chr(2, 5, text[0]) 
Lcd_Chr(2, 6, text[1]) 
Lcd_Chr(2, 7, text[2]) 
Lcd_Chr(2, 8, text[3]) 
lcd_chr(2, 9, 223) ' "degree" character 
lcd_chr(2, 10,"C") 
Delay_ms(500) 
loop until false ' endless loop 

end
@ €dit code is correct now the 8) forum error
Senast redigerad av kimmi 1 juli 2007, 19:04:35, redigerad totalt 1 gång.
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Inlägg av v-g »

Icecap:Du har rätt jag hittar inget om någon Fahrenheitversion. Iaf ingen som heter DS18B20.

Undrar var jag sett det någonstans då?

Nåväl då är den möjligheten utesluten iaf 8)
lennie
Inlägg: 26
Blev medlem: 30 juni 2007, 22:38:44
Ort: Malmö

Inlägg av lennie »

kimmi skrev:Hi,
i bascomAvr we take scratchpad byte 1 & 2 make it to a int the *10 then /16

Kod: Markera allt

'Makes a integer value of the first two bytes in scratchpad'''''''''''''
'Works on DS18 B 20 , observe "B". The R0 and R1 in Sc(5) tells you how many bits are accurate
function Decigrades(Byval Sc(9) as byte)
 Decigrades = 0
 Decigrades = Makeint(Sc(1) , Sc(2))
 Decigrades = Decigrades * 10
 Decigrades = Decigrades / 16
end function
@ EDIT :
denna code vil gi dig 0.1 ºC res

Kod: Markera allt

******************************************************************************* 
'* Project Name : One Wire Interface Test 
'* Date/Author : 2005-12-11 VD 
'* Description : This program demonstrates how to use OWI library. 
'* Environment : The program has been tested with ATmega16, @8MHz, 
'* crystal oscillator, Easy AVR 3 board. 
'* Notes : If you are using the Easy AVR board, you need to 
'* put DS18B20 in proper place, and put jemper J8 to 
'* in position to select PORTC.7, turn off LED on PORTC. 
'* put LCD in proper position. 
'* Writing on LCD temerature measured by 
'* Dallas One Wire DS18B20 Sensore 
'******************************************************************************* 
program DS18B20_test 

dim Raw_temp as word 
TempC, comma as word 
i, j1, j2, minus as byte 
text as char[14] 

main: 
'DDRC.3 =1 ' put RW on GND --> PORTC.3=0 
'PORTC.3 =0 ' to work on GLCD connector 

Lcd_Init(PORTC, 4, 2, PORTA, LCD_HI_NIBBLE) 
Lcd_Out(1,1,"Temeperature :") 
Lcd_Cmd(LCD_CURSOR_OFF) 
do 
ow_reset(PORTC,7) ' onewire reset signal 
ow_write($CC) ' issue command to DS1820 
ow_write($44) ' issue command to DS1820 
delay_us(120) 
i = ow_reset(PORTC,7) 
ow_write($CC) ' issue command to DS1820 
ow_write($BE) ' issue command to DS1820 

j1 = ow_read ' get result 
j2 = ow_read ' get result (assuming the temperature is positive) 

minus= j2 >> 3 

if minus = $1F then ' Checking temp.(+ or -) 
j2= not j2 
j1=-j1 
end if 

[color=red]Raw_temp= (j2 <<  or j1 ' Getting RAW data [/color]

if minus = $1F then 
Lcd_Chr(2,1,"-") ' Write temp. sign (+ or -) on LCD 
else 
Lcd_Chr(2,1,"+") 
end if 

TempC=(Raw_temp and $0FF0) >> 4 ' WHOLE NUMBER 
comma=(j1 and $0F) * 625 ' DECIMAL 

WordToStr(TempC,text) ' Write temp. whole number on LCD 
Lcd_Chr(2, 2, text[0]) 
Lcd_Chr(2, 3, text[1]) 
Lcd_Chr(2, 4, 46) '"." 
WordToStr(comma,text) ' Write temp. decimal number on LCD 
Lcd_Chr(2, 5, text[0]) 
Lcd_Chr(2, 6, text[1]) 
Lcd_Chr(2, 7, text[2]) 
Lcd_Chr(2, 8, text[3]) 
lcd_chr(2, 9, 223) ' "degree" character 
lcd_chr(2, 10,"C") 
Delay_ms(500) 
loop until false ' endless loop 
end
Hej

Raw_temp= (j2 << or j1 ' Getting RAW data

under den raden får jag fel.
det är << som den gnäller över. vad ska den rätta syntaxen vara.
lennie
Inlägg: 26
Blev medlem: 30 juni 2007, 22:38:44
Ort: Malmö

Lite mer information.

Inlägg av lennie »

jag har nu kopplat in 2 DS18B20 sensorer.
en sitter på labbkortet. den andra satt jag i kylskåpet :)
så är det lättare att se när det fungerar.
sensorn på labbkortet sitter på PC7 och den sensorn i kylskåpet sitter på PC6.
har som sagt kört fast lite. ska testa senaste inlagda koden. men får ett syntax error på en av raderna i den. kanske någon kan hjälpa mig. så ska vi se om den koden hjälper till att fixa mitt problem.
jag använder mig föresten av ett EasyAVR4 labb kort.
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Raw_temp= (j2 << or j1 ' Getting RAW data
> under den raden får jag fel.

Alltså. *personligen* tycker jag raden ser konstig ut med enbart en
vänsterparentes utan matchande högerparentes...

Du har inte funderat på att fixa till raden själv ?

Antingen ska "(" bort eller så ska det dit en ")", skulle jag gissa.
Och det går snabbare att testa än att fråga här först. :-)
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Dessutom, ditt tangentbort verkar sakna shifttangent (i alla fall ibland,
i början på meningar), så dina inlägg blir lite svårlästa.
Skriv svar