;PWM servo, Próba

	#include <p16f882.inc>		;proci választás

__config _CONFIG1, (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _CPD_OFF & _CP_OFF & _IESO_OFF & _FCMEN_OFF & _LVP_OFF)

#define	szervo	PORTA,1

bank0	macro			;Bank 0 makrója
	bcf	STATUS,RP0
	bcf	STATUS,RP1
	endm
bank1	macro			;Bank 1 makrója
	bsf	STATUS,RP0
	bcf	STATUS,RP1
	endm
bank2	macro			;Bank 2 makrója
	bcf	STATUS,RP0
	bsf	STATUS,RP0
	endm
bank3	macro			;Bank 3 makrója
	bsf	STATUS,RP0
	bsf	STATUS,RP1
	endm
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
	cblock 0x20
w_save
s_save
valtas
kiteres
	endc
ciklus	equ	.40					;kitérés ciklus érték
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
	org 0x000					;Program kezdete
nop
	goto	init
	org	0x004					;Megszakítás						
	movwf	w_save				;a W értékének mentése
	swapf	STATUS,w			;a status bitcserés másolása
	movwf	s_save				;status mentése
	bcf		PIR1,TMR1IF			;INT jelzés törlése
	btfsc	szervo				;kimenet állapot ha magas
	goto	szun				;ugrás a 20ms szünetre
	bsf	szervo					;ha alacson bekapcsoljuk
	btfss	valtas,0			;a váltás vizsgálata ha 0
	goto	jobb				;akkor jobbra fordul ha 1 akkor balra
        call	bal_pwm_mod		;Timer1 újratöltése
		decfsz	kiteres			;ciklus kezdete
		goto	intveg			;int vége
		clrf	valtas			;váltás törlése
		movlw	ciklus			;ciklus mozgatása
		movwf	kiteres			;kitérésbe
		goto	intveg			;int vége
jobb						;jobbra fordul
		call	jobb_pwm_mod	;Timer1 újratöltése
		decfsz	kiteres			;ciklus kezdete
		goto	intveg			;int vége
		movlw	d'1'			;váltás értékadása
		movwf	valtas			;érték mozgatása
		movlw	ciklus			;ciklus mozgatása
		movwf	kiteres			;kitérésbe
		goto	intveg			;int vége
szun						;20ms szünet
		call	tmr1_pwm_mod	;Timer1 újratöltése
		bcf	szervo				;kimenet kikacsolása
intveg						;interrupt vége
		swapf	s_save,w		;a s_save bitcserés másolása a W-be 
		movwf	STATUS			;a s_save másolása a STATUS-ba 
		swapf	w_save,f		;a w_save bitcseréje 
		swapf	w_save,w		;a w_save másolása a W-be 
	retfie						; vége a megszakításnak
init
bank0
	clrf	PORTA		;PortA törlése
	clrf	PORTB		;PortB törlése
	clrf	PORTC		;PortC törlése
	clrf	ADCON0		;Analog törlése
	clrf	CCP1CON		;CCP törlése
bank3
	clrf	ANSEL	
bank1
	clrf	TRISA		;TRISA mind kimenet
	clrf	TRISB		;TRISB mind kimenet
	movlw	b'11110000'	;TRISC 7:4 bemenet
	movwf	TRISC		;3:0 kimenet
bank0
	call	tmr1_pwm_mod		;Timer1 beállítása
	clrf	valtas				;váltás törlése
	movlw	ciklus				;ciklus mozgatása
	movwf	kiteres				;kitérésbe
bank1
		bsf	PIE1,TMR1IE			;Timer1 INT engedélyezve
bank0
		bsf	INTCON,PEIE			;Periféria INT engedélyezve
		bsf	INTCON,GIE			;Globál INT engedélyezése
	clrwdt
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
start					;Főprogram
	bsf	PORTB,1	
	goto	start
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
tmr1_pwm_mod			;20ms-os szubrutin kezdete
bank0
		clrf	T1CON			;Timer1 leállítása
		movlw	d'170'			;Timer1 felső byte
		movwf	TMR1H			;osztás szám betöltése H_byte
		movlw	d'250'			;Timer1 alsó byte
        movwf   TMR1L           ;osztás szám betöltése L_byte
		movlw	b'00000001'		;Timer1 1:1
		movwf	T1CON			;Timer1 beállítása és indítása 
	return						;20ms szubrutin vége
bal_pwm_mod				;baloldalra mozgás szubrutin
bank0
		clrf	T1CON			;Timer1 leállítása
		movlw	d'1'			;1-et írunk a
		movwf	valtas			;váltásba
		movlw	d'252'			;Timer1 felső byte
		movwf	TMR1H			;osztás szám betöltése H_byte
		movlw	d'62'			;Timer1 alsó byte
		movwf	TMR1L			;osztás szám betöltése L_byte
		movlw	b'00000001'		;Timer1 1:1
		movwf	T1CON			;Timer1 beállítása és indítása
	return						;bal szubrutin vége
jobb_pwm_mod			;jobboldalra mozgás szubrutin
bank0
		clrf	T1CON			;Timer1 leállítása
		movlw	d'248'			;Timer1 felső byte
		movwf	TMR1H			;osztás szám betöltése H_byte
		movlw	d'87'			;Timer1 alsó byte
		movwf	TMR1L			;osztás szám betöltése L_byte
		movlw	b'00000001'		;Timer1 1:1
		movwf	T1CON			;Timer1 beállítása és indítása
	return						;jobb szubrutin vége
end				;Progi vége