;********************
;*  Hőmérő program  *
;*    DS1620-szal   *
;*        by:       *
;*.:: MaSTeRFoXX::.	*
;**** 2005-10-29 ****
;Módosítva: 2006-03-18
;			Módosítás:
;						-Ha a hőmérséklet kisebb mint +- 10°C akkor
;						 ne rakjon nullát a kijelzőre (08.5°C----> 8.5°C)
;Hardver:
;		-CPU     : PIC16F871 @4MHz , XT mód
;		-Szenzor : DS1620 SPI Buszon
;		-Kijelző : 7 szegmenses kijelző 
;Először kapcsoljunk ki hibaüzeneteket..   :)))
;	ERRORLEVEL -302
;	ERRORLEVEL -207

;Proci megadása
		List p=16f871
		#include p16f871.inc

;konfigurálás
		__CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
		;XT mód;
		;Watchdog: ki
		;Power on reset: be
		;Kódos védelem: ki

    ORG     0x00		
  	goto    start
	ORG     0x04			
	goto	start	
;konstansok, változók
	CONSTANT BASE = 0x20

;maga a programhoz kell
	#DEFINE CLK PORTA,1		;CLOCK 
	#DEFINE DAT PORTA,0		;DATA
	#DEFINE RST	PORTA,2		;RESET
	#DEFINE NEG	PORTD,0		;Negatív jelzés a 7 szegmenses kijelzőn (Bekapcsolva ha L)
	#DEFINE NULL PORTD,1	;NULLA JELZÉS 							(Bekapcsolva ha H)
	#DEFINE FEL	 PORTD,2	;FELFOK (.5) jelzés						(Bekapcsolva ha L)
;Karakterminták
EGY 	EQU b'01101110'
KETTO 	EQU b'01000001'
HAROM	EQU b'01000100'	;3
NEGY 	EQU b'00100110'	;4
OT		EQU b'00010100'	;5
HAT 	EQU b'00010000'	;6
HET		EQU b'01001110'	;7
NYOLC	EQU b'00000000'	;8
KILENC	EQU b'00000100'	;9
NULLA	EQU b'00001000'	;0
PORT10	EQU PORTB
PORT1	EQU PORTC

	;Változóblokk
	CBLOCK BASE+d'1'
				COUNT ;számláló
				KIMENO
				BEJOVO1
				BEJOVO2 
				BEJOVO_TEMP
				kiirando
				szazhuszonhet
				
	ENDC
	;Változóblokk vége
;Include fájlok (a modulok)
	#include "C:\Program Files\Microchip\modules\m_bank.asm"
	#include "C:\Program Files\Microchip\modules\m_wait.asm"
	
;---- INICIALIZÁCIÓS RÉSZ ----
start
;PORTA átkapcsolása analógból digitális bemenetre
	BCF STATUS, RP0 ;
	BCF STATUS, RP1 ;Bank0
	CLRF PORTA 
	BSF STATUS, RP0 ;Select Bank 1
	MOVLW 0x06 ;Összes lábat digitális
	MOVWF ADCON1 ;módba állítani ADkonverter ki
	CLRF TRISA
	BCF STATUS,RP0	

	BSF STATUS,RP0
	CLRF TRISB
	BCF STATUS,RP0
	
	BSF STATUS,RP0 ;BANK1
	CLRF TRISD		;PORTD legyen kimenet
	BCF STATUS,RP0	;BANK0
	nop
	BSF STATUS,RP0
	CLRF TRISC
	BCF STATUS,RP0

	CLRF PORT1		;kijelző teszt
	CLRF PORT10
	BSF NEG			;NEGATÍV jelzés ki
	BSF FEL			;.5 ki jelzés ki
	BSF NULL		;0 jelzés be

;A DS1620 konfigurálása
			; 76543210
	;parancs: 00001100  ;write config
	;adat	: 00000001	; 1SHOT mode
	movlw 0xac
	movwf KIMENO
	BSF RST				;engedélyezés
	CALL SEND			;elküldeni a parnacsot
	movlw b'00000001'	
	movwf KIMENO
	CALL SEND			;elküldeni az adatot
	CALL VARJ
	BCF RST				;tiltás
	WAIT D'200'
	
eleje
	CALL START_CONVERT
	WAIT D'255'
	WAIT D'255'
	WAIT D'255'
	WAIT D'255'
	call READ_TEMPERATURE
;Most már a BEJOVO1 -ben van a hőmérséklet
	MOVLW d'127'
	MOVWF szazhuszonhet
	MOVF BEJOVO1,W			;A bejovo1-et át kell rakni a LO-ba
	MOVWF kiirando			
	RRF kiirando,F				;El kell forgatni jobbra hogy levágjuk  a 0.5'C jelzést
	BTFSS BEJOVO2,0			;ha minusz akkor 1
	GOTO POZITIV			;Ha pozitív akkor 0
;NEGATÍV HŐMÉRSÉKLET
	BCF NEG
	MOVF kiirando,W				;LO-t W-be					negatívhőmérséklet=(127-LO)
	SUBWF szazhuszonhet,W	;127-ből kivonni, az eredmény menjen a W-be
	movwf kiirando				;W-ből újta a LO-ba
	BTFSC STATUS,Z			;Ha nulla akkor 1
	CALL MINUSZNULLA
	
;Meg kell nézni hogy a 0. bitje 1-e ha igen akkor 0.5 'C van
	BTFSC BEJOVO1,0
	GOTO NINCSFELFOK_MINUSZ
	BCF FEL				;félfok jelzés
	BCF NULL			;0 kikapcsolása, 5 bekapcsolása
	GOTO FELFOK_VEGE_MINUSZ
NINCSFELFOK_MINUSZ
	BSF FEL				;kerek érték
	BSF NULL			;0 bekapcsolása, 5 kikapcsolása
FELFOK_VEGE_MINUSZ
	GOTO POZITIV_VEGE
;POZITIV HŐMÉRSÉKLET
POZITIV
	BSF NEG
	BTFSC BEJOVO1,0
	GOTO VANFELFOK_PLUSZ
	BSF NULL			;kerek érték
	BSF FEL				;0 belkapcsolásA, 5 kikpacsolása
	GOTO FELFOK_VEGE_PLUSZ
VANFELFOK_PLUSZ
	BCF FEL				;van félfok 
	BCF NULL			;0 kikapcsolása, 5 bekapcsolása
FELFOK_VEGE_PLUSZ

POZITIV_VEGE
	call kiiras				;7szegmensre kiiras
	
	WAIT d'255'

	goto eleje

START_CONVERT
;ez a rész küld az IC-nek egy parancsot, hogy végezzen el egy mérést
;PARANCS: 11101110
	MOVLW 0xee
	MOVWF KIMENO
	BSF RST
	CALL SEND
	CALL VARJ
	BCF RST
	
	RETURN

MINUSZNULLA
;Ide akkor jön ha a kivonás után (127-LO)=0 tehát ilyenkor -0.0 'C ot írna ki 
;Ilyen a valóságban nincs, ezért ki kell törölni a - jelzést
	BTFSS BEJOVO1,0
	GOTO MINUSZNULLAEGESZOT		;DE! HA -0.5 'C-van, akkor ne törölje ki!
	BSF NEG						;Nincs előjel	
MINUSZNULLAEGESZOT 
	RETURN

READ_TEMPERATURE
;Ez a rész olvassa ki a hőmérsékletet
;parancs : AA    10101010
	MOVLW B'10101010'
	MOVWF KIMENO
	BSF RST
	CALL SEND
	CALL RECEIVE
	MOVF BEJOVO_TEMP,W
	MOVWF BEJOVO1
	CALL RECEIVE
	MOVF BEJOVO_TEMP,W
	MOVWF BEJOVO2
	BCF RST
	RETURN


SEND
	MOVLW D'8'
	MOVWF COUNT
	CALL DATA_LOW			;kimenetre kapcsolás
	NOP
SEND_
	BCF CLK
	NOP
	BCF DAT
	BTFSC KIMENO,0			;HA H AKKOR H-t küldjön
	BSF DAT
SEND_VEGE
	CALL VARJ2
	BSF CLK
	RRF KIMENO,F
	DECFSZ COUNT,F
	GOTO SEND_	
	RETURN

RECEIVE
	MOVLW D'8'
	MOVWF COUNT
	CALL DATA_HIGH		;bemenetre kapcsolás
	CLRF BEJOVO_TEMP
RECEIVE_
	BCF CLK
	BCF STATUS,C
	BTFSC DAT
	BSF STATUS,C
	RRF BEJOVO_TEMP,F
	CALL VARJ2
	BSF CLK
	DECFSZ COUNT,F
	GOTO RECEIVE_
	RETURN

DATA_HIGH
	BSF STATUS,RP0
	BSF TRISA,0
	BCF STATUS,RP0
	RETURN

DATA_LOW
	BSF STATUS,RP0
	BCF TRISA,0
	BCF STATUS,RP0
	RETURN

VARJ
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP	
	RETURN

VARJ2
	WAIT 0x01
	RETURN
		

kiiras
	movf kiirando,W
	BRS  d'10',KM10		;kissebb mint 10
	movf kiirando,W
	BREG d'90',NVE90	;Nagyobb Vagy Egyenlő mint 90
	movf kiirando,W
	BREG d'80',NVE80
	movf kiirando,W
	BREG d'70',NVE70
	movf kiirando,W
	BREG d'60',NVE60
	movf kiirando,W
	BREG d'50',NVE50
	movf kiirando,W
	BREG d'40',NVE40
	movf kiirando,W
	BREG d'30',NVE30
	movf kiirando,W
	BREG d'20',NVE20
	movf kiirando,W
	BREG d'10',NVE10
vege_tizesek
	movf kiirando,W
	BREG d'9',NVE9
	movf kiirando,W
	BREG d'8',NVE8
	movf kiirando,W
	BREG d'7',NVE7
	movf kiirando,W
	BREG d'6',NVE6
	movf kiirando,W
	BREG d'5',NVE5
	movf kiirando,W
	BREG d'4',NVE4
	movf kiirando,W
	BREG d'3',NVE3
	movf kiirando,W
	BREG d'2',NVE2
	movf kiirando,W
	BREG d'1',NVE1
	BTFSS kiirando,0
	goto NVE0
vege_egyesek
	nop
	RETURN


KM10 ;ha kisebb mint 10 akkor NE a NULLA konstansot küldje ki, hanem 255-öt, 
	 ;vagyis kapcsoljha ki a kijelzőt
	movlw d'255'
	movwf PORT10
	goto vege_tizesek

NVE90
	movlw d'90'
	subwf kiirando,F
	movlw KILENC
	MOVWF PORT10
	GOTO vege_tizesek
NVE80
	movlw d'80'
	subwf kiirando,F
	movlw NYOLC
	MOVWF PORT10
	GOTO vege_tizesek
NVE70
	movlw d'70'
	subwf kiirando,F
	movlw HET
	MOVWF PORT10
	GOTO vege_tizesek
NVE60
	movlw d'60'
	subwf kiirando,F
	movlw HAT
	MOVWF PORT10
	GOTO vege_tizesek
NVE50
	movlw d'50'
	subwf kiirando,F
	movlw OT
	MOVWF PORT10
	GOTO vege_tizesek
NVE40
	movlw d'40'
	subwf kiirando,F
	movlw NEGY
	MOVWF PORT10
	GOTO vege_tizesek
NVE30
	movlw d'30'
	subwf kiirando,F
	movlw HAROM
	MOVWF PORT10
	GOTO vege_tizesek
NVE20
	movlw d'20'
	subwf kiirando,F
	movlw KETTO
	MOVWF PORT10
	GOTO vege_tizesek
NVE10
	movlw d'10'
	subwf kiirando,F
	movlw EGY
	MOVWF PORT10
	GOTO vege_tizesek
NVE9
	movlw KILENC
	MOVWF PORT1
	goto vege_egyesek
NVE8
	movlw NYOLC
	MOVWF PORT1
	goto vege_egyesek
NVE7
	movlw HET
	MOVWF PORT1
	goto vege_egyesek
NVE6
	movlw HAT
	MOVWF PORT1
	goto vege_egyesek
NVE5
	movlw OT
	MOVWF PORT1
	goto vege_egyesek
NVE4
	movlw NEGY
	MOVWF PORT1
	goto vege_egyesek
NVE3
	movlw HAROM
	MOVWF PORT1
	goto vege_egyesek
NVE2
	movlw KETTO
	MOVWF PORT1
	goto vege_egyesek
NVE1
	movlw EGY
	MOVWF PORT1
	goto vege_egyesek
NVE0
	movlw NULLA
	MOVWF PORT1
	goto vege_egyesek



	END
