;**********************************************************
;*  DEMO876.ASM
;**********************************************************
;*  Urbán Elektronika
;*  2002.08.28
;**********************************************************
;*  A 870DEMO kártyára készült tesz program
;*
;*  Reset után a P1 potenciométerrel beállítható a mintavételezési idő
;*  elfogadása a SW2 gomb lenyomásával      
;*
;*  A P1 potenciometer érteket a beállítási idönként beolvassa
;*  és kiírja a képernyő második sorába.
;*  mérés után sleep állapotba megy
;*  hálozati táplálás esetén a mért adatot kiküldi a soros vonalon 115.200 bps
;*  SW2 gomb lenyomásával bekapcsolható az akkumulátor töltése + kiküldi az üzenetet a soros vonalra
;*  SW3 gomb lenyomásával kikapcsolható az akkumulátor töltése + kiküldi az üzenetet a soros vonalra
;*  
;*  Bekapcsolt töltés esetén a referencia feszültség méréséből kell kiszámolni
;*  hogy az AC adapter fel van e kapcsolva. (a belső referencia bekepcsolásával 
;*  kell megmérni az AN3 lábon levő feszültséget ebböl lehet következtetni, hogy
;*  valójában mekkora a tápfeszültség. ha a tápfesz nagyobb mint 4.8 akkor biztos hogy csatlakoztatva
;*  van az AC adapter. Ha kisebb akkor ki kell kapcsolni a töltés modot.
;*
;**********************************************************
	errorlevel -302
	list p=16f870
	include "p16f870.inc"


;****** konstansok meghatározása ***********************
idozit	EQU	0xF2	;az egységnyi időzítés

;****** program változóinak meghetározása ***************

w_temp		EQU	0x71 
status_temp		EQU	0x72

;ezek az adatok 0. - 2.  lapon látszanak
	cblock	020H
	counter
	buffer:16
	Temp
	LowB
	MidB
	HigB
	CHIndex
	HIndex
	Index
	Help
	ora
	SRate
	TxC
	endc

;ezek az adatok a 1. - 3. lapon látszanak      
        	cblock	0A0H
        	bcount
	ccount
	I2CBuf
	endc
	
;A cimke nevü stringet kiirja a 16 byte-os buffer-ba
printxt	macro	cimke
	banksel	EEADRH
	movlw	high cimke
	movwf	EEADRH
	movlw	low cimke
	movwf	EEADR
	call	kiir
	endm

	; Start at the reset vector
	org	0x000
 	nop

	goto	Reset
;****** megszakítás kiszolgáló rutinok
	ORG     	0x004             ; interrupt vector location

	movwf   	w_temp            ; save off current W register contents
	movf	STATUS,w          ; move status register into W register
TEST	movwf	status_temp       ; save off contents of STATUS register

	banksel	PIR1
	BTFSS	PIR1,TMR1IF	;Timer okozott megszakítást?
	goto        NemTMR1	
	bcf	PIR1,TMR1IF
	banksel	PORTC
	movf	ora,F
	btfss	STATUS,Z	; ora=0 ?
	decf	ora,F	; az ora számláló csökkentése ha nagyobb mint 0
	clrf	TMR1L
	movlw	idozit
	movwf	TMR1H	;a timer1 induló értéke 1 másodpercere
		
NemTMR1
	banksel	PORTC
        	btfss	PORTB,2	;táplálás helyének vizsgálata (akku - adatapter)
	goto	AKKUi
	goto	TAPi
AKKUi	printxt	akkumod
	call	print1
	goto	EndInt
TAPi	
	banksel	TRISA
	btfss	TRISA,4	;töltés be van kapcsolva?
	goto	tolt
	printxt	acmod
	call	print1
	goto	EndInt

tolt	
;id kell beszurni a speciális AC adapter vizsgálatot
	banksel	PORTA
	movlw	b'10011001'	;az AN3 a bemenetre kacsolva Sampling
	movwf	ADCON0
	banksel	TRISA
	bcf	TRISB,2		;a referencia forrást kimenetbe kapcsolni
	printxt	toltes
	call	print1
	movlw	b'00000010'	;balra rendezve belső ref
	movwf	ADCON1
	banksel	PORTA
	bsf	PORTB,2		;a referencia fesz bekapcsolása
	movlw	b'10011101'		; az AN3 mérésének elindítása
	movwf	ADCON0
	

AN3loop
	btfsc	ADCON0,GO
	goto	AN3loop
	
	movlw	0x80
	subwf	ADRESH,W
	btfsc	STATUS,C
	goto	toltesoff		
;Az AD eredeti paraméreinek beállítása
eredeti	
	banksel	PORTA
	movlw	B'10001001'	;Fosc/32, A/D enabled
	movwf	ADCON0
	banksel	TRISA
	movlw	B'10000011'		;jobbra igazit,4 analog csatorna
	movwf	ADCON1		;föld és AN3 referenciákkal
	bsf	TRISB,2		;a referencia forrást bemenetbe kapcsolni

EndInt	
	printxt potmeter
	movf    status_temp,w     ; retrieve copy of STATUS register
	movwf	STATUS            ; restore pre-isr STATUS register contents
	swapf   w_temp,f
	swapf   w_temp,w          ; restore pre-isr W register contents
	retfie    
toltesoff
	banksel	TRISA
	bsf	TRISA,4
	goto	eredeti
	
	include "math.inc"

szamok
	DA	" ICD Demo Board "
neve
	DA	"for PIC16F870 uC"
akkumod
	DA	"-< Akku mode  >-"
acmod
	DA	"AC Adapter Mode " 
potmeter
	DA	"Result =        "
jobb
	DA	"Toltes bekapcsol"
bal
	DA	"Toltes kikapcsol"
toltes
	DA	"-<Akku toltes>- "
tulcsorg
	DA	"Tulcsorgott !!!!"
setup1
	DA	"Sampling Rate   "
setup2
	DA	"sec/samp=       "

kiir	
	movlw	08H
	movwf	counter
	movlw	buffer+0FH
	movwf	FSR

klop
	banksel	EECON1
	bsf	EECON1,EEPGD
	bsf	EECON1,RD
	NOP
	NOP
	banksel	EEADRH
	
	rlf	EEDATA,W
	rlf	EEDATH,w
	movwf	INDF	
	movlw	07FH
	andwf	EEDATA,w
	decf	FSR,F
	movwf	INDF
	incf	EEADR,F
	btfsc	STATUS,Z
	incf	EEADRH,F
	decf	FSR,F
	decfsz	counter,F
	goto	klop
	return

Reset

	
	call	InitIIC
	call	InitUART
	call	delay2sec
	call	InitLCD
	call	delay200ms
	printxt	szamok
	call	print1
	printxt	neve
	call	print2 
	call	delay2sec
	call	delay2sec
	printxt	Setup1
	call	print1
	printxt	Setup2
	call	print2
	banksel PORTC
	clrf	PORTC		;Clear PORTC
	movlw	B'10001001'	;Fosc/32, A/D enabled 
	movwf	ADCON0
	movlw	B'00001110'	;Presc=1 Oszc1_disable  TMR1_ON
	movwf	T1CON
	movlw	idozit
	movwf	TMR1H
	clrf	PIR1
	banksel	TRISC
 	movlw	B'10000111'	;TMR0 prescaler, 1:256
	movwf	OPTION_REG
	clrf	TRISC
	bsf	TRISC,7
	bsf	TRISC,6

;beállítási menü (minatvételezési idő beállítása) 
	movlw	B'00000011'		;balra igazít  analog csat.
	movwf	ADCON1		; ref+ = AN3     ref- = GND
beall
	banksel	TRISC
	bsf	PORTA,4		;a töltés a kapcsolása 
	bcf	TRISB,2		;a referencia forrást kimenetbe kapcsolni
	banksel	PORTC
	bcf	PORTA,4		;a töltés kimenet alcsonyra állítva
	bsf	PORTB,2		;a külső referencia tápfesz bekapcsolása
	call	delay5us
	call	delay5us
	bcf	INTCON,T0IF
	bsf	ADCON0,GO		;Start A/D conversion
Wait0
	btfsc	ADCON0,GO		;Wait for conversion to complete
	goto	Wait0
	banksel	TRISB
	bsf	TRISB,2		;referencia tápfeszének kikapcsolása
	banksel	PORTC
	movf	ADRESH,W	;
	andlw	0xF8
	movwf	LowB
	bcf	STATUS,C
	rrf	LowB,F
	rrf	LowB,F
	rrf	LowB,F		;/8 (0-31 skála)
	incf	LowB,F		; (1-32 skála)
	movfw	LowB
	movwf	Srate
	movwf	ora
	clrf	MidB
	clrf	HigB
	call	BinDec		;Do it again
	banksel PORTC
	movlw	6
	movwf	Index
	movlw	6
	movwf	Counter
	call	anulal		;az első nullák levágása
	call	print2
	banksel	PORTC
	btfsc	PORTB,0		;jobb gomb lenyomva?
	goto	beall		;nincs
	clrf	TMR1L
	movlw	idozit
	movwf	TMR1H
	bsf	T1CON,TMR1ON
	printxt	potmeter
	call	print2
	banksel	TRISC
	movlw	B'10000011'		;jobbra igazit,4 analog csatorna
	movwf	ADCON1		;föld és AN3 referenciákkal
	bsf	INTCON,GIE
	bsf	INTCON,PEIE
	bsf	PIE1,TMR1IE

	goto	Main

InitUART
	banksel	TRISA
	bcf	TRISC,6
	movlw	B'00000100'	;8bit async
	movwf	TXSTA	;HighSPEED  speed=oszc/16*(BRG+1)	 	
	movlw	05H
	movwf	SPBRG
	return

Main
	sleep
	
MainNo
	;billenty lekezelése (töltés be- és kikapcsolása)
	banksel	PORTB
	btfsc	PORTB,0		;SW2 gomb lenyomva?
	goto	key2		;nincs
	printxt	jobb
	call	print2
	banksel	0
	movlw	0x10
	movwf	TxC
	call	StartTX
	banksel	TRISA
	bcf	PORTA,4		;töltést bekapcsol
	banksel	PORTA
keylopj	btfss	PORTB,0		;még mindig nyomod?
	goto	keylopj
	printxt	potmeter
	call	print2
	goto	keyEnd
key2	btfsc	PORTB,1		;sw3 gomb lenyomva?
	goto	keyEnd		;nincs
	printxt	bal
	call	print2
	banksel	0
	movlw	0x10
	movwf	TxC
	call	StartTX
	banksel	TRISA
	bsf	PORTA,4		;töltést kikapcsol
	banksel	PORTB
keylopb	btfss	PORTB,1		;még mindig nyomod?
	goto	keylopb
	printxt	potmeter
	call	print2	


keyEnd
	banksel	PORTC	;az idözítés lejártának vizsgálata
	movf	ora,F
	btfss	STATUS,Z
	goto	Main	;Nem járt le, menj aludni

	movfw	SRate
	movwf	ora
	banksel	TRISB
	bcf	TRISB,2
	
	banksel	PORTC
	bsf	PORTB,2		;referencia bekapcsolása
	call	delay5us		;5usec beállási idő
	call	delay5us		;kivárása
	bcf	INTCON,T0IF
	bsf	ADCON0,GO		;Start A/D conversion
Wait
	btfsc	ADCON0,GO		;Wait for conversion to complete
	goto	Wait

	banksel	TRISB
	bsf	TRISB,2		;referencia kikapcsolása
	banksel	PORTC
	movf	ADRESH,W		;Write A/D result to PORTC
	movwf	MidB
	banksel	ADRESL
	movf	ADRESL,W
	banksel ADRESH
	movwf	LowB
	clrf	HigB
	call	BinDec		;Do it again
	banksel PORTC
	movlw	6
	movwf	Index
	movlw	6
	movwf	Counter
	call	anulal		;az első nullák levágása
	call	print2
	
	banksel	PORTC
        	btfss	PORTB,2
	goto	main2		;akkumulátor mod, ne kuldj s soros vonalra
	banksel	0
	movlw	4
	movwf	TxC		;a kiküldendő karakterek száma
	call	StartTX
main2



Mainv	
	banksel	PORTC
	btfss	PORTB,2
	goto	main
	goto	MainNo		;ne menj sleep modba


; a bufferben levő karakterek kiküldése a soros vonalra (max 16 karakter)
; a bufferben visszafelé kell elhelyezni az adatot
; a karakterek száma a TxC számlálóban

StartTX	
	banksel	TRISA
	bsf	TXSTA,TXEN		;Adás engedélyezés
	banksel	PORTA
	bsf	RCSTA,SPEN
	clrf	PIR1
	movfw	TxC
	movwf	counter		;a kiküldendő karakterek száma
	movlw	buffer-1
	addwf	counter,W		;az adó buffer kezdőcímének meghatározása
	movwf	FSR
stx	
	movf	INDF,W
	movwf	TXREG		
	decf	FSR,F
stxl	btfss	PIR1,TXIF		;adó shift reg üres?
	goto	stxl		;nem
	decfsz	counter,F
	goto	stx
	movlw	0DH
	movwf	TXREG
stx2	btfss	PIR1,TXIF
	goto	stx2	
	banksel	TRISA
stx3	btfss	TXSTA,TRMT		;kiment az összes?
	goto	stx3	
	return
	
	
	include "IICLCD.inc"

	end
