I have been experimenting with Dallas 1-wire devices and ibuttons. I had a look though the melabs list but only found one search device example and did not manage to get it to work right.
I did a complete rewrite and here it is. It follows the routine as found in the Dallas aplication note 187.
The note has a nice flowchart and I used the variable names that are in the chart.
'************************************************* ***************
'* Name : ID_ROM_9.pbp *
'* Author : Jim Morrissey *
'* Notice : Copyright (c) 2006 Jim Morrissey *
'* : All Rights Reserved *
'* Date : 07/04/2006 *
'* Version : 9.00 *
'* Notes : *
'* : using bootstrap loader on 16F876 *
'* : and 10 Mhz clock *
'* : Flow Chart in Dallas Application Note 187 *
'************************************************* ***************
DEFINE LOADER_USED 1 'for bootstrap loader
DEFINE OSC 10
DQ VAR PORTB.1 ' one wire data pin "DQ" on PORTB 1
SEARCH_ROM CON $F0
id_bit VAR Bit ' result of bit read from SearchROM command
cmp_id_bit VAR Bit ' complement of the bit read
LastDeviceFlag VAR Bit ' flag previous search was last device
search_direction VAR Bit ' bit indicates direction of search.
id_bit_number VAR Byte ' The ROM bit number currently being searched
LastDiscrepancy VAR byte ' bit index from which bit (next)search
' discrepency check should start
LastFamilyDiscrepancy VAR byte ' bit index identifies last discrepacy
' within first 8 bit family code of ROM
last_zero VAR byte ' bit position of last zero written
ROM_NO VAR Byte(8) ' Current ROM number being searched
DeviceCount VAR Byte ' devices found
'Set up VARiables to run program at start.
DeviceCount = 0
LastFamilyDiscrepancy = 0
LastDiscrepancy = 0
LastDeviceFlag = 0
last_zero = 0
Pause 3000
SEROUT2 PORTC.6,84,[ 13, 10, 13, 10, "1-wire Device Search Version 9.0", 10,13,10,13]
'Device loop: loop for all devices on the bus, until there are no more.
Device_loop:
OWOUT DQ,1 'Send the Search ROM command
IF LastDeviceFlag = 1 THEN Done
id_bit_number = 1
last_zero = 0
OWOUT DQ,0,[SEARCH_ROM] 'Send the Search ROM command (FO)
'************************** Check bit routine *************************
Check_bit:
OWIN DQ,4,[id_bit, cmp_id_bit] 'Get response from device
IF (id_bit = 1 And cmp_id_bit = 1) THEN GOTO No_device
IF NOT ((id_bit = 0) and (cmp_id_bit = 0)) THEN
search_direction = id_bit
ROM_NO.LowBit[id_bit_number-1] = search_direction
ENDIF
IF ((id_bit = 0) and (cmp_id_bit = 0)) THEN gosub conflict
OWOUT DQ,4,[search_direction] ' send 1 or 0 as search direction
id_bit_number = id_bit_number+1 ' incredement id_bit_number
IF id_bit_number <= 64 THEN Check_bit 'head back for next bit
IF id_bit_number > 64 THEN LastDiscrepancy = last_zero
IF LastDiscrepancy = 0 THEN LastDeviceFlag = 1
'************************************************* *********************
SEROUT2 PORTC.6,84,["Typ:", HEX2 ROM_NO[0], "h "]
SEROUT2 PORTC.6,84,["ID:", HEX2 ROM_NO[6],HEX2 ROM_NO[5],HEX2 ROM_NO[4],HEX2 ROM_NO[3],HEX2 ROM_NO[2],HEX2 ROM_NO[1],"h "]
SEROUT2 PORTC.6,84,["CRC:", HEX2 ROM_NO[7], "h", 13, 10]
deviceCount = deviceCount + 1
IF LastDeviceFlag = 0 THEN Device_loop
SEROUT2 PORTC.6,84,[13, 10, DEC deviceCount, " device(s).", 10, 13,10,13]
GOTO Done
END
'************************** Subs ************************************
NO_device: ' Since both response bits are 11, there are no devices
SEROUT2 PORTC.6,84,[" No devices present", 10, 13]
END
Done:
LastFamilyDiscrepancy = 0
LastDiscrepancy = 0
LastDeviceFlag = 0
SEROUT2 PORTC.6,84,[" ------------ All done ---------------", 10, 13]
END
conflict:
' id_bit_number = LastDiscrepancy then take "1" path
IF ((id_bit_number) = LastDiscrepancy) THEN
search_direction = 1
ROM_NO.LowBit[id_bit_number-1] = search_direction
ENDIF
'id_bit_number > LastDiscrepancy then take the "0" path
IF (id_bit_number > LastDiscrepancy) THEN
search_direction = 0
ROM_NO.LowBit[id_bit_number-1] = search_direction
GOSUB Family
ENDIF
' id_bit_number < LastDiscrepancy then take same path as last time
IF (id_bit_number < LastDiscrepancy) THEN
search_direction = ROM_NO.LowBit[id_bit_number-1]
IF search_direction = 0 THEN GOSUB Family
ENDIF
return
Family: 'LastFamilyDiscrepancy bit index set
last_zero = id_bit_number
IF last_zero <9 THEN
LastFamilyDiscrepancy = last_zero
endIF
RETURN
Bookmarks