;  SATFINDER 
;    verze 1.0 f=4Mhz
        LIST P = 16F876A, R = DEC
        INCLUDE <P16F876A.INC>
        __config _BODEN_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC & _DEBUG_OFF & _CPD_OFF & _LVP_OFF
        

 cblock          0x20                 

 HODNOTA                   
 FIXDELAY                   
 N         
 ADRESA_TSA
 DATA1_TSA
 DATA2_TSA
 LED
 STAV_PRIJMU
 ZD1
 ZD2
 EE_DATA
 EE_ADR 
            
              endc


              


                      ORG 0x00
                      GOTO INIT


INIT    BCF     STATUS,RP0       ; BANKA 0
        BCF     STATUS,RP1       ; BANKA 0
        CLRF    PORTA            ; Vynulování portu A
        CLRF    PORTB            ; Vynulování portu B
        CLRF    PORTC            ; vynulování portu C
        CLRF    STAV_PRIJMU
        BSF     STATUS,RP0       ; přepnutí do banky 1
        BCF     STATUS,RP1
        MOVLW   B'110000'        
        MOVWF   TRISA            ; NASTAVENÍ RA<3:0> výstupy RA4, RA5 vstup 
        BCF     ADCON1,PCFG0
        BSF     ADCON1,PCFG1     ; stále v bance 1
        BSF     ADCON1,PCFG2
        BCF     ADCON1,PCFG3     ; vypnutí vstupů A/D převodníku
        MOVLW   B'11111111'        
        MOVWF   TRISB            ; nastav  RB0-RB7 jako vstupy
        MOVLW   B'10001111'      ; nastavení předděliče portb off,1:256 Watchdog
        MOVWF   OPTION_REG
        BSF     CMCON,CM0
        BSF     CMCON,CM1
        BSF     CMCON,CM2        ; komparátory vypnout
        MOVLW   B'00011000'      ;  vývody 3,4 PORTU C vstupy,jinak výstupy
        MOVWF   TRISC
        MOVLW   B'01100000'
        MOVWF    SSPCON2
        MOVLW   0x09
        MOVWF   SSPADD           ; nastavení 100khz I2C pro krystal 4Mhz
        BCF     SSPSTAT,CKE      ; nastavení specifikace I2C
        BSF     SSPSTAT,SMP      ; data jsou vzorkována po odeslání výstupních dat
        BCF     STATUS,RP0       ; banka 0
        MOVLW   0x38
        MOVWF   SSPCON           ; nastavení I2C master mode
        BCF     PIR1,7           ; vynulovat příznak čtení-zápisu
        BCF     PIR1,SSPIF       ; vynulovat příznak dokončení
        BCF     PIR2,BCLIF       ; vynulovat příznak kolize
        CLRF    INTCON           ; žádné přerušení ani timery
        MOVLW	0xE6		     ; počkej asi 50ms
		CALL 	NDELAY	         ; 
        CLRF    ZD1
        CLRF    ZD2
        CLRF    LED


MAIN            CALL    LEDKY
                CALL    PRIJMI_DATA
                MOVF    DATA1_TSA,W
                SUBWF   ZD1,W
                BTFSS   STATUS,Z
                GOTO    FD
                MOVF    DATA2_TSA,W
                SUBWF   ZD2,W
                BTFSC   STATUS,Z
                GOTO    MAIN
FD              CALL    ZAPIS_TSA
                MOVF    DATA1_TSA,W
                MOVWF   EE_DATA
                CLRF    EE_ADR
                CALL    ZAPIS_EE
                MOVF    DATA2_TSA,W
                MOVWF   EE_DATA
                MOVLW   0x01
                MOVWF   EE_ADR
                CALL    ZAPIS_EE
                MOVLW   0xFF
                CALL    NDELAY
                GOTO    MAIN
               

PRIJMI_DATA    BCF    STAV_PRIJMU,0
               BTFSS  PORTA,4
               GOTO   PRIJMI_DATA
               BTFSC  PORTA,5
               GOTO   PRIJMI_DATA
               MOVF   PORTB,W
               MOVWF  DATA1_TSA
BACK           BTFSC  PORTA,4
               GOTO   BACK
               BTFSC  PORTA,5
               GOTO   BACK 
NEXT1          BTFSC  PORTA,4
               GOTO   NEXT1
               BTFSS  PORTA,5
               GOTO   NEXT1
               MOVF   PORTB,W
               MOVWF  DATA2_TSA
BACK1          BTFSC  PORTA,4
               GOTO   BACK1
               BTFSC  PORTA,5
               GOTO   BACK1
NEXT2          BTFSS  PORTA,4
               GOTO   NEXT2 
               BTFSS  PORTA,5
               GOTO   NEXT2
               MOVF   PORTB,W
               MOVWF  LED
BACK2          BTFSC  PORTA,4
               GOTO   BACK2
               BTFSC  PORTA,5
               GOTO   BACK2 
               RETURN  

LEDKY          MOVLW   0x09
               SUBWF   LED,W
               BTFSS   STATUS,Z
               GOTO    DAL00
               BSF     PORTA,0
               BSF     PORTA,1
               BSF     PORTA,2
               BSF     PORTA,3
               BSF     PORTC,0
               BSF     PORTC,1
               BSF     PORTC,2
               BSF     PORTC,5
               BSF     PORTC,6
               BSF     PORTC,7  
DAL00          MOVLW   0x0A
               SUBWF   LED,W
               BTFSS   STATUS,Z
               GOTO    DAL0
               BSF     PORTA,0
               BSF     PORTA,1
               BSF     PORTA,2
               BSF     PORTA,3
               BSF     PORTC,0
               BSF     PORTC,1
               BSF     PORTC,2
               BSF     PORTC,5
               BSF     PORTC,6
               BSF     PORTC,7
DAL0           MOVLW   0x0B
               SUBWF   LED,W
               BTFSS   STATUS,Z
               GOTO    DAL1
               BSF     PORTA,0
               BSF     PORTA,1
               BSF     PORTA,2
               BSF     PORTA,3
               BSF     PORTC,0
               BSF     PORTC,1
               BSF     PORTC,2
               BSF     PORTC,5
               BSF     PORTC,6
               BSF     PORTC,7
DAL1           MOVLW   0x0C
               SUBWF   LED,W
               BTFSS   STATUS,Z
               GOTO    DAL2
               BCF     PORTA,0
               BSF     PORTA,1
               BSF     PORTA,2
               BSF     PORTA,3
               BSF     PORTC,0
               BSF     PORTC,1
               BSF     PORTC,2
               BSF     PORTC,5
               BSF     PORTC,6
               BSF     PORTC,7               
DAL2           MOVLW   0x0D
               SUBWF   LED,W
               BTFSS   STATUS,Z
               GOTO    DAL3
               BCF     PORTA,0
               BCF     PORTA,1
               BSF     PORTA,2
               BSF     PORTA,3
               BSF     PORTC,0
               BSF     PORTC,1
               BSF     PORTC,2
               BSF     PORTC,5
               BSF     PORTC,6
               BSF     PORTC,7
DAL3           MOVLW   0x0E
               SUBWF   LED,W
               BTFSS   STATUS,Z
               GOTO    DAL4               
               BCF     PORTA,0
               BCF     PORTA,1
               BCF     PORTA,2
               BSF     PORTA,3
               BSF     PORTC,0
               BSF     PORTC,1
               BSF     PORTC,2
               BSF     PORTC,5
               BSF     PORTC,6
               BSF     PORTC,7
DAL4           MOVLW   0x0F
               SUBWF   LED,W
               BTFSS   STATUS,Z
               GOTO    DAL5
               BCF     PORTA,0
               BCF     PORTA,1
               BCF     PORTA,2
               BCF     PORTA,3
               BSF     PORTC,0
               BSF     PORTC,1
               BSF     PORTC,2
               BSF     PORTC,5
               BSF     PORTC,6
               BSF     PORTC,7
DAL5           MOVLW   0x10
               SUBWF   LED,W
               BTFSS   STATUS,Z
               GOTO    DAL6
               BCF     PORTA,0
               BCF     PORTA,1
               BCF     PORTA,2
               BCF     PORTA,3
               BCF     PORTC,0
               BSF     PORTC,1
               BSF     PORTC,2
               BSF     PORTC,5
               BSF     PORTC,6
               BSF     PORTC,7
DAL6           MOVLW   0x11
               SUBWF   LED,W
               BTFSS   STATUS,Z
               GOTO    DAL7
               BCF     PORTA,0
               BCF     PORTA,1
               BCF     PORTA,2
               BCF     PORTA,3
               BCF     PORTC,0
               BCF     PORTC,1
               BSF     PORTC,2
               BSF     PORTC,5
               BSF     PORTC,6
               BSF     PORTC,7
DAL7           MOVLW   0x12
               SUBWF   LED,W
               BTFSS   STATUS,Z
               GOTO    DAL8
               BCF     PORTA,0
               BCF     PORTA,1
               BCF     PORTA,2
               BCF     PORTA,3
               BCF     PORTC,0
               BCF     PORTC,1
               BCF     PORTC,2
               BSF     PORTC,5
               BSF     PORTC,6
               BSF     PORTC,7
DAL8           MOVLW   0x13
               SUBWF   LED,W
               BTFSS   STATUS,Z
               GOTO    DAL9
               BCF     PORTA,0
               BCF     PORTA,1
               BCF     PORTA,2
               BCF     PORTA,3
               BCF     PORTC,0
               BCF     PORTC,1
               BCF     PORTC,2
               BCF     PORTC,5
               BSF     PORTC,6
               BSF     PORTC,7
               MOVLW   0x14
               SUBWF   LED,W
               BTFSS   STATUS,Z
               GOTO    DAL9
               BCF     PORTA,0
               BCF     PORTA,1
               BCF     PORTA,2
               BCF     PORTA,3
               BCF     PORTC,0
               BCF     PORTC,1
               BCF     PORTC,2
               BCF     PORTC,5
               BSF     PORTC,6
               BSF     PORTC,7
DAL9           MOVLW   0x15
               SUBWF   LED,W
               BTFSS   STATUS,Z
               GOTO    DAL10
               BCF     PORTA,0
               BCF     PORTA,1
               BCF     PORTA,2
               BCF     PORTA,3
               BCF     PORTC,0
               BCF     PORTC,1
               BCF     PORTC,2
               BCF     PORTC,5
               BCF     PORTC,6
               BSF     PORTC,7
               MOVLW   0x16
               SUBWF   LED,W
               BTFSS   STATUS,Z
               GOTO    DAL10
               BCF     PORTA,0
               BCF     PORTA,1
               BCF     PORTA,2
               BCF     PORTA,3
               BCF     PORTC,0
               BCF     PORTC,1
               BCF     PORTC,2
               BCF     PORTC,5
               BCF     PORTC,6
               BSF     PORTC,7
DAL10          MOVLW   0x17
               SUBWF   LED,W
               BTFSS   STATUS,C
               RETURN
               BCF     PORTA,0
               BCF     PORTA,1
               BCF     PORTA,2
               BCF     PORTA,3
               BCF     PORTC,0
               BCF     PORTC,1
               BCF     PORTC,2
               BCF     PORTC,5
               BCF     PORTC,6
               BCF     PORTC,7
               RETURN

ZAPIS_TSA      CALL   START_I2C       ; pošli START bit
               CALL   I2C_TEST        ; testuj dokončení
               MOVLW  0xC2            ; načti adresu TSA5059-zápis
               MOVWF  SSPBUF          ; přesuň do bufferu
               CALL   I2C_TEST        ; počkej na odeslání adresy pro TSA
               CALL   I2C_ACKIN       ; čekej na ACK od TSA
               MOVF   DATA1_TSA,W         ; přesuň kmitočet 1/2 do W
               MOVWF  SSPBUF          ; a teď pošli do TSA
               CALL   I2C_TEST        ; počkej na dokončení odeslání
               CALL   I2C_ACKIN       ; přišel potvrzovací impuls ACK od TSA5059
               MOVF   DATA2_TSA,W         ; přesuň kmitočet 2/2 do W
               MOVWF  SSPBUF          ; a teď pošli do TSA
               CALL   I2C_TEST        ; počkej na odeslání
               CALL   I2C_ACKIN       ; počkej až přijde ACK od TSA5059
               MOVLW   B'10000100'        ; načti 4 byte
               MOVWF  SSPBUF          ; pošli CONTROL BYTE 4 
               CALL   I2C_TEST        ; čekej na konec odeslání
               CALL   I2C_ACKIN       ; testuj přijetí ACK pulsu od TSA5059 
               MOVLW   B'00100000'     ; POŠLI CONTROL BYTE 5
               MOVWF  SSPBUF          ; pošli do TSA5059
               CALL   I2C_TEST        ; testuj dokončení
               CALL   I2C_ACKIN       ; testuj ACK bit od TSA
               CALL   STOP_I2C        ; konec
               MOVF   DATA1_TSA,W
               MOVWF  ZD1
               MOVF   DATA2_TSA,W
               MOVWF  ZD2
               RETURN
   
I2C_GET        BSF    STATUS,RP0      ; banka 1
               BSF    SSPCON2,RCEN    ; nastav příjem dat
               BCF    STATUS,RP0      ; banka 0
               CALL   I2C_TEST        ; čekej na provedení
               MOVF   SSPBUF,W        ; přesuň data z reg SSPBUF do W
               BSF    STATUS,RP0      ; banka 1
               BCF    SSPCON2,RCEN    ; nastav odesílání dat
               BCF    STATUS,RP0      ; zpět na banku 0
               RETURN


I2C_ACKOUT     BSF   STATUS,RP0       ; banka 1
               BSF   SSPCON2,ACKEN    ; vyšli ACK pro stv0299b
               BCF   STATUS,RP0       ; banka 0
               RETURN                   

I2C_TEST       BCF    STATUS,RP0      ; banka 0
STBP           BTFSS  PIR1,SSPIF      ; testuj dokončení vyslání dat -9 sestupnou hranu
               GOTO   STBP            ; není hotovo,znova testuj
               BCF    PIR1,SSPIF      ; vynuluj příznak dokončení operace
               RETURN

I2C_ACKIN      BSF		STATUS,RP0		 ; banka 1
	           BTFSC    SSPCON2,ACKSTAT  ; testuj přijetí pulsu ACK od STV0299B
               GOTO     FAULT            ; chyba na sběrnici,nepřijatý ACK
               BCF      STATUS,RP0       ; banka 0
               RETURN

FAULT        
               MOVLW  0xFF
               CALL   NDELAY
               MOVLW  0xFF
               CALL   NDELAY
               MOVLW  0xFF
               CALL   NDELAY 
               MOVLW  0xFF
               CALL   NDELAY
               GOTO   MAIN
               
                             
I2C_REPSTART   CALL  NECINNOST_I2C
               BSF   STATUS,RP0
               BCF   STATUS,RP1
               BSF   SSPCON2,RSEN
               BCF   STATUS,RP0
               RETURN                     

START_I2C      CALL  NECINNOST_I2C
               BSF   STATUS,RP0     
               BCF   STATUS,RP1      ; banka 1
               BSF   SSPCON2,SEN     ; pošli START
               BCF   STATUS,RP0      ; banka 0
               RETURN

STOP_I2C       CALL  NECINNOST_I2C
               BSF   STATUS,RP0      ; banka 1
               BCF   STATUS,RP1     
               BSF   SSPCON2,PEN     ; vyšli STOP bit
               BCF   STATUS,RP0
               RETURN



NECINNOST_I2C  BSF    STATUS,RP0
               BCF    STATUS,RP1     ; banka 1
ST             BTFSC  SSPCON2,SEN    ; testuj zda není na sběrnici posílán START 
               GOTO   ST
OPST           BTFSC  SSPCON2,RSEN   ; testuj zda není na sběrnici posílán opakovací START
               GOTO   OPST
STOP           BTFSC  SSPCON2,PEN    ; testuj zda není na sbšrnici posílán STOP
               GOTO   STOP
PRIJ           BTFSC  SSPCON2,RCEN   ; testuj zda není povolen na sběrnici příjem
               GOTO   PRIJ
AC             BTFSC  SSPCON2,ACKEN  ; testuj zda není odesílán ACK
               GOTO   AC
ZNCT           BTFSC  SSPSTAT,2      ; testuj zda neprobíhá zápis nebo čtení
               GOTO   ZNCT
               BCF    STATUS,RP0     ; banka 0
               RETURN


ZAPIS_EE      BCF     STATUS,RP1         ; banka 0
              BCF     STATUS,RP0
              MOVF    EE_ADR,W
              BSF     STATUS,RP1         ; banka 2      
              MOVWF   EEADR
              BCF     STATUS,RP1         ; banka 0
              MOVF    EE_DATA,W
              BSF     STATUS,RP1         ; banka 2
              MOVWF   EEDATA             ; přesuň data do EEDATA
              BSF     STATUS,RP0         ; banka 3
              BCF     EECON1,EEPGD       ; ukazatel na EEPROM paměť
              BSF     EECON1,WREN        ; povol zápis 
              BCF     INTCON,GIE         ; zakaž všechna přerušení
              MOVLW 	0x55		     ; odblokovani zapisu (povinna povolovaci sekvence)
        	  MOVWF   EECON2
        	  MOVLW 	0xAA
	          MOVWF   EECON2
              BSF     EECON1,WR     	; spustit zápis
         	  BTFSC   EECON1,WR	        ; pockat na konec zapisu
        	  GOTO  	$-1
              BSF     INTCON,GIE    	; povolit vsechna preruseni
              BCF     EECON1,WREN   	; zakazat zapis do EEPROM
        	  BCF     STATUS,RP0
              BCF     STATUS,RP1    	; banka 0
              RETURN


NDELAY
			MOVWF N				; načti N do akumulátoru
NOTOVER		CALL DELAY200		
			DECFSZ N, 1			
			GOTO NOTOVER	
			RETURN
	
;***********************************************************************************
; 200us
;***********************************************************************************

DELAY200	
			MOVLW 0x42			; 42 hexa = 66 smyček cca 200us pro krystal 4Mhz
			MOVWF FIXDELAY		
NOTDONE200	DECFSZ FIXDELAY, 1 	
			GOTO NOTDONE200		
			RETURN				

;***********************************************************************************
; 50us
;***********************************************************************************

DELAY50	
			MOVLW 0x10			; 10 hexa = 16 smyček cca 50us pro krystal 4Mhz
			MOVWF FIXDELAY		
NOTDONE50	DECFSZ FIXDELAY, 1 	
			GOTO NOTDONE50		
			RETURN				

        END