; Orange programmer module v4.4 ; (c) 2009-2013 CnCLab ; DS18B20 Dallas/Maxim digital thermometer. ;CHIP=DS18B20,17,DS18B20.hpl ;AREA=REGS,9(9) ;AREA=ROM.NUMBER,8(8) ; Connect P1 - DATA, GND - GND ; May be speed correction need for other PC ; CRC=x^8 + x^5 + x^4 + 1 ; LSB first ; Tested! ;Connect TO92 SOIC SOP ; _____ ----- ----- ; 1 GND (P0) |DS18 | - |1 8| - DQ |1 8| VDD ; 2 DQ (P1) |_____| GND |2 7| - - |2 7| - ; 3 VDD (P2) | | | VDD |3 6| - - |3 6| - ; | | | DQ |4 5| GND GND |4 5| - ; 1 2 3 ----- ----- ; SOCKET=0 ALLPINS=0 PING=GND,0 PING=DAT,1 PINO=VDD,2 CDELAY = 0 ; one set delay R9=CRC,H R18=Th,H2 R19=Tl,H2 R1A=CFG,H2 @AR=10 BUSO=LTX,254 BUSI=LRX,254 [_RESET] R8=0 ; status DAT=1,P=300 IDISABLE DAT=0,P=650 DAT=1 P=1 ; Wait answer LOOP=(0,10000){ R8[0]=DAT R8[0]?0{BREAK} } R8[0]?1{R8[1]=1} ;check state timeout LOOP=(0,10000){ R8[0]=DAT R8[0]?1{BREAK} } R8=^1; IENABLE P=1000 [_CRCB] LOOP=(0,7){ ; BITS LOOP R10=R1 R10=^R9 R10=&1 ; CF R10?1{R9=^0x18} ;R9[8]=R9[0] R9=>>1,R9=&0xFF R10=<<7 R9=|R10 R1=>>1 } [_CRCALL] ADR=0 R9=0 LOOP=(0,7){ ; BYTES LOOP R1=DATA ; DATA _CRCB ADR=+1 } [_CRCALL9] ADR=0 R9=0 LOOP=(0,8){ ; BYTES LOOP R1=DATA ; DATA _CRCB ADR=+1 } ;TX CRC: R0-input, R12-CRC [_CRCT] R11=R0 LOOP=(0,7){ ; BITS LOOP R10=R11 R10=^R12 R10=&1 ; CF R10?1{R12=^0x18} ;R9[8]=R9[0] R12=>>1,R12=&0xFF R10=<<7 R12=|R10 R11=>>1 } [!#SETUP] R1A=0x7F ;default [INIT] GND=0 VDD=1 ;power P=10000 DAT=1 P=20000 ; for Orange3 [_TBYTE3] R1=0 _CRCT IDISABLE LOOP=(0,7){ DAT=0,P=5 DAT=R0[I] P=3 R1[I]=DAT P=80 DAT=1 P=70 } IENABLE ; [_TBYTE4] R1=0 _CRCT ;IDISABLE LOOP=(0,7){ LTX=14 ;cmd load ram LTX=17,LTX=0 ;size LTX=28,LTX=0 ;DAT=0 LTX=38,LTX=4 ;P_USDELAY=4 R2=R0,R2=&1,R2=*2 LTX=28,LTX=R2 ;DAT=d LTX=38,LTX=5 ;P_USDELAY=5 LTX=30,LTX=0 ;P_GETBUS0 LTX=38,LTX=80 ;P_USDELAY=80 LTX=28,LTX=2 ;DAT=d LTX=23,LTX=0 ;lpttx LTX=0 ;end R2=LRX R2?>0x100{PRINT=("SEND P-CODE ERROR: %03lXH",R2),EXIT} LTX=99 ;RUN! R2=LRX R2=/2,R2=&1,R2=<<7 R1=>>1 R1=|R2 R0=/2 ;shift P=60 } ;IENABLE ;PRINT=S("RD: %03lXH",R1) ; Omega Orange [_TBYTESE] R1=0 _CRCT LOOP=(0,7){ LTX=15 ;cmd load ram LTX=16,LTX=0 ;size LTX=68,LTX=0 ;DAT=0 LTX=36,LTX=4 ;P_USDELAY=4 R2=R0,R2=&1,R2=*2 LTX=68,LTX=R2 ;DAT=d LTX=36,LTX=5 ;P_USDELAY=5 LTX=60,LTX=0 ;P_GETBUSA LTX=36,LTX=80 ;P_USDELAY=80 LTX=68,LTX=2 ;DAT=d LTX=51 ;lpttxA LTX=0 ;end R2=LRX R2?>0x100{PRINT=("SEND P-CODE ERROR: %03lXH",R2),EXIT} LTX=30 ;RUN! R2=LRX R2=/2,R2=&1,R2=<<7 R1=>>1 R1=|R2 R0=/2 ;shift P=60 } ;PRINT=S("RD: %03lXH",R1) [_TBYTE] R2=$VERSION R2=/65536 R0=&0xFF ;R2?3{_TBYTE3,RETURN} R2?4{_TBYTE4,RETURN} R2?0x12{_TBYTESE,RETURN} ;SE _TBYTE3 ;O3,O5 [_RBYTE] R13=R12 _TBYTE(0xFF) R12=R13 ;RESTORE CRC [READBLOCK] _RESET R8?!0{PRINT=("ANSWER ERROR %lX",R8),EXIT} $AREA?0{ ;REGS _TBYTE(0xCC) ;Skip ROM P=100 _TBYTE(0xBE) ;Read Scratchpad LOOP(0,8){_RBYTE,DATA=R1,ADR=+1} _CRCALL9 } $AREA?1{ ;SN _TBYTE(0x33) LOOP=(0,7){_TBYTE(0xFF),DATA=R1,ADR=+1} _CRCALL } R9?!0{PRINT=("CRC ERROR %03lX",R9)} [_ReadRomID] _RESET R8?!0{PRINT=("ANSWER ERROR %lX",R8),EXIT} _TBYTE(0x33) R9=0 _RBYTE,R3=R1,_CRCB _RBYTE,R4=R1,_CRCB _RBYTE,R5=R1,_CRCB _RBYTE,R6=R1,_CRCB _RBYTE,R7=R1,_CRCB _RBYTE,R8=R1,_CRCB _RBYTE,RA=R1,_CRCB _RBYTE,RB=R1 ; ,_CRCBYTE RB?R9{ PRINT=("ID = %02lX %02lX%02lX%02lX%02lX%02lX%02lX %02lX",R3, RA,R8,R7,R6,R5,R4, RB) } RB?!R9{ ; CRC Error detected! PRINT=E("ID = %02lX %02lX%02lX%02lX%02lX%02lX%02lX %02lX",R3, RA,R8,R7,R6,R5,R4, RB) } [Measure] PRINT=P(0,0x800) ;+125 -> 07D0h ;0 -> 0000h ;-55 -> FC90h ;1bit = 0.0625°C LOOP(0xFFFFFFFF){ _RESET R8?!0{PRINT=("ANSWER ERROR %X",R8),EXIT} P=200 _TBYTE(0xCC) ;Skip ROM P=100 _TBYTE(0x44) ;Convert T P=2000 ;If the DS18B20 is powered by an external supply, the master can ;issue read time slots after the Convert T command ;and the DS18B20 will respond by transmitting a 0 while the conversion is in progress and a 1 when the conversion is done _RESET R8?!0{PRINT=("ANSWER ERROR %X",R8),EXIT} P=100 _TBYTE(0xCC) ;Skip ROM P=100 _TBYTE(0xBE) ;Read Scratchpad ;_RBYTE,R2=R1 ;_RBYTE,R3=R1 ; answer - 9 BYTES LOOP(0,8){ _RBYTE @AR[I]=R1 } ;LOOP(0,8){ ;R1=@AR[I] ;PRINT=L("%02X ",R1) ;} ;PRINT=L("\n") R2=@AR[0] R3=@AR[1] R3=*256,R3=|R2 ;R3=0xFE6F ;test R2=R3 R3[15]?0{ ;positive temp R2=*62 ;;1bit = 0.0625°C 62.5 R0=R3,R0=/2,R2=+R0 ;+0.5 R0=R2,R0=/1000 R1=R2,R1=%1000 PRINT=S("Temperature: %u.%03u °C",R0,R1) PRINT=P(R3) } R3[15]?1{ ;negative temp R2=0x10000,R2=-R3 R3=R2 R2=*62 ;;1bit = 0.0625°C 62.5 R0=R3,R0=/2,R2=+R0 ;+0.5 R0=R2,R0=/1000 R1=R2,R1=%1000 PRINT=S("Temperature: -%u.%03u °C",R0,R1) PRINT=P(0) ;íå îòîáðàæàåì } P=10000 } [DetectType] _RESET R8?!0{PRINT=("ANSWER ERROR %lX",R8),EXIT} P=200 _TBYTE(0x33) R9=0 _RBYTE,R3=R1,_CRCB _RBYTE,_CRCB _RBYTE,_CRCB _RBYTE,_CRCB _RBYTE,_CRCB _RBYTE,_CRCB _RBYTE,_CRCB _RBYTE,RB=R1 ; ,_CRCBYTE RB?!R9{PRINT=E("CRC Error detected!"),EXIT} ;Family Code ;The family code is a type-specific value that references ;the device's functionality and capacity. The lower seven ;bits of the family code indicate the device type; the most ;significant bit of the family code is used to flag customer ;-specific versions. Thus 128 different standard ;devices can be coded. ;01 DS1990A,DS2401 ;02 DS1991 ;04 DS1994,DS2404 ;05 DS2405 ;06 DS1993 ;08 DS1992 ;09 DS1982,DS2502 ;0A DS1995 ;0B DS1985,DS2505 ;0C DS1996 ;0F DS1986,DS2506 ;10 DS1820,DS1920 ;12 DS2407 ;14 DS1971,DS2430A ;18 DS1962 ;1A DS1963 ;1C DS2422 ;1D DS2423 ;1F DS2409 ;20 DS2450 ;23 DS1973,DS2433 ;33 DS2432 ;84 DS2404SC01 ;89 DS1982U,DS2502E64,DS2402UNW ;8B DS1985U,DS2505UNW ;8F DS1986U,DS2506UNW R3?0x01{PRINT=I("Type: DS1990A,DS2401"),EXIT} R3?0x02{PRINT=I("Type: DS1991"),EXIT} R3?0x04{PRINT=I("Type: DS1994,DS2404"),EXIT} R3?0x05{PRINT=I("Type: DS2405"),EXIT} R3?0x06{PRINT=I("Type: DS1993"),EXIT} R3?0x08{PRINT=I("Type: DS1992"),EXIT} R3?0x09{PRINT=I("Type: DS1982,DS2502"),EXIT} R3?0x0A{PRINT=I("Type: DS1995"),EXIT} R3?0x0B{PRINT=I("Type: DS1985,DS2505"),EXIT} R3?0x0C{PRINT=I("Type: DS1996"),EXIT} R3?0x0F{PRINT=I("Type: DS1986,DS2506"),EXIT} R3?0x10{PRINT=I("Type: DS1820,DS1920"),EXIT} R3?0x12{PRINT=I("Type: DS2407"),EXIT} R3?0x14{PRINT=I("Type: DS1971,DS2430A"),EXIT} R3?0x18{PRINT=I("Type: DS1962"),EXIT} R3?0x1A{PRINT=I("Type: DS1963"),EXIT} R3?0x1C{PRINT=I("Type: DS2422"),EXIT} R3?0x1D{PRINT=I("Type: DS2423"),EXIT} R3?0x1F{PRINT=I("Type: DS2409"),EXIT} R3?0x20{PRINT=I("Type: DS2450"),EXIT} R3?0x23{PRINT=I("Type: DS1973,DS2433"),EXIT} R3?0x28{PRINT=I("Type: DS18B20"),EXIT} R3?0x33{PRINT=I("Type: DS2432"),EXIT} R3?0x84{PRINT=I("Type: DS2404SC01 "),EXIT} R3?0x89{PRINT=I("Type: DS1982U,DS2502E64,DS2402UNW"),EXIT} R3?0x8B{PRINT=I("Type: DS1985U,DS2505UNW"),EXIT} R3?0x8F{PRINT=I("Type: DS1986U,DS2506UNW"),EXIT} PRINT=I("Type: Unknown [%02X]",R3) ["Write Regs"] GET=("Registers",R18,R19,R1A) RA?0{EXIT} _RESET R8?!0{PRINT=("ANSWER ERROR %X",R8),EXIT} P=200 _TBYTE(0xCC) ;Skip ROM P=200 _TBYTE(0x4E) ;Write Scratchpad _TBYTE(R18) _TBYTE(R19) _TBYTE(R1A) P=200 _RESET R8?!0{PRINT=("ANSWER ERROR %X",R8),EXIT} P=200 _TBYTE(0xCC) ;Skip ROM P=200 _TBYTE(0x48) ;Copy Scratchpad P=10000 _TBYTE(0xB8) ;Recall E2 P=10000