' PROGRAM: 1_WIRE_SEARCH.bas ' ' WRITTEN BY DAVID PUROLA 9/18/2003 ' WRITTEN FOR PIC18F452-I/L MICROPROCESSOR ' ' ******************************************************************** ' Declare Variables ' ******************************************************************** SCRATCH VAR WORD 'SCRATCH VARIABLE SCRATCH1 VAR BYTE 'SCRATCH VARIABLE CRCData VAR Byte 'CRC CUMULATIVE DATA BYTE CRC VAR Byte 'CRC ENDING BYTE ONEWIRE VAR BYTE 'ONE WIRE RECEIVED DATA ID_BIT VAR BIT 'ID BIT STATE CMP_ID_BIT VAR BIT 'ID BIT COMPLEMENT ID_BIT_NO VAR BYTE 'ID BIT COUNTER LASTDEVFLG VAR BIT 'LAST DEVICE HISTORY BIT LASTDESC VAR BYTE 'LAST DEVICE DESCRIPTION LASTFAMDESC VAR BYTE 'LAST DEVICE FAMILY DESCRIPTION LAST_ZERO VAR BYTE 'LAST ZERO COUNTER ROM_NO VAR BYTE(8) 'STORAGE AREA FOR CURRENT ROM SERIAL NUMBER SEARCHDIR VAR BIT 'SEARCH DIRECTION BIT OK VAR BIT 'VALID DATA FLAG DALLAS_NO VAR BYTE 'DEVICE FOUND NUMBER DEVICES VAR BYTE(80) 'STORAGE LOCATIONS FOR 10 DEVICE SERIAL NUMBERS CLEAR '********************************************************************* 'MAIN LOOP FOR PROGRAM '********************************************************************* MODE1: 'DO ROM SEARCH FOR ANY DEVICES FOR SCRATCH = 0 TO 7 'clear rom number for first search ROM_NO[SCRATCH] = 0 NEXT DALLAS_NO = 255 LASTDEVFLG= 0 OK = 1 WHILE LASTDEVFLG = 0 GOSUB ONEWIRE_SEARCH IF OK = 1 THEN DALLAS_NO = DALLAS_NO + 1 LCDOUT $fe,$80,"TOTAL ROM NUMBERS FOUND= ",DEC2 DALLAS_NO + 1 FOR SCRATCH = 0 TO 7 DEVICES[(DALLAS_NO * 8) + SCRATCH] = ROM_NO[SCRATCH] NEXT ENDIF WEND 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ' DISPLAY ANY DEVICES FOUND FOR SCRATCH1 = 0 TO DALLAS_NO LCDOUT $fe,$C0,"SEARCH= " FOR SCRATCH = 7 TO 0 STEP -1 LCDOUT HEX2 DEVICES[(SCRATCH1 * 8) + SCRATCH] NEXT LCDOUT " ",DEC2 SCRATCH1 + 1 PAUSE 1000 NEXT GOTO MODE1 END '********************************************************************* ' Subroutines '********************************************************************* '********************************************************************* ONEWIRE_SEARCH: '********************************************************************* OWOUT SDA,1,[$F0] 'SEND RESET & SEARCH ROM COMMAND IF LASTDEVFLG = 1 THEN GOTO TWO ENDIF ID_BIT_NO = 1 LAST_ZERO = 0 RESEARCH: OWIN SDA,4,[ID_BIT] OWIN SDA,4,[CMP_ID_BIT] IF ID_BIT = 1 AND CMP_ID_BIT = 1 THEN GOTO TWO ELSE IF ID_BIT = 0 AND CMP_ID_BIT = 0 THEN IF ID_BIT_NO = LASTDESC THEN SEARCHDIR = 1 ELSE IF ID_BIT_NO > LASTDESC THEN SEARCHDIR = 0 ELSE SEARCHDIR = ROM_NO.0[ID_BIT_NO - 1] ENDIF ENDIF IF SEARCHDIR = 0 THEN LAST_ZERO = ID_BIT_NO IF LAST_ZERO < 9 THEN LASTFAMDESC = LAST_ZERO ENDIF ENDIF ELSE SEARCHDIR = ID_BIT ENDIF ENDIF ROM_NO.0[ID_BIT_NO - 1] = SEARCHDIR OWOUT SDA,4,[SEARCHDIR] ID_BIT_NO = ID_BIT_NO + 1 IF ID_BIT_NO > 64 THEN LASTDESC = LAST_ZERO IF LASTDESC = 0 THEN LASTDEVFLG= 1 ENDIF GOTO THREE ENDIF GOTO RESEARCH THREE: CRC = 0 FOR SCRATCH = 0 TO 7 CRCData = ROM_NO[SCRATCH] GOSUB CRC8LU NEXT IF CRC = 0 THEN 'GOOD ROM READBACK ADDRESS OK = 1 'SET FLAG TO STORE ADDRESS RETURN ENDIF TWO: LASTDEVFLG = 0 LASTDESC = 0 LASTFAMDESC = 0 OK = 0 RETURN '********************************************************************* ' ********** Subroutine CRC8LU ********** ' Expects CRC at some starting value with data to CRC ' passed in CRCData. ' Gives ending CRC value and destroys CRCData ' Uses CRCData-Byte, CRC-Byte CRC8LU: CRCData = CRCData ^ CRC Lookup CRCData,[0,94,188,226,97,63,221,131,194,156,126,32,163,253,31,65,_ 157,195,33,127,252,162,64,30,95,1,227,189,62,96,130,220,_ 35,125,159,193,66,28,154,160,225,191,93,3,128,222,60,98,_ 190,224,2,92,223,129,99,61,124,34,192,158,29,67,161,255,_ 70,24,250,164,39,121,155,197,132,218,56,102,229,187,89,7,_ 219,133,103,57,186,228,6,88,25,71,165,251,120,38,196,154,_ 101,59,217,135,4,90,184,230,167,249,27,69,198,152,122,36,_ 248,166,68,26,153,199,37,123,58,100,134,216,91,5,231,185,_ 140,210,48,110,237,179,81,15,78,16,242,172,47,113,147,205,_ 17,79,173,243,112,46,204,146,211,141,111,49,178,236,14,80,_ 175,241,19,77,206,144,114,44,109,51,209,143,12,82,176,238,_ 50,108,142,208,83,13,239,177,140,174,76,18,145,207,45,115,_ 202,148,118,40,171,245,23,73,8,86,180,234,105,55,213,139,_ 87,9,235,181,54,104,138,212,149,203,41,119,244,170,72,22,_ 233,183,85,11,136,214,52,106,43,117,151,201,74,20,246,168,_ 116,42,200,150,21,75,169,247,182,232,10,84,215,137,107], CRC ' PBP only handles 255 constants in the list (256 for 18Cxxx). Since table is ' indexed starting at zero, special case for $FF (256th element). If CRCData = $FF Then CRC = 53 EndIF Return