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
			
			
									
									
						1-Wire... Hur?
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.
			
			
									
									
						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.
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
			
			
									
									
						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
	returntestade en gång med Bascom AVR, bascom harrickeboy 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
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:
den sedan på en LCD...
				