;****************************paka.src********************************

		device pic16c84,xt_osc,wdt_off,pwrt_on,protect_on
		id	'paka'

ST1	=	ra.0		;strobe dek1
ST10	=	ra.1		;strobe dek10
LED	=	ra.2		;led
SSR	=	ra.3		;solid state relay
AC	=	ra.4		;ac in
RT	=	34		;time constant for RTCC
T_RT	=	0ffh-RT		;	''
FREQ	=	100		;frequentie of ac
T1	=	FREQ/3		;
T2	=	FREQ/2		;
T3	=	2*FREQ/3	;
T4	=	FREQ-1		;
GTIME	=	25		;time for bottons
THEAT	=	30		;time for preheat
				;it depends on soldering iron

	org	0ch

cntr1		ds	1	;pwm counter
cntr2		ds	1	;botton timer
cntr3		ds	1	;
timeset		ds	1	;lote of pwm time
timeval		ds	1	;pwm time
botton		ds	1	;reg of bottons
int_save	ds	1	;save of INTCON
bcd		ds	1	;bcd data for display
dled		ds	1	;data for leds
power		ds	1	;
c1		ds	1	;
c2		ds	1	;
msd		ds	1	;
_2sd		ds	1	;
lsd		ds	1	;
timer		ds	1	;
ENTER	=	botton.0	;1. botton
DOWN	=	botton.1	;2. botton
UP	=	botton.2	;3. botton
PWR	=	botton.3	;4. botton
bset	=	botton.4	;keypressed
on	=	power.0
led2	=	power.1
heat 	=	power.2		;preheat

	eeorg	0

	eedata	1		;lote of pwm time
	eedata	T1, T2, T3, T4	;pwm times

;********************************************************************

	org	0
	jmp	start		;

;********************************************************************

	org	4
gint	clrb	GIE		;disable of int
	snb	RTIF		;RT int?
	jmp	t_int		;goto rt int rutin
	snb	RBIF		;
	jmp	r_int		;
	reti			;

;********************************************************************

t_int	clrb	RTIF		;RT int rutin clr RT flag
	mov	RTCC,#T_RT	;load RTCC
	call	dsp		;call of display rutin
	jb	on,p_off	;
	djnz	c1,p_off
	mov	c1,#50
	jnb	led2,led2_on
	clrb	led2
	jmp	p_off
led2_on	setb	led2
p_off	djnz	cntr1,t_ret	;pwm counter=0?
	jnb	on,s_clr		;
	jb	ssr,s_clr	;ssr on ?
	setb	ssr		;switch on ssr
	jnb	heat,t_int1
	djnz	c2,t_int1
	clrb	heat
	mov	c2,#THEAT
	mov	eeadr,#0	;read lote no.
	call	ee_rd		;	"
	mov	timeset,eedata	;	"
	mov	eeadr,timeset	;read pwm data
	call	ee_rd		;	"
	mov	timeval,eedata	;	"
	mov	w,timeval	;
	call	binbcd		;
	call	leds		;
t_int1	mov	w,timeval	;load 
	mov	cntr1,w		;        counter
	jmp	t_ret		;done
s_clr	clrb	ssr		;switch off ssr
	mov	w,timeval	;load 
	mov	w,#FREQ-w	;    pwm 
	mov	cntr1,w		;  	  counter
t_ret	jnb	bset,tend	;keypressed ?
	call	gomb		;call of botton rutin
tend	reti			;

;********************************************************************

r_int	mov	w,rb		;
	clrb	RBIF		;
	reti			;

;********************************************************************

binbcd	clr	bcd		;bin to BCD
again	add	w,#-10		;
	sc			;
	jmp	swabcd		;
	inc	bcd		;
	jmp	again		;
swabcd	add	w,#10		;
	swap	bcd		;
	or	bcd,w		;
	jb	on,bret		;
	mov	bcd,#0ffh	;
bret	ret			;

;********************************************************************

ee_rd	setb	RP0		;eeprom read
	setb	RD		;
	jb	RD,$		;
	clrb	RP0		;
	ret			;
	
;********************************************************************

ee_wr	mov	int_save,INTCON	;eeprom write
	clrb	GIE		;
	setb	RP0		;
	setb	WREN		;
	mov	w,#055h		;
	mov	EECON2,w	;
	mov	w,#0aah		;
	mov	EECON2,w	;
	setb	WR		;
	jb	WR,$		;
	clrb	WREN		;
	clrb	RP0		;
	clrb	EEIF		;
	or	INTCON,int_save	;
	ret			;
	
;********************************************************************

dsp	jb	ST1,dsp10	;dek1 on?
	clrb	ST10		;dek10 off
	clrb	led		;
	mov	w,bcd		;mov  
	and	w,#0fh		;    dek1
	mov	rb,w		;	 rb
	mov	!rb,#0		;rb<0:7> out
	or	rb,dled		;dled to rb
	snb	ssr		;ssr on?
	setb	led		;
	setb	ST1		;sw on dek1
	ret			;
dsp10	clrb	st1		;dek1 off
	mov	w,<>bcd		;mov
	and	w,#0fh		;    dek10
	or 	w,#0f0h		;
	mov	rb,w		;	  rb
	mov	!rb,#11110000b	;rb<0:3> out rb<4:7> in
	jnb	led2,dsp11	;
	setb	led		;
	sb	led		;
dsp11	clrb	led		;
	setb	ST10		;dek10 on
	jb	bset,dend	;no keypressed ?
	mov	w,<>rb		;read bottons
	mov	botton,w	;	"
	not	botton		;	"
	and	botton,#0fh	;	"
	test 	botton		;keypressed ?
	jz	dend		;no done
	mov	cntr2,#GTIME	;mov botton timer value
	setb	bset		;set keypressed
dend	ret			;
	
;********************************************************************

gomb	djnz	cntr2,gret	;botton timer done?
	jnb	on,pon		;power on?
	jb	heat,b_pwr	;
	jnb	ENTER,b_up	;ENTER bott. pressed ?
	inc	timeset		;inc. lote of pwm
	cjb	timeset,#5,s_wr	;lote = 5 ?
	mov	timeset,#1	;lote = 1
s_wr	mov	eedata,timeset	;save
	mov	eeadr,#0	;     to 
	call	ee_wr		;	  eeprom
	mov	eeadr,timeset	;read new pwm data
	call	ee_rd		;   	"
	mov	timeval,eedata	;	"
	mov	w,timeval	;bin to bcd
	call	binbcd		;	"
	call	leds		;new led position
	jmp	gend		;
b_up	jnb	UP,b_dwn	;UP botton ?
;	jnb	on,pon		;power on?
	inc	timeval		;inc. pwm data
	cjb	timeval,#FREQ,up_wr	;pwm data = FREQ?
	mov	timeval,#1	;pwm data = 1 
up_wr	mov	eeadr,timeset	;save 
	mov	eedata,timeval	;     to 
	call	ee_wr		;	 eeprom
	mov	w,timeval	;bin to bcd
	call	binbcd		;	"
	jmp	gend		;
b_dwn	jnb	DOWN,b_pwr	;DOWN boton
;	jnb	on,pon		;power on?
	djnz	timeval,dwn_wr	;dec pwm data
	mov	timeval,#T4	;pwm data = freq-1
dwn_wr	mov	eeadr,timeset	;save
	mov	eedata,timeval	;     to 
	call	ee_wr		;	 eeprom
	mov	w,timeval	;bin to bcd
	call	binbcd		;	"
	jmp	gend		;
b_pwr	jnb	PWR,gend	;
b_pwr1	jb	on,poff		;power on?
pon	setb	on		;power on
	clrb	led2		;
	setb	heat		;
	mov	w,#99		;
	mov	timeval,w	;
	call	binbcd		;
	call	leds		;
	jmp	gend		;
poff	clrb	on		;power off
	call	binbcd		;
	call	leds		;
gend	clr	botton		;
gret	ret			;

;********************************************************************

leds	stc			;set carry
	clr	dled		;clear dled reg.
	jnb	on,lend		;pwr on ?
	jb	heat,lend	;preheat ?
	mov	cntr3,timeset	;load counter
shled	rl	dled		;shift reg <- C
	djnz	cntr3,shled	;more shift
	swap	dled		;<0:3><-><4:7>
lend	ret			;

;********************************************************************

start	clr	RTCC		;
	clr	INTCON		;
	clr	ra		;
	mov	rb,#00001111b	;display blanking
;	clr	rb		;
	mov	!ra,#00010000b	;ra.4 input ra<0:3> out
	mov	!rb,#11110000b	;rb<0:3> out rb<4:7> input
	mov	!option,#00000111b	
				;Prescaler load
	clrb	RBPU		;
;	call	eeset		;only for simulator
				;in PIC comment (;)
	call	ram_r		;
	setb	heat		;
	mov	c2,#THEAT	;preheat time
	mov	eeadr,#0	;read lote no.
	call	ee_rd		;	"
	mov	timeset,eedata	;	"
	mov	eeadr,timeset	;read pwm data
	call	ee_rd		;	"
	mov	timeval,eedata	;	"
	mov	cntr1,timeval	;load pwm counter
	mov	c1,#50		;
	mov	RTCC,#T_RT	;load RTCC
	mov	timeval,#99	;
	mov	w,timeval	;bin to bcd
	call	binbcd		;	"
	call	leds		;
	mov	w,rb		;
	clrb	RBIF		;
	setb	RTIE		;enable RT int.
	setb	GIE		;enable general int.
	jmp	$		;loop

	
;********************************************************************
;only for simulator 
;
eeset	mov	eeadr,#0	;
	mov	eedata,#1	;
	call	ee_wr		;
	inc	eeadr		;
	mov	eedata,#T1	;
	call	ee_wr		;
	inc	eeadr		;
	mov	eedata,#T2	;
	call	ee_wr		;
	inc	eeadr		;
	mov	eedata,#T3	;
	call	ee_wr		;
	inc	eeadr		;
	mov	eedata,#T4	;
	call	ee_wr		;
	ret			;

;********************************************************************

ram_r	mov	FSR,#0dh	;
	mov	cntr1,#36	;
	mov	w,#0		;
:loop	mov	IND0,w		;
	inc	FSR		;
	djnz	cntr1,:loop	;
	ret			;

;********************************************************************
