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
return
testade 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...