DS1820 Värmer sig själv.

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Fagge
Inlägg: 3930
Blev medlem: 27 maj 2003, 13:59:51
Ort: Blekinge

DS1820 Värmer sig själv.

Inlägg av Fagge »

Hittade denna kod, som läser av DS1820 sensorn & skickar ut temperatur värdet på serieporten.

Funkar klockrent, men efter en stund så har temperaturen skenat iväg med 4-6grader.
Så det kan väll inte vara något annat än att sensorn & µcn driver datapinnen mot varandra, men jag kan inte se vart i koden detta skulle kunna ske.

Någon som är villig att slå ett getöga på Onewire rutinerna i koden?.


Kod: Markera allt

;/************************************************************************* 
 ; Program         :Measure temperature with the DS1820. 
 ; Description      :The temperature data will be send to serial port(RS232). 
 ; Pin description   :DQ = PB0 
 ; CPU Control      :ATmega163 
 ; File name         :DS1820.asm 
 ; Assembler         :AVR Studio 4.05 
 ; 
 ;************************************************************************** 

    .include "m163def.inc" 

    .org   $000 
    rjmp   reset      ;Reset Handle 

 ;/****************** 
 ; Define Register 
 ;/****************** 
    .def   digit3      = r12 
    .def   digit2      = r13 
    .def   digit1      = r14 
    .def   drem8u      = r15 
    .def   counter1   = r16 
    .def   counter2   = r17 
    .def   counter3   = r18 
    .def   temp      = r19 
    .def   temp1      = r20 
    .def   Onewire_Data   = r21 
    .equ   ONE_WIRE   = 0 ;DQ = PB.0 

 ;/****************** 
 ; Main Program 
 ;/****************** 
 reset:   ldi   temp,low(RAMEND) 
    out   SPL,temp   ;init Stack Pointer 
    ldi   temp,high(RAMEND) 
    out   SPH,temp 
    ser   temp 
    sbi   DDRB,ONE_WIRE 
    sbi   PORTB,ONE_WIRE 

 main:   sbi   UCR,TXEN 
    ldi   temp,51      ;9600 bps, f = 8 MHz 
    out   UBRR,temp 
    ldi   ZH,high(2*DS1820TB) 
    ldi   ZL,low(2*DS1820TB) 
    rcall   Intro 

 Loop:   rcall   ONEWIRE_RST 
    ldi   Onewire_Data,$CC ;skip rom command 
    rcall   ONEWIRE_WR 
    ldi   Onewire_data,$44 ;Convert temperature command 
    rcall   ONEWIRE_WR 
    rcall   ONEWIRE_RST 
    ldi   Onewire_Data,$CC ;skip rom command 
    rcall   ONEWIRE_WR 
    ldi   Onewire_Data,$BE ;read scratchpad command 
    rcall   ONEWIRE_WR 
    rcall   ONEWIRE_RD   ;Get data 
    rcall   ONEWIRE_RST 

    clc 
    set 
    ror   Onewire_Data 
    brcs   conv_t 
    clt 
 conv_t:   rcall   Hex_to_BCD   ;convert hexadecimal to bcd 
    mov   Onewire_Data,digit3 
    cpi   Onewire_Data,$31 
    breq   send_digit3   ;digit 100 
    ldi   Onewire_Data,0 
 send_digit3: 
    rcall   TX_Byte 
    mov   Onewire_Data,digit2 ;digit 10 
    rcall   TX_Byte 
    mov   Onewire_Data,digit1 ;digit 1 
    rcall   TX_Byte 
    ldi   Onewire_Data,'.' ;. 
    rcall   TX_Byte 
    ldi   Onewire_Data,'5' 
    brts   Send 
    ldi   Onewire_Data,'0' 
 Send:   rcall   TX_Byte 
    ldi   Onewire_Data,' ' 
    rcall   TX_Byte 
    ldi   Onewire_Data,'C' 
    rcall   TX_Byte 
    ldi   Onewire_Data,0x0D 
    rcall   TX_Byte 
    rcall   delay200ms 
    rjmp   Loop 

 ;/****************************************** 
 ;/   1WIRE reset and presence pulse 
 ;/****************************************** 
 ONEWIRE_RST: 
    cbi   PORTB,ONE_WIRE 
    ldi   temp1,13 
    rcall   delayx50us 
    sbi   PORTB,ONE_WIRE 
    ldi   temp1,45 
    rcall   delayx1us 
 Wait_Pres: sbic   PINB,ONE_WIRE 
    rjmp   Wait_Pres 
 Wait_Pres1: sbis PINB,ONE_WIRE 
    rjmp   Wait_Pres1 
    ret 

 ;/************************************ 
 ;/   write data 1 byte 
 ;/   output:   Onewire_Data 
 ;/************************************ 
 ONEWIRE_WR: ldi   counter1,8   ;write 8 bit 
 Sub_1WireWR: 
    cbi   PORTB,ONE_WIRE 
    ldi   temp1,2 
    rcall   delayx1us 
    ror   Onewire_Data   ;LSB frist out 
    brcc   Sub_1WireWR_1 
    sbi   PORTB,ONE_WIRE 
 Sub_1WireWR_1: 
    ldi   temp1,65 
    rcall   delayx1us 
    sbi   PORTB,ONE_WIRE 
    ldi   temp1,2 
    rcall   delayx1us 
    dec   counter1 
    brne   Sub_1WireWR 
    ret 

 ;/********************************************* 
 ;/   Read data 1 byte 
 ;/   input:   Onewire_Data 
 ;/********************************************* 
 ONEWIRE_RD: ldi   counter1,8   ;read 8 bit 
 Sub_1WireRD: 
    cbi   PORTB,ONE_WIRE 
    ldi   temp1,2 
    rcall   delayx1us 
    sbi   PORTB,ONE_WIRE 
    ldi   temp1,4 
    rcall   delayx1us 
    clc 
    sbic   PINB,ONE_WIRE 
    sec 
    ror   Onewire_Data 
    ldi   temp1,45 
    rcall   delayx1us 
    dec   counter1 
    brne   Sub_1WireRD 
    ret 

 ;/********************************************* 
 ;/ convert data from hexcode to BCD code 
 ;/ input : Onewire_data 
 ;/ output: digit3,2,1 
 ;/********************************************* 
 Hex_to_BCD: mov   temp,Onewire_data 
    ldi   temp1,100 
    rcall   Divide8u   ;temp:drem8u=Onewire_data/100 
    subi   temp,-$30   ;temp = temp + 0x30 
    mov   digit3,temp 

    mov   temp,drem8u 
    ldi   temp1,10 
    rcall   Divide8u   ;temp:drem8u=Onewire_data/10 
    subi   temp,-$30 
    mov   digit2,temp 

    mov   temp1,drem8u 
    subi   temp1,-$30 
    mov   digit1,temp1 
    ret 

 ;/******************************** 
 ;/ divide 8/8 unsign 
 ;/ result/dividend : temp 
 ;/ remainder      : drem8u 
 ;/ divisor      : temp1 
 ;/******************************** 
 Divide8u: push   counter3 
    sub   drem8u,drem8u   ;clear register and carry 
    ldi   counter3,9 
 d8u_1:   rol   temp      ;shift out MSB to carry flag 
    dec   counter3 
    brne   d8u_2 
    pop   counter3 
    ret 

 d8u_2:   rol   drem8u      ;shift get carry flag into LSB 
    sub   drem8u,temp1 
    brcc   d8u_3      ;if temp1 > drem8u do nothing 
    add   drem8u,temp1 
    clc 
    rjmp   d8u_1 
 d8u_3:   sec 
    rjmp   d8u_1 

 ;/********************* 
 ;/ Display data 
 ;/********************* 
 Intro:   lpm 
    tst   r0 
    breq   end_sub 
 TX232:   sbis   USR,UDRE 
    rjmp   TX232 
    out   UDR,r0 
    adiw   ZL,1 
    rjmp   Intro 
 end_sub: ret 

 TX_Byte: sbis   USR,UDRE 
    rjmp   TX_Byte 
    out   UDR,Onewire_Data 
    ret 

 ;/*************************************************** 
 ;/ delay time 
 ;/ Note: These delay Programs use frequency = 8 mhz 
 ;/*************************************************** 
 delayx1us: push   counter1 
    mov   counter1,temp1 
 delayx1us_1: 
    push   counter1 
    pop   counter1 
    nop 
    dec   counter1 
    brne   delayx1us_1 
    pop   counter1 
    ret 

 delayx50us: push counter1 
    push   counter2 
    mov   counter1,temp1 
 delayx50us_1: 
    ldi   counter2,100 
 delayx50us_2: 
    nop 
    dec   counter2 
    brne   delayx50us_2 
    dec   counter1 
    brne   delayx50us_1 
    pop   counter2 
    pop   counter1 
    ret 

 delay1ms: push   counter1 
    push   counter2 
    ldi   counter1,8 
 delay1ms_1: 
    ldi   counter2,250 
 delay1ms_2: 
    nop 
    dec   counter2 
    brne   delay1ms_2 
    dec   counter1 
    brne   delay1ms_1 
    pop   counter2 
    pop   counter1 
    ret 

 delay30ms: ldi   counter1,240 
 delay30ms_1: 
    ldi   counter2,250 
 delay30ms_2: 
    nop 
    dec   counter2 
    brne   delay30ms_2 
    dec   counter1 
    brne   delay30ms_1 
    ret 

 delay200ms: push counter3 
    ldi   counter3,200 
 delay200ms_1: 
    rcall   delay1ms 
    dec   counter3 
    brne   delay200ms_1 
    pop   counter3 
    ret 


 ;/****************** 
 ; code segment 
 ;/****************** 
 DS1820TB: .db   0x0a,0x0d,"Measure temperature with DS1820. ",0x0a,0x0d,0 
snigelen
Inlägg: 815
Blev medlem: 8 maj 2009, 11:02:14
Ort: Lund

Re: DS1820 Värmer sig själv.

Inlägg av snigelen »

Jag har bara kollat reset-pulsen men det verkar vara brottningsmatch redan där. Eftersom AVR (inte XMega) normalt inte har open drain utgångar så får man simulera det genom att endera ha låg utgång eller flytande ingång. Reset-pulsen sätts låg och sedan måste den ju släppa bussen men den verkar dra den hög i stället, samtidigt som enheterna på bussen skall hålla den låg för att indikera närvaro (så vitt jag kan se).
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: DS1820 Värmer sig själv.

Inlägg av Icecap »

Man brukar simulera open-drain vid att ställa out-registret till '0' och sedan styra med direction-registret.

Men i databladet anges det ganska tydligt att man bör avläsa rimligt sällsynt för att undvika egenuppvärmningen.
snigelen
Inlägg: 815
Blev medlem: 8 maj 2009, 11:02:14
Ort: Lund

Re: DS1820 Värmer sig själv.

Inlägg av snigelen »

Någon eller ett par tiondels grader självuppvärmning kan man kanske räkna med om man läser typ en gång per sekund. Är det 4-6 grader måste nog något vara fel.
danielr112
Inlägg: 8092
Blev medlem: 18 januari 2009, 00:48:24
Ort: Alvesta, Småland

Re: DS1820 Värmer sig själv.

Inlägg av danielr112 »

4-6 grader tycker jag också låter mycke. Om man nu inte konstant läser av den och har den i en sluten box...

Hur är sensorn kopplad? Parasit? o.s.v
Användarvisningsbild
Fagge
Inlägg: 3930
Blev medlem: 27 maj 2003, 13:59:51
Ort: Blekinge

Re: DS1820 Värmer sig själv.

Inlägg av Fagge »

Nej ingen parasitmatning, & bara 1 sensor kopplad. Inte häller några andra funktioner kopplade till PortB. 1Hz Uppdaterings frek, men det kvittar även om jag sätter var 10e sek.
Jag hänger med på precis vad ni menar, Och har nu skrivit om dessa 3 aktuella rutinerna, så att PortB,0 antingen funkar som en ingång & automatisk blir en 1a tack vare pullup resistorn, eller så ändrar jag DDRB registret till utgång, & då dras datalinjen automatiskt mot nolla.

Men lika förbannat skenar tempen iväg. Det är 27grader inne, & sensorn visar 35c efter typ 10min. Men vid kallstart visar den rätt temperatur.

Kod: Markera allt

 ;/****************************************** 
 ;/   1WIRE reset and presence pulse 
 ;/****************************************** 
 ONEWIRE_RST: 
	sbi   DDRB,ONE_WIRE	; PortB,0 = out-Low
	rcall	Delay_480us
   
   	Cbi   DDRB,ONE_WIRE	; PortB,0 = In-pullup Hi
    rcall	Delay_60us
	
 Wait_Pres: sbic   PINB,ONE_WIRE 
    rjmp   Wait_Pres 
 Wait_Pres1: sbis PINB,ONE_WIRE 
    rjmp   Wait_Pres1 
	ret 

 ;/************************************ 
 ;/   write data 1 byte 
 ;/   output:   Onewire_Data 
 ;/************************************ 
 ONEWIRE_WR: 
 ldi   counter1,8   ;write 8 bit 
 Sub_1WireWR: 
	sbi   DDRB,ONE_WIRE	; PortB,0 = out-Low
   
    rcall	Delay_1us
    ror   Onewire_Data   ;LSB frist out 
    brcc   Sub_1WireWR_1 
	Cbi   DDRB,ONE_WIRE	; PortB,0 = In-pullup Hi
   
 Sub_1WireWR_1: 
	rcall	Delay_60us
	cbi   DDRB,ONE_WIRE	; PortB,0 = In-pullup Hi
    rcall	Delay_1us 
    dec   counter1 
    brne   Sub_1WireWR 
    ret 


 ;/********************************************* 
 ;/   Read data 1 byte 
 ;/   input:   Onewire_Data 
 ;/********************************************* 
 ONEWIRE_RD:	
	
	ldi   counter1,8   ;read 8 bit 
 Sub_1WireRD: 

	sbi   DDRB,ONE_WIRE	; PortB,0 = out-Low
    rcall	Delay_1us
	Cbi   DDRB,ONE_WIRE	; PortB,0 = In-pullup Hi
 	rcall	Delay_5us
	clc 
		
    sbic   PINB,ONE_WIRE 
    sec 
    ror   Onewire_Data 
    
    rcall   Delay_60us 
	dec   counter1 
    brne   Sub_1WireRD 
	ret 
victor_passe
Inlägg: 2436
Blev medlem: 28 januari 2007, 18:45:40
Ort: Kungsbacka

Re: DS1820 Värmer sig själv.

Inlägg av victor_passe »

Mät strömmen på vss och vcc på sensorn och se om det går någon mA där.
Testa även att sätta ett motstånd på ca 1k i serie med data pinnen, tag sedan osilloscope och mät på båda punkterna mot jort och sätt oscilloscopet på A-B och se om signalen blir någon volt och när.
Användarvisningsbild
Fagge
Inlägg: 3930
Blev medlem: 27 maj 2003, 13:59:51
Ort: Blekinge

Re: DS1820 Värmer sig själv.

Inlägg av Fagge »

Gaaahhhh.
Gjorde som du sa Victor_passe. Lödde loss sensorn från kretskortet & satte emellan 20cm kabel för att underlätta labbandet.
Började mäta, & efter en stund upptäckte att tempen visar ju helt rätt.
Tar bort alla motstånd i serie = ingen förändring, tempen är rätt.
Sen känner jag med fingret på kretskortets lödpaddar & där är det mycket riktigt ca35grader varmt.

DS-sensorns paddar sitter ju ihopkopplad med den ljumna processorn med bara 1mm avstånd.
/
Så ja, tack för hjälpen gubbar, 2 dagars frustration & en erfarenhet rikare :)
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: DS1820 Värmer sig själv.

Inlägg av Icecap »

Ha ha ha :rofl

Jag har sagt det förut och jag säger det igen: temperatur är svår att mäta på rätt sätt!
Användarvisningsbild
tecno
Inlägg: 27248
Blev medlem: 6 september 2004, 17:34:45
Skype: tecnobs
Ort: Sparreholm, Södermanland N 59° 4.134', E 16° 49.743'
Kontakt:

Re: DS1820 Värmer sig själv.

Inlägg av tecno »

en erfarenhet rikare :)
Inte så dumt alls, bra att det löste sig för nog var det ju bra skumt fel.
Skriv svar