; eber.asm: "éberségi kürt"

; Ellenütemű kimenet GP0-GP1-en, közbeiktatott 1 us hosszú 00 fázissal

	list p=10f200
	list r=dec
	#include <p10f200.inc>
	
	__config _wdt_off &_cp_off & _mclre_off
	
	cblock 10h
	c17	; 16/17-es számláló a két frekvenciához
	cthi	; 3030-as számláló teteje
	ctlo	; 3030-as számláló alja
	ii	; 5 Hz flag
	rbb	; gpio háttér
	endc
	
#define inci	ii,0	; 5 Hz flagbit
#define omask	3	; kimenet maszk

	org	0
	movwf	osccal	; kalibrálás
	goto	start
	org	40h	; védhető terület kezdete
start
	clrf	gpio	; alapállapot
	movlw	80h
	option	 	; belső felhúzók engedélyezve
	movlw	8
	tris	gpio	; csak RA3 bemenet
	movlw	2
	movwf	rbb
	movlw	0xd6
	movwf	ctlo
	movlw	0x0b
	movwf	cthi
	clrf	ii
	movlw	1
	movwf	c17
; A főciklus minden ága 33 us hosszú, ez a frekvenciabeállítás kvantuma
; (egy félperiódus csak ennek az egész számú többszöröse lehet).
kmk
	decfsz	c17,f
	goto	pad1	; első kiegyenlítés (amikor nincs portállítás)
	movlw	16
	movwf	c17	; alap a nagyobb frekvencia
	btfsc	inci	; de ha inci=1, akkor
	incf	c17,f	; az alacsonyabb lesz belőle
	movlw	omask	; és jön a portbitek
	xorwf	rbb,w	; kiszámítása
	movwf	rbb
	clrf	gpio
	movwf	gpio	; és kivitele
; itt állítja a hangmagasságot (hosszabb időzítés lejárt vagy nem)
back1	
	decfsz	ctlo,f
	goto	pad2	; nem járt le
	decfsz	cthi,f
	goto	pad3	; nem járt le
	movlw	0xd6	; lejárt, tehát újratöltések
	movwf	ctlo
	movlw	0x0b
	movwf	cthi
	movlw	0xff
	xorwf	ii,f	; inci csere
back2			; itt jönnek a kiegyenlítések
	goto	$+1
	goto	$+1
	goto	$+1
	goto	$+1
	goto	$+1
	goto	kmk
pad1
	goto	$+1
	goto	$+1
	goto	$+1
	goto	back1
pad2
	goto	$+1
pad3
	nop
	goto	$+1
	goto	back2
	nop		; ez a rész már nem futhat!
	goto	start
	end
