Beste CO'ers,

Ik ben van plan om meerdere DS18S20 Temp sensoren uit te gaan lezen met behulp van een Pic, deze waarden moeten weer worden gegeven op een 16x2 LCD scherm.

Mijn probleem is nu hoe ik meerdere van deze sensoren kan inlezen, hoe zit het met de adressen van deze sensoren, en hoe kan ik commando's naar de verschillende sensoren sturen ?

ik heb een voorbeeld code gevonden maar deze is geschikt voor een enkele DS18S20.

alvast bedankt,
Dutchmania

Voor 't simpele zou je iedere DS18S20 z'n eigen datapin kunnen geven.
En als je alles op 1 bus zet moet je gebruik gaan maken van de ROM-codes: iedere sensor apart adresseren.

[Bericht gewijzigd door picsels op (44%)]

In de voorbeeldcode die je hebt gevonden zal ergens een serienummer staan van de device die wordt benaderd.

Als je meerdere devices hebt uit te lezen, dan itereer je simpelweg over de serienummers van je devices.

Serienummers van je devices kan je achterhalen met het programma digitemp.
Google daar maar op.

ik heb met oshonsoft basic wel eens meerder op 1 pin uit gelezen....

ik heb toen eerst een test programma geschreven, welke het adres uit las van een ds1820..

die codes opgeschreven...

en toen in een ander programma die adressen gebruikt...

ff zoeken naar de basic programma's...

 
Define 1WIRE_REG = PORTE
Define 1WIRE_BIT = 2

1wireInit
1wireSendByte 0x55, 16, 89, 140, 233, 0, 8, 0, 5
1wireSendByte 0x44
WaitMs 1
loop1:
1wireGetBit finish1
If finish1 = 0 Then Goto loop1
1wireInit
1wireSendByte 0x55, 16, 89, 140, 233, 0, 8, 0, 5
1wireSendByte 0xbe
1wireGetByte temp1, sign1

1wireInit
1wireSendByte 0x55, 16, 100, 123, 233, 0, 8, 0, 85
1wireSendByte 0x44
WaitMs 1
loop2:
1wireGetBit finish2
If finish2 = 0 Then Goto loop2
1wireInit
1wireSendByte 0x55, 16, 100, 123, 233, 0, 8, 0, 85
1wireSendByte 0xbe
1wireGetByte temp2, sign2


Gosub clear_workscr

'----------------------------------------------
GLcdposition 3, 0
dec1 = temp1 Mod 2
If dec1 = 1 Then
dec1 = 5
Endif
temp1 = temp1 / 2

GLcdwrite "T-bi:",
If sign1 = 0 Then
GLcdwrite "+"
Else
GLcdwrite "-"
Endif

If temp1 < 10 Then
GLcdwrite "0", #temp1, ".", #dec1
Else
GLcdwrite #temp1, ".", #dec1
Endif
GLcdposition 11, 0
GLcdout 0x00, 0x0f, 0x09, 0x09, 0x0f, 0x00, 0x7e, 0x81, 0x81, 0x81, 0x42
'--------------------------------------------------
GLcdposition 4, 0
WaitMs 1

dec2 = temp2 Mod 2
If dec2 = 1 Then
dec2 = 5
Endif
temp2 = temp2 / 2

GLcdwrite "T-bu:",
If sign2 = 0 Then
GLcdwrite "+"
Else
GLcdwrite "-"
Endif

If temp2 < 10 Then
GLcdwrite "0", #temp2, ".", #dec2
Else
GLcdwrite #temp2, ".", #dec2
Endif

GLcdposition 12, 0
GLcdout 0x00, 0x0f, 0x09, 0x09, 0x0f, 0x00, 0x7e, 0x81, 0x81, 0x81, 0x42

hiermee las ik ze uit.... hier als voorbeeld 2 sensoren...

maar nu nog dat deel wat dat adress las..
kan ik even niet meer vinden.... [edit: gevonden]

ik geloof er eerst 33H naar tot te zenden... zoiets...
ik zoek even verder...


Define CLOCK_FREQUENCY = 20

AllDigital

TRISA = 0
TRISB = 0
TRISC = 0
TRISD = 0

Define GLCD_DREG = PORTD
Define GLCD_RSREG = PORTB
Define GLCD_RSBIT = 4
Define GLCD_EREG = PORTB
Define GLCD_EBIT = 6
Define GLCD_RWREG = PORTB
Define GLCD_RWBIT = 5
Define GLCD_CS1REG = PORTB
Define GLCD_CS1BIT = 3
Define GLCD_CS2REG = PORTB
Define GLCD_CS2BIT = 2

Define 1WIRE_REG = PORTE
Define 1WIRE_BIT = 2

Dim finish As Bit
Dim temp As Byte
Dim sign As Byte
Dim dec As Byte

Dim byte1 As Byte
Dim byte2 As Byte
Dim byte3 As Byte
Dim byte4 As Byte
Dim byte5 As Byte
Dim byte6 As Byte
Dim byte7 As Byte
Dim byte8 As Byte



GLcdinit



start:

WaitMs 2000

1wireInit
1wireSendByte 0x33
'WaitMs 1
'loop_temp:
'1wireGetBit finish
'If finish = 0 Then Goto loop_temp
'1wireInit
'1wireSendByte 0xcc, 0xbe
1wireGetByte byte1, byte2, byte3, byte4, byte5, byte6, byte7, byte8

GLcdposition 0, 0
GLcdwrite #byte1, ",", #byte2
GLcdposition 1, 0
GLcdwrite #byte3, ",", #byte4
GLcdposition 2, 0
GLcdwrite #byte5, ",", #byte6
GLcdposition 3, 0
GLcdwrite #byte7, ",", #byte8


Goto start

gevonden... hiermee heb ik die adressen gevonden..

16, 89, 140, 233, 0, 8, 0, 5

16=10H omdat het een DS1820

dan 48bits unique serial number
en de laaste 8 bits is the CRC van de eerst 56 bits..

hoop dat je hier iets aan heb....

volgens deze pdf : http://olimp.infomir.kiev.ua/docs/PDF/1820.pdf

Als eerste bedankt voor de reacties,
Ben al een stukje verder gekomen maar omdat m'n programmer stuk is kan ik helaas nog niets in de praktijk testen.

@Picsels
Ik denk ook dat meerdere datapinnen de snelste en simpelste oplossing is maar misschien niet de mooiste, ik ben van plan minimaal 4 sensoren te gaan gebruiken met misschien een uitbreiding, dan heb je wel weer 4 of meer datapinnen die je niet meer voor andere dingen kunt gebruiken.
Ik houd deze oplossing in ieder geval achter de hand voor als het echt niet anders kan.

@Boudie
Het is inderdaad makkelijk als je de adressen weet van de sensoren maar die zijn helaas niet bekend.
Het programma digitemp ziet er goed uit maar is helaas voor Linux.

@Arjan
Het programma ziet er veelbelovend uit, eerst de adressen uitlezen en die daarna gebruiken is een optie maar het mooiste is om dat gewoon door de software te laten doen,
helaas zijn de commando's die je gebruikt hebt alleen geschikt als er maar 1 sensor aanwezig is.
Ik heb we in de datasheet het commando Search Rom gevonden waarmee alle adressen op de bus gevonden kunnen worden maar ik weet nog niet precies hoe dit in zijn werk gaat en hoe je de adressen hiermee kunt uitlezen, ik zal hierover in ieder geval nog wat meer info over opzoeken.

Een ander vraagje is wat het stukje "1wireInit" doet, zou je hier nog een stukje code voor willen posten.
ben nog niet zo'n held met 1-wire.

Dutchmania

Meerdere sensoren op 1-wire/pin
Wat als er een ds1820 defect raakt en vervangen moet worden?
Misschien het overwegen waard om dan 4 poorten te nemen tenzij je er een ini_ds1820 routine in maakt die gaat uitzoeken wat er aan hangt.
Of zie ik het verkeerd?

Een DS1820 reageert op een vaste en voorspelbare manier.
Het is vrij eenvoudig om vast te stellen of een sensor nog goed werkt.
Het wordt wel lastig als een defecte sensor de lijn geforceerd laag houdt waardoor ook de anderen op dezelfde bus niet meer (kunnen) reageren.

F0h command moet er een verhaal gemaakt kunnen worden zodat je zelf kan kijken wat er aan hangt....

het staat uitgelegd in de datasheet....

Heb even wat de datasheet nog een keer bekeken en dit forum nog een keer doorgespit maar kom niet veel meer te weten over het Search Rom commando dat ik wou gaan gebruiken, ik ben er niet achter gekomen hoe je de verschillende adressen kunt uitlezen.

Ik ga nu toch voor het idee van Arjan, eerst de adressen van de sensoren bepalen en deze adressen later weer toepassen in het hoofdprogramma,
zo is het ook makkelijker om te bepalen welke waarde bij welke sensor hoort.

Ben wel een stuk meer te weten gekomen over het 1-wire systeem gelukkig.

Bedankt voor de info,
Dutchmania

dan zet je deze regels in een progje,
,dat geeft keurig je rom code voor de
betreffende 1820..
er niet meer dan één aan hangen natuurlijk

OWrite dq, 1,[$33]
ORead dq,0,[ID1,ID2,ID3,ID4,ID5,ID6,ID7,ID8]
Print At 1,1,"Fam= ",HEX2 ID1," CrC= ", HEX2 ID8
Print At 2,1,"ID= ", HEX2 ID2, HEX2 ID3,HEX2 ID4,HEX2 ID5,HEX2 ID6,HEX2 ID7
end

(en kijk ook eens in je mail box)

@ Burner
Bedankt voor de reactie, zo was ik het zelf ook van plan.
Alleen doet mijn programmer het niet en kan ik dus niet testen :s

Als de programmer het gaan testen en dan laat ik het weten.

Dutchmania