;********************************************************************************************
;			Generador de angulo de disparo de triacs con PIC12F675 - MARTINCNC
;********************************************************************************************


	list	p=12f675

#include	"p12f675.inc"

	radix	hex

	__CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

bandera			equ		0x20			;registro de interrupciones
contador		equ		0x21			;contador de interrupciones de TMR0
periodo			equ		0x22			;contador de interrupciones de TMR0
estado			equ		0x23			;registro division de periodo

posicion_1		equ		0x28			;registro de posicion de salida 1
posicion_2		equ		0x29			;registro de posicion de salida 2

adc_temp		equ		0x2C			;registro de byte alto de adc
auxiliar_temp	equ		0x2E			;registro de proposito general

w_temp			equ		0x2F			;copia de respaldo de W
status_temp		equ		0x30			;copia de respaldo de STATUS

;********************************************************************************************

	org			0x00
	goto		_inicio
	org			0x04
	goto		_interrupcion

;********************************************************************************************

_tabla

	addwf		PCL, 1

	retlw		0x01				;d'1'
	retlw		0x02				;d'2'
	retlw		0x03				;d'3'
	retlw		0x04				;d'4'
	retlw		0x05				;d'5'
	retlw		0x06				;d'6'
	retlw		0x07				;d'7'
	retlw		0x08				;d'8'
	retlw		0x09				;d'9'
	retlw		0x0A				;d'10'
	retlw		0x0B				;d'11'
	retlw		0x0C				;d'12'
	retlw		0x0D				;d'13'
	retlw		0x0E				;d'14'
	retlw		0x0F				;d'15'
	retlw		0x10				;d'16'
	retlw		0x11				;d'17'
	retlw		0x12				;d'18'
	retlw		0x13				;d'19'
	retlw		0x14				;d'20'
	retlw		0x15				;d'21'
	retlw		0x16				;d'22'
	retlw		0x17				;d'23'
	retlw		0x18				;d'24'
	retlw		0x19				;d'25'
	retlw		0x1A				;d'26'
	retlw		0x1B				;d'27'
	retlw		0x1C				;d'28'
	retlw		0x1D				;d'29'
	retlw		0x1E				;d'30'
	retlw		0x1F				;d'31'
	retlw		0x20				;d'32'

;********************************************************************************************

_interrupcion						;vector de interrupciones

	movwf		w_temp

	movf		STATUS, 0
	movwf		status_temp			;respaldo de W y registro STATUS

	movlw		0xFF
	movwf		TMR0

	btfsc		INTCON, T0IF
	call			_tmr0int

	btfsc		PIR1, CMIF
	call			_changeint

;	btfsc		PIR1, ADIF
;	call			_adcint

	movf		status_temp, 0
	movwf		STATUS

	movf		w_temp, 0
	retfie

_tmr0int

	bcf			INTCON, T0IF

	incfsz		contador, 1
	nop							;seguridad contra desbordamiento de contador (FREC < 30Hz)

	return

_changeint

	clrf			GPIO

	bcf			INTCON, GPIF
	bsf			bandera, GPIF

	return

;_adcint

;	bcf			PIR1, ADIF
;	bsf			bandera, ADIF

;	return

;********************************************************************************************

_inicio								;inicio del programa

	bcf 		STATUS,RP0		;banco 0

	clrf 		GPIO				;inicializacion de puerto GPIO
	clrf			INTCON				;inicializacion de configuracion de interrupciones
	clrf 		PIR1				;inicializacion de banderas deinterrupciones perifericas
	clrf			T1CON				;desactivo interrupciones por TMR1
	clrf			ADCON0			;desactivo conversiones adc; entrada AN0 <3:2>; VREF=VDD <6>
	movlw		b'00000111'			
	movwf		CMCON				;desactivo comparadores analogicos, entradas digitales 

	bsf			STATUS, RP0		;banco 1

	movlw		b'00100001'			;FOSC=1/32 (1,6 us @ 20 MHz) <6:4>; GP0 entrada adc ANSEL<0> 
	movwf		ANSEL

	movlw		b'00001000'			;activo la interrupcion por cambio de estado en GP3, IOC<3>
	movwf		IOC	

	movlw		b'00001001'
	movwf		TRISIO				;configuracion de puerto GP; GP0 entrada ADC; GP3 entrada GPIE

	movlw		b'01000000'
	movwf		PIE1				;activo interrupcion de conversor adc ADIE<6>

	movlw		b'10000111'
	movwf		OPTION_REG		;pull-ups desactivadas; pre-escalador para TMR0 en 1:256 (PS2:PS0 = 111)

	bcf			STATUS, RP0		;banco 0

	clrf			bandera				;inicializacion de bandera
	clrf			contador			;inicializacion de contador

	bsf			INTCON, GPIE		;activo interrupciones de cambio de estado en GP3 <3>
	bsf			INTCON, GIE		;activo interrupciones globales <7>

_cruce_inicial

	btfss		bandera, GPIF
	goto		_cruce_inicial

	bcf			bandera, GPIF

	bsf 		INTCON, T0IE		;activo interrupciones por TMR0

_cruce_siguiente

	btfss		bandera, GPIF
	goto		_cruce_siguiente

	bcf			bandera, GPIF

	movf		contador, 0
	clrf			contador

	movwf		periodo
	movwf		auxiliar_temp

	bsf			ADCON0, 0			;activo conversiones adc <0>
	bsf			ADCON0, 1			;comienzo conversion adc <1>

_conversion							;conversion adc; 1,6us @ 20MHz (11 instrucciones)

	btfsc		ADCON0, 1			;ADCON0 GO/!DONE
	goto		_conversion

	bcf			ADCON0, 0			;desactivo conversiones adc <0>

	movf		ADRESH, 0
	clrf			ADRESH

_division

	sublw		0x08

	btfss		STATUS, C
	goto		_niveles

	incf		estado, 1
	goto		_division

_niveles

	movf		estado, 0

	pagesel		_tabla
	call			_tabla

	movwf		posicion_1

	movf		estado, 0
	sublw		0x20

	pagesel		_tabla
	call			_tabla

	movwf		posicion_2
	clrf			estado

_salida

	btfsc		bandera, GPIF
	goto		_cruce_siguiente

	nop
	nop
	nop
	decfsz		auxiliar_temp, 1		;retardo de aux_temp * 8 instrucciones
	goto		_salida

	movf		periodo, 0
	sublw		0x0E				;compensacion de retardo 14 * (8 * 32) instruccioness (_gpio_1 a _gpio_6 + isr_tmr0)

	movwf		auxiliar_temp

;********************************************************************************************

_gpio_1

	btfsc		GPIO, 1
	goto		_gpio_2

	decf		posicion_1, 1

	btfsc		STATUS, C
	bsf			GPIO, 1

_gpio_2

	btfsc		GPIO, 2
	goto		_gpio_salida

	decf		posicion_2, 1

	btfsc		STATUS, C
	bsf			GPIO, 2

_gpio_salida

	movf		GPIO, 0

	xorlw		b'00000110'

	btfss		STATUS, Z
	goto		_salida

	goto		_cruce_siguiente
	end