;	2 pont klíma szabályzó
;	Készítette: Bandita18 2012.05.18
;
;	IO kiosztás:
;		ANALOG IN:
;			-RA0:LM35
;			-RA1: ALSŐ pont potmétere
;			-RA2: FELSŐ pont potmétere
;		DIGITAL IN:
;			-RB0: azonnali hűtés
;			-RB1: reset
;			-RB2: szabályzás be
;			-RB3: szabalyzás ki
;		DIGITAL OUT:
;			-RC4: hűtés teljesítmény fokozata
;			-RC5: szabályzás kikapcsolva piros led
;			-RC6: szabályzás bekapcsolva zöld led
;			-RC7: hűtés visszajelzés zöld led

#include <p16F886.inc>
	__CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
	__CONFIG    _CONFIG2, _WRT_OFF & _BOR21V

cblock 0x20
	d1			;időzítőhőz
	d2			;időzítőhőz
	d3			;időzítőhőz
	TEMPER		;LM35 beolvasása
	TEMPER1		;előbbi másolása
	TEMPER2		;ugyan az
	ALSO		;alsó pont potméterének beolvasása
	FELSO		;felső pont potméterének beolvasása
endc
org 0

;-------------------------------------------------------------------------------------------
;Portok konfigurálása, visszajelzők tesztelése

Start:
    banksel   TRISA
    movlw     b'11111111'
    movwf     TRISA

    banksel   TRISB
    movlw     b'11111111'
    movwf     TRISB

	banksel   TRISC
	movlw	  b'00000000'
	movwf     TRISC

	banksel		ADCON1
	movlw     	b'00000000'
	movwf		ADCON1

    BANKSEL   ANSEL
    movlw     b'11111111'
    movwf     ANSEL

	BANKSEL ANSELH
	movlw     B'00000000'
	movwf     ANSELH

	banksel   PORTC
	clrf	PORTC
;--------------------------------
; ledek indítása start villogás
led
	call	felsec
	movlw	  b'01000000'
	movwf     TRISC
	call	felsec
	movlw	  b'00100000'
	movwf     TRISC
	call	felsec
	movlw	  b'10000000'
	movwf     TRISC
	call	felsec
	clrf	PORTC
	call	felsec
	movlw	  b'11100000'
	movwf     TRISC
	call	felsec
	clrf	PORTC
	call	felsec
;-------------------------------------------------------------------------------------
;főprogram kezdete
main
	BTFSS PORTB,1 ;reset gomb
	goto Start

	BTFSS PORTB,0 ;azonnali hűtés gomb
	call hutesbe	;hűtés be

	BTFSC PORTB,0 ;azonnali hűtés gomb
	call huteski	;hűtés ki

	BTFSS PORTB,2 ;szabályzás be
	call szabbe

	BTFSS PORTB,3 ;szabályzás ki
	call szabki

	BTFSC PORTC,0	;PORTC,0 értéke alapján küldi át a szabályozás rutinba vagy vissza
	goto szabalyozas
goto main


;------------------------------------------------------------------------------------
;szabályozás szubrutin
szabalyozas
	BTFSS PORTB,1 ;reset
	goto Start

	BTFSS PORTB,3 ;szabályzás ki
	call szabki

	BTFSS PORTC,0	;PORTC,0 értéke alapján küldi át a szabályozás rutinba vagy vissza a mainbe
	goto main

;------------------------------------------------
;	RA0 olvasása -> TEMP
;	szenzor értékeinek beolvasása
	banksel	ADCON0
	movlw     b'01000001'
	movwf     ADCON0 
;	call	ADdelay
	call	adcTemp

;------------------------------------------------
;	RA1 olvasása -> ALSO
;	alsó pont potméter
	banksel	ADCON0
	movlw     b'01000101'
	movwf     ADCON0 
;	call	ADdelay
	call	adcALSO

;------------------------------------------------
;	RA2 olvasása -> FELSO
;	felső pont potméter
	banksel	ADCON0
	movlw     b'01001001'
	movwf     ADCON0 
;	call	ADdelay
	call	adcFELSO


;------------------------------------------------
;egyenlőtlenségi műveletek, ill azok alapján 
;hűtés be és ki kapcsolása
FELSOPONT
;IF [TEMPER]>[FELSO]?
	clrw
	bcf		STATUS,C	
	
	MOVF	TEMPER1,0			;[W]=[TEMPER]
	SUBWF	FELSO,0			;[W]=[A]-[B]

	BTFSS	STATUS,C	
	GOTO	FELSO_IGEN	;igen
	GOTO	ALSOPONT	;nem

ALSOPONT
;IF [TEMPER]>[ALSO]?
	clrw
	bcf		STATUS,C	

	MOVF	TEMPER2,0		;[W]=[TEMPER]
	SUBWF	ALSO,0		;[W]=[A]-[B]

	BTFSS	STATUS,C	
	GOTO	szabalyozas	;igen
	GOTO	ALSO_NEM	;nem

goto szabalyozas

FELSO_IGEN
call	hutesbe
goto	szabalyozas

ALSO_NEM
call	huteski
goto	szabalyozas


;------------------------------------------------------------------------------------
;szubrutinok
;------------------------------------------------
;hűtést kapcsoló szubrutinok
hutesbe
	bsf     PORTC,7	;hűtés jelző led felkapcsolása
	bsf     PORTC,4	;teljesítményfokozat felkapcsolása
return

huteski
	bcf     PORTC,7	;hűtés jelző led lekapcsolása
	bcf     PORTC,4	;teljesítményfokozat lekapcsolása
return

;------------------------------------------------
;szabaályzást kapcsolóló szubrutinok
szabbe
	bsf		PORTC,6	;zöld led ki
	bcf		PORTC,5	;piros led be
	bsf		PORTC,0 ;szabbe regiszter 1-re állítása
return

szabki
	bcf		PORTC,6	;zöld led be
	bsf		PORTC,5	;piros led ki
	bcf		PORTC,0 ;szabbe regiszter 0-ra állítása
return

;------------------------------------------------
adcTemp
;	RA0 olvasása -> TEMP
;	szenzor értékeinek beolvasása
;	call	ADdelay
;	nop                      ; wait 5uS for A2D amp to settle and capacitor to charge.
;	nop                      ; wait 1uS
;	nop                      ; wait 1uS
;	nop                      ; wait 1uS 
;	nop                      ; wait 1uS
;	bsf       ADCON0,GO_DONE ; start conversion
;	btfss     ADCON0,GO_DONE ; this bit will change to zero when the conversion is complete
;	goto      $-1
;	movf     ADRESH,W       ; Copy the display to register
;	movwf     TEMPER
;	
	movlw	d'128'	;jelenleg előre beállított adat a teszteléshez
	movwf	TEMPER

	movfw	TEMPER	;szenzorról beolvasott érték beírása TEMPER1 és TEMPER2 regiszterbe
	movwf	TEMPER1
	movwf	TEMPER2
;	call	ADdelay
return

adcALSO
	;	RA1 olvasása -> ALSO
	;	alsó pont potméter
	;	call	ADdelay
	nop                      ; wait 5uS for A2D amp to settle and capacitor to charge.
	nop                      ; wait 1uS
	nop                      ; wait 1uS
	nop                      ; wait 1uS 
	nop                      ; wait 1uS
	bsf       ADCON0,GO_DONE ; start conversion
	btfss     ADCON0,GO_DONE ; this bit will change to zero when the conversion is complete
	goto      $-1
	movf     ADRESH,W       ; Copy the display to register
	movwf     ALSO
	;	call	ADdelay
return

adcFELSO
	;	RA2 olvasása -> FELSO
	;	felső pont potméter
	;	call	ADdelay
	nop                      ; wait 5uS for A2D amp to settle and capacitor to charge.
	nop                      ; wait 1uS
	nop                      ; wait 1uS
	nop                      ; wait 1uS 
	nop                      ; wait 1uS
	bsf       ADCON0,GO_DONE ; start conversion
	btfss     ADCON0,GO_DONE ; this bit will change to zero when the conversion is complete
	goto      $-1
	movf     ADRESH,W       ; Copy the display to register
	movwf     FELSO
	;	call	ADdelay
return

;------------------------------------------------
;Delay szubrutinok
;fél másodperc késleltetés
felsec
			;499.994 cycles
	movlw	0x03
	movwf	d1
	movlw	0x18
	movwf	d2
	movlw	0x02
	movwf	d3
felsec_0
	decfsz	d1, f
	goto	$+2
	decfsz	d2, f
	goto	$+2
	decfsz	d3, f
	goto	felsec_0

			;2 cycles
	goto	$+1

			;4 cycles (including call)
	return

;0,05s késleltetés az ADCON0 regiszter átállásához
ADdelay
			;49.993 cycles
	movlw	0x0E
	movwf	d1
	movlw	0x28
	movwf	d2
ADdelay_0
	decfsz	d1, f
	goto	$+2
	decfsz	d2, f
	goto	ADdelay_0

			;3 cycles
	goto	$+1
	nop
			;4 cycles (including call)
	return


;------------------------------------------------------------------------------------
;program vége
end