Problem med DS18B20 temp sensorer.
Problem med DS18B20 temp sensorer.
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.
ä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.
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.
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.
hi ,
Jeg er inte bra på MikroBasic men testa denne setup
@ EDIR :
link http://www.mikroelektronika.co.yu/forum ... c258edacb1
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.
link http://www.mikroelektronika.co.yu/forum ... c258edacb1
Senast redigerad av kimmi 1 juli 2007, 14:37:03, redigerad totalt 1 gång.
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å.
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å.
Skriver ett nyy inlägg för överskådlighetens skull.
Detta är en "lookuptable" som fungerar:
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
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
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

Senast redigerad av v-g 1 juli 2007, 14:50:02, redigerad totalt 1 gång.
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.kimmi skrev:hi ,
Jeg er inte bra på MikroBasic men testa denne setup
@ EDIR :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.
link http://www.mikroelektronika.co.yu/forum ... c258edacb1
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.
Hi,
i bascomAvr we take scratchpad byte 1 & 2 make it to a int the *10 then /16
@ EDIT :
denna code vil gi dig 0.1 ºC res
@ dit code is correct now the
forum error
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
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

Senast redigerad av kimmi 1 juli 2007, 19:04:35, redigerad totalt 1 gång.
Hejkimmi skrev:Hi,
i bascomAvr we take scratchpad byte 1 & 2 make it to a int the *10 then /16
@ EDIT :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
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
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.
Lite mer information.
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.
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.
> 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.
> 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.
