#ifdef __16F886

#include <p16F886.inc>

	__CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
	__CONFIG    _CONFIG2, _WRT_OFF & _BOR21V

; PB0-PB3: LEDs
;
; DS1820/DS1821
; RC5: DQ
; RC4: Vdd

get_dq		macro
	banksel	PORTC
	setc
	btfss	PORTC,5
	clrc
	endm

set_dq_h	macro
	banksel	TRISC
	bsf		TRISC,5
	banksel	PORTC
	bcf		PORTC,5
	endm

set_dq_l	macro
	banksel	PORTC
	bcf		PORTC,5
	banksel	TRISC
	bcf		TRISC,5
	endm

force_dq_h	macro
	banksel	PORTC
	bsf		PORTC,5
	banksel	TRISC
	bcf		TRISC,5
	endm

set_vdd_h	macro
	banksel	PORTC
	bsf		PORTC,4
	endm

set_vdd_l	macro
	banksel	PORTC
	bcf		PORTC,4
	endm

led_on	macro
	banksel	PORTB
	bsf		PORTB,0
	endm

led_off	macro
	banksel	PORTB
	bcf		PORTB,0
	endm


; port setup
port_setup	macro
	banksel ANSELH
	clrf    ANSELH

	banksel CM1CON0
	clrf    CM1CON0
	banksel CM2CON0
	clrf    CM2CON0

	banksel	TRISB
	movlw	B'11110000'
	movwf	TRISB

	banksel	TRISC
	movlw	B'10001111'
	movwf	TRISC

	banksel	PORTB
	movlw	B'00000001'
	movwf	PORTB

	banksel	PORTC
	movlw	B'00000000'
	movwf	PORTC

	endm

; USART setup
usart_setup	macro
	movlw	D'25'		; 9600bps @ 4MHz and BRGH=1
	banksel	SPBRG
	movwf	SPBRG

	movlw	D'0'
	banksel	SPBRGH
	movwf	SPBRGH

	movlw	B'00000000'
	banksel	BAUDCTL
	movwf	BAUDCTL

	movlw	B'10010000'
	banksel	RCSTA
	movwf	RCSTA

	movlw	B'00100100'
	banksel	TXSTA
	movwf	TXSTA

	endm

#endif




#ifdef __16F628A

#include <p16F628A.inc>

	__CONFIG    _CP_OFF & _DATA_CP_OFF & _BOREN_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT

; RA2: LED
;
; DS1820/DS1821
; RA1: DQ
; RA0: Vdd

get_dq		macro
	banksel	PORTA
	setc
	btfss	PORTA,1
	clrc
	endm

set_dq_h	macro
	banksel	TRISA
	bsf		TRISA,1
	banksel	PORTA
	bcf		PORTA,1
	endm

set_dq_l	macro
	banksel	PORTA
	bcf		PORTA,1
	banksel	TRISA
	bcf		TRISA,1
	endm

force_dq_h	macro
	banksel	PORTA
	bsf		PORTA,1
	banksel	TRISA
	bcf		TRISA,1
	endm

set_vdd_h	macro
	banksel	PORTA
	bsf		PORTA,0
	endm

set_vdd_l	macro
	banksel	PORTA
	bcf		PORTA,0
	endm

led_on	macro
	banksel	PORTA
	bsf		PORTA,2
	endm

led_off	macro
	banksel	PORTA
	bcf		PORTA,2
	endm

; port setup
port_setup	macro
	banksel CMCON
	movlw	0x07
	movwf	CMCON

	banksel	TRISA
	movlw	B'00000010'
	movwf	TRISA

	banksel	PORTA
	movlw	B'00000000'
	movwf	PORTA

	banksel	TRISB
	movlw	B'00000010'
	movwf	TRISB

	banksel	PORTB
	movlw	B'00000010'
	movwf	PORTB

	endm

; USART setup
usart_setup	macro
	movlw	D'25'		; 9600bps @ 4MHz and BRGH=1
	banksel	SPBRG
	movwf	SPBRG

	movlw	B'10010000'
	banksel	RCSTA
	movwf	RCSTA

	movlw	B'00100100'
	banksel	TXSTA
	movwf	TXSTA

	endm

#endif

#define	stype	bitvars,0

	cblock	0x40
bitvars
ptrh
ptrl
tmp
cnt
cnt1
dly1
dly2
result
	endc


show_text	macro	txtadr
	banksel	ptrl
	movlw	low txtadr
	movwf	ptrl
	movlw	high txtadr
	movwf	ptrh
	call	puttext
	endm

; start
	org		0x0
	nop
	nop
	goto	start

	org		0x4
	nop
	retfie


start
	nop

	port_setup
	usart_setup


	banksel	bitvars
	bcf		stype



;
	call	init_1w

;	call	modechange_1w

	show_text	txt_hello

loop
	show_text	txt_menu
	call	putprompt

	call	getc
	call	putc
	banksel	tmp
	movwf	tmp

	show_text	txt_clrbot

	banksel	bitvars

	movlw	'p'
	xorwf	tmp,w
	skpnz
	goto	cmd_power

	movlw	'm'
	xorwf	tmp,w
	skpnz
	goto	cmd_mode

	movlw	'c'
	xorwf	tmp,w
	skpnz
	goto	cmd_config

	movlw	'l'
	xorwf	tmp,w
	skpnz
	goto	cmd_low

	movlw	'h'
	xorwf	tmp,w
	skpnz
	goto	cmd_high

	movlw	'q'
	xorwf	tmp,w
	skpnz
	goto	cmd_query

	movlw	't'
	xorwf	tmp,w
	skpnz
	goto	cmd_type

	movlw	0x08
	call	putc
	goto	loop

putprompt
	show_text	txt_prompt
	banksel	bitvars
	btfss	stype
	goto	pp1821
	movlw	'0'
	call	putc
	goto	pp0
pp1821
	movlw	'1'
	call	putc
pp0
	movlw	'>'
	goto	putc


cmd_power
	show_text	txt_power
	set_vdd_l
	call	longw
	set_dq_l
	call	longw
	call	longw
	call	longw
	call	longw
	call	longw
	call	longw
	call	longw
	call	longw
	call	longw
	call	init_1w
	goto	loop

cmd_mode
	show_text	txt_mode
	call	modechange_1w
	call	init_1w
	goto	loop

cmd_config
	btfsc	stype
	call	c1820
	btfss	stype
	call	c1821
	goto	loop

cmd_query
	btfsc	stype
	call	q1820
	btfss	stype
	call	q1821
	goto	loop

cmd_low
	btfsc	stype
	call	l1820
	btfss	stype
	call	l1821
	goto	loop

cmd_high
	btfsc	stype
	call	h1820
	btfss	stype
	call	h1821
	goto	loop

cmd_type
	banksel	bitvars
	btfsc	stype
	goto	stype1
	bsf		stype
	goto	loop
stype1
	bcf		stype
	goto	loop
	

; DS1820 config
c1820
	return

; DS1821 config
c1821
	show_text	txt_ds1821_config
	call	reset_1w
	movlw	0x0c
	call	write_1w
	call	gethex
	call	write_1w
	call	putcrlf
	return


; DS1820 TL set
l1820
	return

; DS1820 TH set
h1820
	return


; DS1821 TL set
l1821
	show_text	txt_ds1821_tlset
	call	reset_1w
	movlw	0x02
	call	write_1w
	call	gethex
	call	write_1w
	call	putcrlf
	return

; DS1821 TH set
h1821
	show_text	txt_ds1821_thset
	call	reset_1w
	movlw	0x01
	call	write_1w
	call	gethex
	call	write_1w
	call	putcrlf
	return

; DS1821 query
q1821
	show_text	txt_ds1821_status
	call	reset_1w
	movlw	0xAC
	call	write_1w
	call	read_1w
	call	puthex

	show_text	txt_ds1821_temp
	call	reset_1w
	movlw	0xAA
	call	write_1w
	call	read_1w
	call	puthex

	show_text	txt_ds1821_th
	call	reset_1w
	movlw	0xA1
	call	write_1w
	call	read_1w
	call	puthex

	show_text	txt_ds1821_tl
	call	reset_1w
	movlw	0xA2
	call	write_1w
	call	read_1w
	call	puthex

	call	putcrlf

	return


; DS1820 query
q1820
	show_text	txt_ds1820_status
	call	reset_1w

	movlw	0x33
	call	write_1w

	banksel	cnt1
	movlw	8
	movwf	cnt1

q1820_1
	call	read_1w
	call	puthex

	banksel	cnt1
	decfsz	cnt1,f
	goto	q1820_1

	show_text	txt_ds1820_spad
	call	reset_1w

	movlw	0xCC
	call	write_1w
	movlw	0xBE
	call	write_1w

	banksel	cnt1
	movlw	9
	movwf	cnt1

q1820_2
	call	read_1w
	call	puthex

	banksel	cnt1
	decfsz	cnt1,f
	goto	q1820_2

	return




; initialize 1-wire bus
init_1w
	led_on
	set_vdd_l
	set_dq_l
	movlw	D'200'		; 2ms
	call	wx10us
	set_vdd_h
	set_dq_h
	movlw	D'200'		; 2ms
	call	wx10us
	led_off
	return

; perform reset on 1-wire bus
reset_1w
	led_on
	set_dq_l

	banksel	tmp
	movlw	D'60'		; 600us
	call	wx10us

	set_dq_h

	movlw	D'6'		; 60us
	call	wx10us

	get_dq
	banksel	result
	clrf	result
	rlf		result,f

	banksel	tmp
	movlw	D'60'		; 600us
	call	wx10us

	banksel	result
	movf	result,w
	led_off
	return

; write a byte to 1-wire bus
write_1w
	led_on
	banksel	result
	movwf	result

	movlw	D'8'
	movwf	cnt

wr1w_1
	banksel	result
	rrf		result,f

	movlw	D'6'		; 60us -> bit '0'
	set_dq_l
	skpc
	call	wx10us

	set_dq_h
	movlw	D'6'		; 60us
	call	wx10us

	banksel	cnt
	decfsz	cnt,f
	goto	wr1w_1
	led_off
	
	return

; read a byte from 1-wire bus
read_1w
	led_on
	movlw	D'8'
	banksel	cnt
	movwf	cnt

rd1w_1
	set_dq_l
	set_dq_h

	nop
	nop
	get_dq
	banksel	result
	rrf		result,f

	movlw	D'6'		; 60us
	call	wx10us

	banksel	cnt
	decfsz	cnt,f
	goto	rd1w_1

	banksel	result
	movf	result,w	
	led_off
	return


; mode change on DS1821
modechange_1w
	led_on
	force_dq_h
	nop
	set_vdd_l
	nop

	nop
	set_dq_l
	nop
	force_dq_h
	nop
	set_dq_l
	nop
	force_dq_h
	nop
	set_dq_l
	nop
	force_dq_h
	nop
	set_dq_l
	nop
	force_dq_h
	nop
	set_dq_l
	nop
	force_dq_h
	nop
	set_dq_l
	nop
	force_dq_h
	nop
	set_dq_l
	nop
	force_dq_h
	nop
	set_dq_l
	nop
	force_dq_h
	nop
	set_dq_l
	nop
	force_dq_h
	nop
	set_dq_l
	nop
	force_dq_h
	nop
	set_dq_l
	nop
	force_dq_h
	nop
	set_dq_l
	nop
	force_dq_h
	nop
	set_dq_l
	nop
	force_dq_h
	nop
	set_dq_l
	nop
	force_dq_h
	nop
	set_dq_l
	nop
	force_dq_h
	nop
	set_dq_l
	nop
	force_dq_h
	nop

	set_vdd_h
	nop
	set_dq_h
	nop

	led_off
	return


; wait W*10us
wx10us
	call	w10us
	addlw	-1
	skpz
	goto	wx10us
	return

; wait 10us
w10us
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	return

longw
	banksel	dly1
	clrf	dly1
lw1
	clrf	dly2
lw2
	decfsz	dly2,f
	goto	lw2
	decfsz	dly1,f
	goto	lw1
	return

putcrlf
	movlw	0x0d
	call	putc
	movlw	0x0a

; send char on serial
putc
	banksel	PIR1
putc_1
	btfss	PIR1,TXIF
	goto	putc_1

	banksel	TXREG
	movwf	TXREG
	return

; receive char from serial
getc
	banksel	PIR1
getc_1
	btfss	PIR1,RCIF
	goto	getc_1

	banksel	RCREG
	movf	RCREG,w
	return

; put W in hex
puthex
	banksel	tmp
	movwf	tmp
	call	puthexd

	banksel	tmp
	swapf	tmp,f

puthexd
	call	hextochar
	goto	putc

hextochar
	movlw	high hexstr
	movwf	PCLATH

	swapf	tmp,w
	andlw	0x0f
	addlw	low hexstr
	skpnc
	incf	PCLATH,f
	movwf	PCL


puttext
	banksel	ptrl
	movf	ptrh,w
	movwf	PCLATH
	movf	ptrl,w
	call	getbyte
	iorlw	0
	skpnz
	return

	call	putc
	banksel	ptrl
	incf	ptrl,f
	skpnz
	incf	ptrh,f
	goto	puttext

getbyte
	movwf	PCL

gethex
	banksel	result
	clrf	result
	call	gethexd
	banksel	result
	movwf	result
	swapf	result,f
	call	gethexd
	banksel	result
	iorwf	result,w
	return

gethexd
	call	getc
	banksel	cnt
	iorlw	B'00100000'
	movwf	cnt
	addlw	-('a')+0x0a		; 'a'->0x0a, b->0x0b ... sets carry if alpha
	skpc
	addlw	'a'-'9'-1	; '9'->9, '8'->8 ...
	banksel	tmp
	movwf	tmp
	andlw	B'11110000'
	skpz
	goto	gethexd
	movf	cnt,w
	call	putc
	banksel	tmp
	movf	tmp,w
	return



hexstr
	dt	"0123456789ABCDEF"

txt_hello
	dt	0x1b,"[1;1H"
	dt	0x1b,"[J1-wire handling tool by szilva",0

txt_menu
	dt	0x1b,"[3;1H"
	dt	0x1b,"[KSelect function:\r\n"
	dt	0x1b,"[K\r\n"
	dt	0x1b,"[Kt - Select sensor type\r\n"
	dt	0x1b,"[Kp - Bus power off/on\r\n"
	dt	0x1b,"[Kq - Query device\r\n"
	dt	0x1b,"[Km - Mode change\r\n"
	dt	0x1b,"[Kc - Set config\r\n"
	dt	0x1b,"[Kl - Set TL\r\n"
	dt	0x1b,"[Kh - Set TH\r\n"
	dt	0

txt_clrbot
	dt	0x1b,"[J",0

txt_prompt
	dt	0x1b,"[K\r\n",0x1b,"[KDS182",0

txt_power
	dt	"\r\nCycling power on 1-wire bus.\r\n",0

txt_mode
	dt	"\r\nChange operating mode.\r\n",0

txt_ds1821_status
	dt	"\r\nConfig: ",0

txt_ds1821_temp
	dt	"\r\nTemp  : ",0

txt_ds1821_config
	dt	"\r\nValue to write into config (hex): ",0

txt_ds1821_th
	dt	"\r\nTH reg: ",0

txt_ds1821_tl
	dt	"\r\nTL reg: ",0

txt_ds1821_thset
	dt	"\r\nValue to write into TH (hex): ",0

txt_ds1821_tlset
	dt	"\r\nValue to write into TL (hex): ",0

txt_ds1820_status
	dt	"\r\nROM codes : ",0

txt_ds1820_spad
	dt	"\r\nScratchpad: ",0

txt_ds1820_config
	dt	"\r\nValue to write into config (hex): ",0

txt_ds1820_th
	dt	"\r\nTH reg: ",0

txt_ds1820_tl
	dt	"\r\nTL reg: ",0

txt_ds1820_thset
	dt	"\r\nValue to write into TH (hex): ",0

txt_ds1820_tlset
	dt	"\r\nValue to write into TL (hex): ",0



	end
