;	Venter paa async input, bruger det tal som antal blink
;	DB Henrik Kressner

;	gpasm -a inhx32 seriel6.asm

	processor       16f1509
	include         p16f1509.inc

errorlevel -302

CONFIG  FOSC    =   INTOSC
CONFIG  WDTE    =   OFF
CONFIG  LVP		=   ON

i   	org 0x70
antal	org	0x71

	ORG	0x0000
	goto	init

		org	05
init:	banksel	OSCCON
		movlw   B'01111011'     ; 16 Mhz, Intern osc.
		movwf   OSCCON
		clrf	TRISA
		clrf	TRISB		; Hele B er digital output
		bsf		TRISB,RB5	; RB er Rx, altsaa input
		movlb	3			; Bank 3
		clrf	ANSELB		; Port B er Digital
		; Set baudrate for 115.200 ->
		; BRG16 = 1  :  BRGH = 1  :  SPBRG = 34
		movlw	B'00001000'	; BAUDCON er i bank 3
		movwf	BAUDCON		; BRG16 = 0
		movlw	D'34'
		movwf	SPBRGL
		bsf	TXSTA, BRGH		; High Baud Rate Select bit
		bsf	TXSTA, TXEN		; Transmit enabled
		bcf	TXSTA, SYNC		; Async
		bsf	RCSTA, SPEN		; Serial Port Enable bit
		bsf	RCSTA, CREN		; Enable Rx

run:	call 	Rx
	call	Blink
	goto	run

Rx:		banksel	PIR1
		btfss	PIR1,RCIF	; Er der noget
		goto	$-1
		banksel	RCSTA
		movfw	RCREG		; Laes byte
		movwf	antal
		call	wait
		return

Blink:	; Blinker det antal gange der staar i antal
		banksel PORTA
		bsf		PORTA,RA2
		call	delay
		banksel	PORTA
		bcf		PORTA,RA2
		call	delay
		decfsz	antal,1
		goto	Blink
		return

delay:
	movlw	0x0F
	movwf	i
ll:	call	wait
	decfsz	i,1
	goto	ll
	return

wait:
    banksel TMR0
    clrf    TMR0
    banksel OPTION_REG
    movlw   B'00000111' ; Prescaler
    movwf   OPTION_REG
    bcf     INTCON, TMR0IF  ; Start timer
l1: btfss   INTCON, TMR0IF  ; Timer overflow
    goto    l1
    return

end
