#
;--------------------------------------------------------------------------------------------------
; TCN75 RUTINOK
;
; USES: TCNCONFIG, TCNTEMPINT
;
; TCNSETCONFIG: CONFIGURATION REGISTER = W
; TCNREADTEMP: TCNTEMPINT = TEMERATURE REGISTER (!CSAK A HI-BYTE)
;
;--------------------------------------------------------------------------------------------------
;TCN75 ADDRESS: [A7:A4]=FIX(1001b), [A3:A1]=SLAVE(000b), [A0]=W/R
#define TCNWADDRESS     b'10010000'         ; CÍM ÍRÁSRA
#define TCNRADDRESS     b'10010001'         ; CÍM OLVASÁSRA
#define TCNTEMPREG           0x00                         ; TEPERATURE REGISTER
#define TCNCONFIGREG    0x01                     ; CONFIGURATION REGISTER
#define TCNHYSTREG           0x02                         ; HYSTERESIS REGISTER
#define TCNPOINTREG     0x03                      ; SET POINT REGISTER
;--------------------------------------------------------------------------------------------------
; TCNSETCONFIG: CONFIGURATION REGISTER = W
;--------------------------------------------------------------------------------------------------
TCNSETCONFIG:	MOVWF     TCNCONFIG     ; WREG tartalma TCNCONFIG-ba                     /
				CALL    I2CSTART     ; START küldése               / START
				MOVLW   TCNWADDRESS       ; írási cím a WREG-be                                                 / CÍM
				CALL    I2CWRITE     ; WREG kiírása az I2CBUS-ra és a I2CDATA-ba / ÍRÁS-ACK
				MOVLW   TCNCONFIGREG      ; a TCN75 konfigregiszterének címe a WREG-be/ POINTER
				CALL    I2CWRITE     ; WREG kiírása az I2CBUS-ra és a I2CDATA-ba / ÍRÁS-ACK
				CALL    I2CSTOP       ; STOP küldése                                 / STOP
				CALL    I2CSTART     ; START küldése               / START
				MOVLW   TCNWADDRESS       ; írási cím a WREG-be                                                 / CÍM
				CALL    I2CWRITE     ; WREG kiírása az I2CBUS-ra és a I2CDATA-ba / ÍRÁS-ACK
				MOVF    TCNCONFIG,WREG     ; TCNCONFIG tartalma a WREG-be                     / ADAT 0x00
				CALL    I2CWRITE     ; WREG kiírása az I2CBUS-ra és a I2CDATA-ba / ÍRÁS-ACK
				CALL    I2CSTOP         ; STOP küldése / STOP
				RETURN
;--------------------------------------------------------------------------------------------------
; HŐMÉRÉS
;--------------------------------------------------------------------------------------------------
HŐMÉRÉS:		CALL   LCDHOME0   ; LCD HOME
				MOVLW   'T'                   ; 'T=' kiírása
				CALL    LCDCHAR       ; .
				MOVLW   '='                   ; .
				CALL    LCDCHAR       ; .
				CALL    TCNREADTEMP        ; hőmérséklet olvasása
				MOVF    TCNTEMPINT,WREG ; INTLO = TCNTEMPINT
				MOVWF   INTLO             ; .
				CLRF    INTHI                ; INTHI = 0
				CALL    INTTOSTR     ; egész-STRING konverzió és érték kiiratás
				MOVLW   b'10110010'       ; a fok ASCII kódja
				CALL    LCDCHAR       ; .
				MOVLW   'C'                   ; C kiírása
				CALL    LCDCHAR       ; .
				RETURN
;--------------------------------------------------------------------------------------------------
; TCNREADTEMP: KIOLVASSA A TEMERATUR REGISTERT
; ! A TEMPERATURE REGISTER HI BYTE TARTALMA KERÜL A TCNTEMPINT-BE,
; ! ÍGY KIEJTJÜK A 0.5 C FOKOT ÉS EGÉSZKÉNT KAPJUK A HŐMÉRSÉKLETET
; ! KETTES KOMPLEMENSBEN.
;--------------------------------------------------------------------------------------------------
TCNREADTEMP:	CALL       I2CSTART           ; START küldése                                    / START
				MOVLW   TCNWADDRESS       ; írási cím a WREG-be                                                 / CÍM
				CALL    I2CWRITE     ; WREG kiírása az I2CBUS-ra és a I2CDATA-ba / ÍRÁS-ACK
				MOVLW   TCNTEMPREG               ; a TCN75 temp.regiszterének címe a WREG-be / POINTER
				CALL    I2CWRITE     ; WREG kiírása az I2CBUS-ra és a I2CDATA-ba / ÍRÁS-ACK
				CALL    I2CSTOP       ; STOP küldése                                 / STOP
				CALL    I2CSTART     ; START küldése               / START
				MOVLW   TCNRADDRESS       ; olvasási cím a WREG-be                          / CÍM
				CALL    I2CWRITE     ; WREG kiírása az I2CBUS-ra és a I2CDATA-ba / ÍRÁS-ACK
				CALL    I2CREAD       ; HI BYTE olvasása                                                         / OLVASÁS-ACK
				MOVWF   TCNTEMPINT               ; TCNTEMPINT = HI                                    / X
				CALL    I2CREAD       ; I2CBUS olvasása a WREG-be és a I2CDATA-ba / OLVASÁS-ACK
				CALL    I2CSTOP       ; STOP küldése                                 / STOP
				RETURN
;--------------------------------------------------------------------------------------------------
; I2C RUTINOK
;
; USES: I2CDATA
;
; I2CINIT:			100 kHz, MASTERMODE
; I2CSTART:			START KÜLDÉSE
; I2CSTOP:			STOP KÜLDÉSE
; I2CWRITE:			W KIÍRÁSA I2CBUS-RA ÉS I2CDATA-BA
; I2CREAD:			I2CBUS OLVASÁSA W-BE ÉS I2CDATA-BA
; I2CWAIT:			VÁRAKOZÁS, AMÍG A BUS FOGLALT
; I2CCHECKACK:		NYUGTA ELLENŐRZÉS, HIBA ESETÉN GOTO I2CHALT
; I2CHALT:			PROGRAM LEÁLLÍTÁS I2CACK MIATT, HIBA AZ LCD-RE
;--------------------------------------------------------------------------------------------------
#define FOSC .4000
#define BAUD .100
#define I2CTRIS TRISC
#define I2CSCL 3
#define I2CSDA 4
;--------------------------------------------------------------------------------------------------
; I2CINIT: 100 kHz, MASTERMODE
;--------------------------------------------------------------------------------------------------
I2CINIT:	BSF    I2CTRIS, I2CSCL ; SCL kimenet
			BSF     I2CTRIS, I2CSDA ; SDA kimenet
			MOVLW   b'10000000'        ; STANDARD MODE
			MOVWF   SSPSTAT     ; SET
			MOVLW   0x09                ; 100 kHz FOSC/(4*BAUD)-1
			MOVWF   SSPADD          ; SET
			MOVLW   b'00101000'       ; SSPEN, MASTERMODE
			MOVWF   SSPCON1     ; SET
			RETURN
;--------------------------------------------------------------------------------------------------
; I2CSTART: START KÜLDÉSE
;--------------------------------------------------------------------------------------------------
I2CSTART:	BSF   SSPCON2, SEN      ; START BIT
			BTFSC   SSPCON2, SEN      ; kész?
			GOTO    $-1
			RETURN
;--------------------------------------------------------------------------------------------------
; I2CSTOP: STOP KÜLDÉSE
;--------------------------------------------------------------------------------------------------
I2CSTOP:	BSF    SSPCON2,PEN        ; STOP BIT
			BTFSC   SSPCON2,PEN       ; kész?
			GOTO    $-1
			RETURN
;--------------------------------------------------------------------------------------------------
; I2CSTOP: STOP KÜLDÉSE
;--------------------------------------------------------------------------------------------------
I2CRSTART:	BSF  SSPCON2,RSEN     ; RESTART BIT
			BTFSC   SSPCON2,RSEN      ; kész?
			GOTO    $-1
			RETURN
;--------------------------------------------------------------------------------------------------
; I2CWRITE: W KIÍRÁSA I2CBUS-RA ÉS I2CDATA-BA
;--------------------------------------------------------------------------------------------------
I2CWRITE:	MOVWF         I2CDATA                 ; I2CDATA = W
			CALL    I2CWAIT       ; várakozás
			MOVF    I2CDATA,WREG       ; W = I2CDATA
			MOVWF   SSPBUF          ; SSPBUF = W
			BTFSC   SSPSTAT,R_W       ; írás kész?
			GOTO    $-1                      ;
			CALL    I2CCHECKACK        ; ACK?
			RETURN
;--------------------------------------------------------------------------------------------------
; I2CREAD: I2CBUS OLVASÁSA W-BE ÉS I2CDATA-BA
;--------------------------------------------------------------------------------------------------
I2CREAD:	CALL   I2CWAIT     ;
			BSF     SSPCON2,RCEN        ; olvasás
			BTFSC   SSPCON2,RCEN      ; kész?
			GOTO    $-1 ;
			CALL    I2CCHECKACK        ; ACK?
			MOVF    SSPBUF,WREG        ; W = SSPBUF
			MOVWF   I2CDATA     ; I2CDATA = W
			RETURN
;--------------------------------------------------------------------------------------------------
; I2CWAIT: VÁRAKOZÁS, AMÍG A BUS FOGLALT
;--------------------------------------------------------------------------------------------------
I2CWAIT:	BTFSC  SSPSTAT,R_W      ; R/W SZABAD?
			GOTO    $-1                      ;
ASDF:		MOVF      SSPCON2,WREG         ; W = SSPCON2
			ANDLW   0x1F                ; TEST ACKEN,RCEN,PEN,RSEN,SEN
			BTFSS   STATUS,Z   ; szabad?
			GOTO    ASDF                   ;
			RETURN
;--------------------------------------------------------------------------------------------------
; I2CCHECKACK: NYUGTA ELLENŐRZÉS, HIBA ESETÉN GOTO I2CHALT
;--------------------------------------------------------------------------------------------------
I2CCHECKACK:	BTFSC      SSPCON2, ACKSTAT; ACK ?
				GOTO    I2CHALT       ; LEÁLLÁS
				RETURN
;--------------------------------------------------------------------------------------------------
; I2CHALT: PROGRAM LEÁLLÍTÁS I2CACK MIATT, HIBA AZ LCD-RE
;--------------------------------------------------------------------------------------------------
I2CHALT:	CALL LCDCLR ;
			CALL LCDHOME0 ;
			MOVLW 'E' ;
			CALL LCDCHAR ;
			MOVLW ':' ;
			CALL LCDCHAR ;
			MOVLW 'A' ;
			CALL LCDCHAR ;
			MOVLW 'C' ;
			CALL LCDCHAR ;
			MOVLW 'K' ;
			CALL LCDCHAR ;
			MOVLW ' ' ;
			CALL LCDCHAR ;
			MOVLW 'H' ;
			CALL LCDCHAR ;
			MOVLW 'A' ;
			CALL LCDCHAR ;
			MOVLW 'L' ;
			CALL LCDCHAR ;
			MOVLW 'T' ;
			CALL LCDCHAR ;
			GOTO $ ;
			RETURN ;
