; *******************************************************************
; pulse generator
; *******************************************************************
;
; 2008 Copyright by Frank Buss
; *******************************************************************

			LIST	P=12F508

#include "P12F508.INC"

; internal reset
; code protect off
; watchdog off
; internal oscillator (Fosc = 4 MHz)
			__CONFIG _MCLRE_OFF & _CP_OFF & _WDT_OFF & _IntRC_OSC

			org 0

; port bits
IN			EQU D'0'
IN_MASK		EQU (1 << IN)
PULSE_OUT	EQU D'1'

DELAY1		EQU D'15'   ; 0.001 ms / (1/15625 Hz)
DELAY2		EQU D'30'   ; 0.002 ms / (1/15625 Hz)

; variables
TIMER_VALUE	EQU H'08'
WAIT_COUNTER EQU H'09'
DELAY_VALUE EQU H'0a'


; program start

; init
			movwf	OSCCAL		; on reset, W contains the calibration value
			clrf	STATUS

; wake-up on port change disabled,
; pullups disabled
; timer clock source: internal, Fosc/4
; prescalar to timer: 1:64, timer runs at 15625 Hz
			clrwdt
			movlw	H'85'
			option

; set tris to test keys
			movlw	IN_MASK	 ; set IN GPIO to input
			tris	GPIO

; set pulse out to 0
START		bcf		GPIO, PULSE_OUT

; initialize delay value
			movlw	DELAY1
			btfsc	GPIO, IN
			movlw	DELAY2
			movwf	DELAY_VALUE

; wait about 20 ms
			movlw	D'156'
			call	WAIT
			movlw	D'156'
			call	WAIT

; set pulse out to 1
			bsf		GPIO, PULSE_OUT

; wait selected delay value
			movf	DELAY_VALUE, W
			call	WAIT

; repeat
			goto START

; wait 1/15625*W
WAIT		movwf	WAIT_COUNTER
WAIT_REST	call	WAIT15625
			decf	WAIT_COUNTER, F
			btfss	STATUS, Z
			goto	WAIT_REST
			retlw	0

; wait 1/15625 s
WAIT15625	movf	TMR0, W
			movwf	TIMER_VALUE
WAIT2		movf	TIMER_VALUE, W
			subwf	TMR0, W
			btfsc	STATUS, Z
			goto	WAIT2
			retlw	0

			end
