
	LIST P=16F628a
	#include "P16F628.INC"

	__CONFIG	_PWRTE_ON  & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BODEN_ON & _LVP_OFF & _CP_OFF & _MCLRE_ON
;------------------------------------------------------------
	cblock 0x20	
	d1
	d2
	d1_2
	d1_5
	d2_5
	d1_5_2
	gom
	pwm_szam
	pwm_ert
	endc

	org	0
	goto	init

	org	4

init
		clrf	PORTA		; PortA törlése
		clrf	PORTB		; PortB törlése
		movlw	0x07		; W-be 7-et írunk
		movwf	CMCON		; Ezzel kikapcsoljuk a komparátort
		bsf	STATUS,RP0		; Bank 1
		movlw	b'10000101'	; TMR0 előosztó= 1:64
		movwf	OPTION_REG
		movlw	b'11111111'	; W-be 8x1
		movwf	TRISA		; PortA mind bemenet
		movlw	b'11110111'	; W-be 8x1
		movwf	TRISB		; PortB mind bemenet
		bcf	STATUS,RP0		; Bank 0
		call	delay_0_5s	; szünet
		clrf	pwm_ert
		call	pwm_conf	; PWM konfig

;------------------- Főprogram ---------------------------------------
start 

	btfss	PORTA,0			; Várunk gombnyomásra
	goto	G1				; Ha megtörtént
	goto	start		; vissza az elejére
G1
	call	var_1s			; 1 másodperces várakozás
	goto	pwm_fel			; Pwm_fel, mozdony indítás
jvar_1
	btfsc	PORTB,0			; Várunk a következő
	goto	jvar_1			; állomáshoz érkező jelre
	call	var_1s			; 1 másodperces várakozás
	goto	pwm_le			; Pwm le, vonat megáll
	goto	start

;----------------------------------------------------------------------
;------------------ Pwm fel -------------------------------------------
pwm_fel
		movlw	0x0a		; W-be 10-et írunk
		addwf	CCPR1L,w	; hozzáadjuk pwm_ert-hez
		movwf	CCPR1L		; beírjuk CCPR1L regiszterbe
		bcf	INTCON,T0IF		; Timer0 flag törlés
		call	pt_var		; várakozás Timer0-ra
		movlw	0x78		; 120-at írunk W-be
		subwf	CCPR1L,w	; Összehasunlítjuk CCPR1L regiszterrel
		btfsc	STATUS,Z	; Z vizsgálata
		goto	jvar_1		; ha Z=1 akkor ugrunk tovább
		goto	pwm_fel		; ha Z=0 akkor ujrakezdjük
;------------------ Pwm le --------------------------------------------
pwm_le
		movlw	0x0a		; W-be 10-et írunk
		subwf	CCPR1L,w	; CCPR1L regiszterből kivunjuk W (10) értéket
		movwf	CCPR1L		; az eredményt beírjuk CCPR1L regiszterbe
		bcf	INTCON,T0IF		; Timer0 flag törlés 
		call	pt_var		; várakozás Timer0-ra
		movlw	0x00		; 0-át írunk W-be
		subwf	CCPR1L,w	; Összehasunlítjuk CCPR1L regiszterrel
		btfsc	STATUS,Z	; Z vizsgálata
		goto	start		; ha Z=1 akkor ugrunk jvar_1-re
		goto	pwm_le		; ha Z=0 akkor ujrakezdjük		
;------------------ PWM config ----------------------------------------
pwm_conf
		clrf	T2CON
		clrf	TMR2
		bsf		STATUS,RP0			; Bank_1
		movlw	0x8c				; PWM freki 2khz
		movwf	PR2
		bcf		STATUS,RP0			; Bank_0
		movlw	b'00000011'
		movwf	T2CON
		clrf	CCPR1L
		movlw	0x0c
		movwf	CCP1CON
		bsf		T2CON,TMR2ON
	return
;----------- Pwm léptetés számláló a Timer0 segítségével ---------------
pt_var
		btfss	INTCON,T0IF	; ha TMR0 túlcsordult ?
		goto	pt_var		; nem
		bcf	INTCON,T0IF		; igen,flag törlés
		decfsz	pwm_szam,f	; számláló dekrementálása
		goto	pt_var		; ha nem 0 akkor előröl
		movlw	0x0a		; W-be 10-et írunk
		movwf	pwm_szam	; beírjuk pwm_szam-ba /pwm számláló/
	return
;-------------------- Delay ---------------------------------------------
var_1s
		movlw	0x07
		movwf	d1
		movlw	0x2F
		movwf	d2
		movlw	0x03
		movwf	d1_2
delay_0
		decfsz	d1, f
		goto	$+2
		decfsz	d2, f
		goto	$+2
		decfsz	d1_2, f
		goto	delay_0
		goto	$+1
		goto	$+1
		goto	$+1
	return
;------------------------------------------------------------------------
delay_0_5s
		movlw	0x03
		movwf	d1_5
		movlw	0x18
		movwf	d2_5
		movlw	0x02
		movwf	d1_5_2
delay_0_5s_0
		decfsz	d1_5, f
		goto	$+2
		decfsz	d2_5, f
		goto	$+2
		decfsz	d1_5_2, f
		goto	delay_0_5s_0
	return
	end