; Orange programmer module v4.4
; (c) 2009-2013 CnCLab
; DS18B20 Dallas/Maxim digital thermometer.  SOIC8
;CHIP=DS18B20Z,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 only TO92

;Connect           TO92                  SOIC               SOP       
;                  _____                -----              -----       
; 1 GND (P4)      |DS18 |            - |1   8| -       DQ |1   8| VDD  
; 2 DQ  (P3)      |_____|            - |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=8

PING=GND,4,5
PING=DAT,3,4
PINO=VDD,2,3

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