; m1572.asm: MÁV szignál PIC12F1572-re hangszerelve. Nem univerzális lejátszó!
; Szabályos program: nem igényli a PARALLAX makrókat, és nem kell kikapcsolni a kis-
; és nagybetűk megkülönböztetését.

	list	p=12f1572
	list	r=dec
	#include <p12f1572.inc>
	
    __CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOREN_ON & _CLKOUTEN_OFF 
    __CONFIG _CONFIG2, _WRT_OFF & _PLLEN_ON & _BORV_HI  & _STVREN_OFF &  _LVP_OFF

	CBLOCK	0x70
	tflags
	ms_cnt
	ENDC

#define ms2	tflags,0
#define	load1	PWM1LDCON,LDA
#define	load3	PWM3LDCON,LDA

	ORG	0
	clrf	PCLATH
	clrf	BSR
	clrf	INTCON
	goto	eleje

	org	4
	clrf	PCLATH
	clrf	BSR
	bcf	PIR1,TMR2IF
	bsf	ms2
	retfie
	
eleje
	banksel	LATA
	clrf	LATA
	banksel	TRISA
	movlw	0x38
	movwf	TRISA
	banksel	ANSELA	
	movlw	0x14
	movwf	ANSELA
	banksel	WPUA
	movlw	0x28
	movwf	WPUA
	banksel OPTION_REG
	bcf	OPTION_REG,7
	banksel	SLRCONA
	movlw	3
	movwf	SLRCONA
	banksel	OSCCON
	movlw	0x70
	movwf	OSCCON
; A következő utasítások nagy része fölösleges, a regiszterek zöme magától is nullára 
; inicializálódik.	
	banksel	PWM1INTE
	clrf	PWM1INTF
	clrf	PWM1CLKCON
	clrf	PWM1LDCON
	clrf	PWM1OFCON
	clrf	PWM1PHH
	clrf	PWM1PHL
	clrf	PWM1DCH
	clrf	PWM1DCL
	clrf	PWM1PRH
	movlw	10
	movwf	PWM1PRL
	bsf	load1
	clrf	PWM1OFH
	clrf	PWM1OFL
	clrf	PWM1TMRH
	clrf	PWM1TMRL
	movlw	0x88
	movwf	PWM1CON
	banksel	PWM3INTE
	clrf	PWM3INTF
	clrf	PWM3CLKCON
	clrf	PWM3LDCON
	clrf	PWM3OFCON
	clrf	PWM3PHH
	clrf	PWM3PHL
	clrf	PWM3DCH
	clrf	PWM3DCL
	clrf	PWM3PRH
	clrf	PWM3PRL
	clrf	PWM3OFH
	clrf	PWM3OFL
	clrf	PWM3TMRH
	clrf	PWM3TMRL
	movlw	0x88
	movwf	PWM3CON
	banksel	T2CON
	movlw	0x22
	movwf	T2CON
	movlw	199
	movwf	PR2	; 2 ms alapegység (3*170=510 belefér)
	banksel	0
	bcf	PIR1,TMR2IF
	banksel	PIE1
	bsf	PIE1,TMR2IE
	banksel	T2CON
	bsf	T2CON,TMR2ON
	banksel	0
	bsf	INTCON,PEIE
	bsf	INTCON,GIE
; Mostanra minden inicializálva van  és megy az óra.
; Tápfeszültségre induló változathoz a következő két utasítást ki kell hagyni
; (a címke marad!)
gomb_var
	btfsc	PORTA,3
	goto	gomb_var
; tartó kimenet fel:
	banksel	LATA
	bsf	LATA,0
; első paramétercsoport töltése
	movlw	170
	movwf	ms_cnt
	banksel	PWM1CON
	movlw	high 13620
	movwf	PWM1PRH
	movlw	low 13620
	movwf	PWM1PRL
	bsf	load1		;1
; periféria kimenet engedélyezése
	bsf	PWM1CON,PWM1OE
; idő kivárása
	call	w_time
; második paramétercsoport töltése
	movlw	high 18161
	movwf	PWM1PRH
	movlw	low 18161
	movwf	PWM1PRL
	bsf load1		;2
	movlw	85
	movwf	ms_cnt
; és így tovább
	call	w_time
	movlw	high 16197
	movwf	PWM1PRH
	movlw	low 16197
	movwf	PWM1PRL
	bsf load1		;3
	movlw	85
	movwf	ms_cnt
	call	w_time
	movlw	high 18161
	movwf	PWM1PRH
	movlw	low 18161
	movwf	PWM1PRL
	bsf load1		;4
	movlw	170
	movwf	ms_cnt
	call	w_time
	movlw	high 13620
	movwf	PWM1PRH
	movlw	low 13620
	movwf	PWM1PRL
	bsf load1		;5a
	movlw	high 21621
	movwf	PWM3PRH
	movlw	low 21621
	movwf	PWM3PRL
	bsf load3		;5b
	movlw	85
	movwf	ms_cnt
; belép a hármas csatorna
	bsf	PWM3CON,PWM3OE
	call	w_time
	movlw	high 13620
	movwf	PWM1PRH
	movlw	low 13620
	movwf	PWM1PRL
	bsf load1		;6a
	movlw	high 20407
	movwf	PWM3PRH
	movlw	low 20407
	movwf	PWM3PRL
	bsf load3		;6b
	movlw	85
	movwf	ms_cnt
	call	w_time
	movlw	high 18161
	movwf	PWM1PRH
	movlw	low 18161
	movwf	PWM1PRL
	bsf load1		;7a
	movlw	high 21621
	movwf	PWM3PRH
	movlw	low 21621
	movwf	PWM3PRL
	bsf load3		;7b
	movlw	255
	movwf	ms_cnt
	call	w_time
; a kimenetek visszatérnek nullára:
	bcf	PWM1CON,PWM1OE
	bcf	PWM3CON,PWM3OE
; a tartó kimenet is:
	banksel	LATA
	bcf	LATA,0
; 510 ms szünet, ezalatt nem lehet a gombbal újraindítani (!)
; Arra való, hogy a tápra induló változat ne tudjon magától átstartolni,
; illetve, hogy nyomva tartott gombnál szünet legyen két dallam között.
; Gombra induló változatnál célszerű rövidíteni.
	movlw	255
	movwf	ms_cnt
	call	w_time
	banksel	PORTA
	goto	gomb_var
	
w_time
	clrf	tflags
w_2ms
	btfss	ms2	; 2 ms flag nincs
	goto	w_2ms
	decfsz	ms_cnt,f
	goto	w_time	; itt már van,törölni kell
	return
	
	END
				
	
	
		