1-Wire... Hur?

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
Användarvisningsbild
rickeboy
Inlägg: 678
Blev medlem: 13 augusti 2003, 09:12:17
Ort: Göteborg / Karlskrona
Kontakt:

1-Wire... Hur?

Inlägg av rickeboy »

Hoj!
Ngn som har gett sig i kast med 1-wire produkter och lyckats? Själv har jag ett antal I-buttons samt lite läsare av sådana liggandes, har även några temperatur mätare, men jag har ärligt talat inte en aning om hur jag ska lyckas använda dem...

Skulle uppskatta hjälp till PIC och till Basic Stamp... helt enkelt hur man gör... kod, tips etc...

//Rille
Användarvisningsbild
anlamotte
Inlägg: 859
Blev medlem: 5 augusti 2003, 15:54:34
Ort: Stockholm
Kontakt:

Inlägg av anlamotte »

testade med en 1820 temp-sensor en gång... kan försöka förklara
lite hur det fungerar..

all kommunikation sker över endast 1 ledare, denna ansluts
till en I/O port på den mikrokontroller, när du vill skriva data
till en komponent som är ansluten till 1Wire, sätter du I/O pinnen
som utgång...

för att skriva en etta drar du ner I/O pinnen till 0V i mindre
än 15uS, för att skriva en nolla mer än 60uS.

när du ska läsa data sätter du I/O pinnen som utgång.
drar ner den till 0V och sätter den sen genast som ingång
nu kan biten läsas från I/O pinnen.
Användarvisningsbild
rickeboy
Inlägg: 678
Blev medlem: 13 augusti 2003, 09:12:17
Ort: Göteborg / Karlskrona
Kontakt:

Inlägg av rickeboy »

Hmmm... okej... tror faktiskt jag förstår... tillvis del iaf...

Med vad gjorde du detta? PIC lr? har du kod exempel?

Var får jag reda på vilka "kommandon" jag kan skicka till den?

//Rille
netbear
Inlägg: 116
Blev medlem: 27 maj 2003, 21:52:29
Ort: Karlskrona
Kontakt:

Inlägg av netbear »

Hej
Här är lite kod som jag använder för att läsa temperaturen från en ds1821 koden är för pic16f84. Delay koden finns ej med här... om någon är intresserad av hela koden så får ni maila mig... kommer att lägga ut den på min hemsida så småningom.
http://www.net-bear.com

/Björn

Kod: Markera allt

;-----------------------------------------------
;-- DS1821 ROUTINES
;-----------------------------------------------
;-- Init the ds1821
ds1821_init
	call		ds1821_hi
	nop
	call		ds1821_lo

	movlw	d'50'						; 500usek
	call		Delay10uX

	call		ds1821_hi

	movlw	d'50'						; 500usek
	call		Delay10uX

	return

;-- Read one byte
ds1821_read
	clrf		thtmp
	movlw	d'8'
	movwf	bitcount
ds1821_read_0
	call		ds1821_lo
	nop
	call		ds1821_hi
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	btfss		TH
	bcf		STATUS, C
	btfsc		TH
	bsf		STATUS, C

	rrf		thtmp, 1

	movlw	d'6'
	call		Delay10uX					; Vänta i 60 u

	decfsz	bitcount, 1
	goto		ds1821_read_0

	movf		thtmp, 0
	return

;-- Write one byte
ds1821_write
	movwf	thtmp
	movlw	d'8'
	movwf	bitcount
ds1821_write_0
	rrf		thtmp, 1
	btfss		STATUS, C
	call		ds1821_out0
	btfsc		STATUS, C
	call		ds1821_out1

	decfsz	bitcount, 1
	goto		ds1821_write_0

	return

;-- Send 0
ds1821_out0
	call		ds1821_lo
	movlw	d'6'
	call		Delay10uX
	call		ds1821_hi
	return


;-- Send 1
ds1821_out1
	call		ds1821_lo
	nop
	call		ds1821_hi
	movlw	d'6'
	call		Delay10uX
	return

;-- Keep it low, output
ds1821_lo
	bcf		TH
	bsf		STATUS, RP0
	bcf		TH_TRIS
	bcf		STATUS, RP0
	return

;-- Let the pulup keep it high, input
ds1821_hi
	bsf		STATUS, RP0
	bsf		TH_TRIS
	bcf		STATUS, RP0
	return

;-- Start convertion
ds1821_start
	call		ds1821_init
	movlw	h'EE'
	call		ds1821_write
	call		Delay100     ; Klantig kod men orkade inte skriva om delayrutinen. Måste vänta en sek eller så innan den första temperaturen fins klar för läsning
	call		Delay100
	call		Delay100
	call		Delay100
	call		Delay100
	call		Delay100
	call		Delay100
	call		Delay100
	call		Delay100
	call		Delay100
	return

;-- Stop convertion
ds1821_stop
	call		ds1821_init
	movlw	h'22'
	call		ds1821_write
	return

;-- Read temp
ds1821_temp
	call		ds1821_init
	movlw	h'AA'
	call		ds1821_write
	call		ds1821_read
	movwf	degrees

	btfss		degrees, 7					; Kolla om talet är negativt
	return
									; Talet är negativt lite mer behöver göras.
	movlw	b'11111111'
	subwf	degrees, 1
	movlw	b'10000001'
	addwf	degrees, 1

	return

;-- Write status register
ds1821_write_status

	call		ds1821_read_status
	bcf		thstatus, 0
	bcf		thstatus, 2

	call		ds1821_init
	movlw	h'0C'
	call		ds1821_write

	movf		thstatus, 0
	call		ds1821_write

	return

;-- Read status register
ds1821_read_status
	call		ds1821_init
	movlw	h'AC'
	call		ds1821_write
	call		ds1821_read
	movwf	thstatus
	return
Användarvisningsbild
anlamotte
Inlägg: 859
Blev medlem: 5 augusti 2003, 15:54:34
Ort: Stockholm
Kontakt:

Inlägg av anlamotte »

rickeboy skrev:Hmmm... okej... tror faktiskt jag förstår... tillvis del iaf...

Med vad gjorde du detta? PIC lr? har du kod exempel?

Var får jag reda på vilka "kommandon" jag kan skicka till den?

//Rille
testade en gång med Bascom AVR, bascom har
inbyggda kommandon för 1Wire, men jag har
inte testat dessa.

Kod: Markera allt


$crystal = 8000000
$regfile = "m16def.dat"

Declare Sub Initlcd()

Dim Command As Byte                                         ' kommando...
Dim I As Byte                                               
Dim Temp As Word , Temp2 As Word
Dim Char As Byte

Dim Temp_t As String * 15
Dim T_te As String * 1

Config Porta = Output                                       ' D0-D7
Config Pinc.5 = Output                                      ' RS
Config Pinc.6 = Output                                      ' R/W
Config Pinc.7 = Output                                      ' E
Config Pind.6 = Output                                      ' DS1820

Portc.6 = 0
Waitms 200                                                  ' R/W = 0
Call Initlcd
Waitms 100                                                  ' Vänta på LCD..

Mainloop:
        Gosub Init1820                                      ' Init DS1820

        Command = &HCC                                      ' Skip ROM command
        Gosub Write1820

        Command = &H44                                      ' Mät temperatur
        Gosub Write1820

        Waitms 500                                          ' Vänta en stund

        Gosub Init1820                                      ' Init DS1820

        Command = &HCC                                      'Skip ROM command
        Gosub Write1820

        Command = &HBE                                      ' Läs temperaturen
        Gosub Write1820
        Gosub Read1820

     Char = &B00000001 : Gosub Lcdcmd     ' Clear LCD

     Temp2 = Temp
     Shift Temp2 , Right , 1


     Temp_t = Str(temp2)
     Temp_t = Format(temp_t , "00")

   For I = 1 To 2
     T_te = Mid(temp_t , I , 1)
     Char = Asc(t_te)
     Gosub Lcdwr
   Next I

   Char = "," : Gosub Lcdwr
   If Temp.0 = 1 Then
     Char = "5" : Gosub Lcdwr
   Else
     Char = "0" : Gosub Lcdwr
   End If
Goto Mainloop                                               ' igen.......

Init1820:
        Portd.6 = 0                                         ' Data pin = LÅG
        Config Pind.6 = Output                              ' DS1820
        Waitus 500                                          ' Vänta > 480us
        Config Pind.6 = Input                               ' DS1820

        Waitus 100
        If Pind.6 = 1 Then
        Waitms 500
                Goto Mainloop                               ' Ingen DS1820, försök igen
        End If
        Waitms 4                                            ' Vänta...
        Return


Write1820:
        For I = 1 To 8                                      ' 8 bitar
           If Command.0 = 0 Then
              Gosub Write0                                  ' Skriv en etta
            Else
              Gosub Write1                                  ' Skriv en nolla
           End If
           Shift Command , Right , 1
         Next I
Return


Write0:
        Portd.6 = 0
        Config Pind.6 = Output                              ' DS1820
        Waitus 100                                          ' Låg > 60us
        Config Pind.6 = Input                               ' DS1820
        Return

Write1:
        Portd.6 = 0                                         ' Låg < 15us 
        Config Pind.6 = Output                              ' DS1820
        Waitus 1                                            ' Vänta 1us 
        Config Pind.6 = Input                               ' DS1820
        Waitus 60                                           ' VÄnta
        Return

Read1820:
        For I = 1 To 16                                     ' 16 bitar
           Shift Temp , Right , 1
           Gosub Readbit                                    ' Läs bit...
        Next I
        Return

Readbit:
        Temp.15 = 1                                         
        Portd.6 = 0
        Config Pind.6 = Output                              ' DS1820
        Waitus 1                                            ' Vänta 1us

        Config Pind.6 = Input
        If Pind.6 = 0 Then
                Temp.15 = 0                                 
        End If
        Waitus 60                                           ' Vänta
        Return

Sub Initlcd()
  Char = &B00000000 : Gosub Lcdcmd
  Char = &B00000001 : Gosub Lcdcmd
  Char = &B00000011 : Gosub Lcdcmd
  Char = &B00000110 : Gosub Lcdcmd
  Char = &B00001100 : Gosub Lcdcmd
  Char = &B00111000 : Gosub Lcdcmd
  Char = &B00000000 : Gosub Lcdcmd
  Char = &B00000001 : Gosub Lcdcmd
End Sub

Lcdcmd:
  Portc.5 = 0
Lcdwr:
  Waitms 5
  Porta = Char
  Pulseout Portc , 7 , 30
  Portc.5 = 1
Return:

programmet ligger konstant och läser av temperaturen och visar
den sedan på en LCD...
Användarvisningsbild
rickeboy
Inlägg: 678
Blev medlem: 13 augusti 2003, 09:12:17
Ort: Göteborg / Karlskrona
Kontakt:

Inlägg av rickeboy »

Netbear: vet inte om jag kommer ngn vart med koden fårse... tack ändå!

anlamotte: Ser avancerat ut... fårse om det kan tänkas hjälpa mig... tack ändå!

Tror nog jag kommer ge mig på ett försök i början av nästa vecka...

//Rille
Skriv svar