;**********************************************************************************************
;********                Firmware pre PIC 16F877a Timer                                ********
;********                                                                              ********
;********                                                                              ********
;********                          c.Niki 31    Oktober 2011                           ********
;**********************************************************************************************	
 LIST P=16F627A,R=DEC
 INCLUDE<p16f627A.inc>
                 
;inicializuj config slovo
;ORG H'2007'
;DATA H'3F36'
;******************************************************************************************************
;eqations 
 
W              EQU           0              ;W reg. 
F              EQU           1              ;F Reg.

 cblock 0x20
TEMP_W                   ;zaloha w reg. pri preruseni
TEMP_STAT                ;zaloha status reg.
TEMP_PCLATH              ;zaloha pclath reg.
TEMP_FSR                 ;zaloha FSR
TMR_10mS                 ;casovac inkrement kazdych 10ms pretecenie po 1000mSec
TMR_mS                   ;casovac inkrement kazdych 10mSec pretecie pri 255 ~ 2,55 Sec
TMR_Sec                  ;casovac 1 Sec inkrement 100mSec x 10
TMR_Min	                 ;casovac  1Min = 60 Sec,pretecie pri 255 min ~ 4h 25min
 endc

;*****************************************************************************************************D
;Vektory prerusenia

               ORG            0H
               goto           INIT
               ORG            4H
               MOVWF          TEMP_W         ;Zalohovanie pracovnych  registrov
               SWAPF          STATUS,W       ;zaloha W
               CLRF           STATUS         ;prepnutie bank0
               MOVWF          TEMP_STAT      ;zaloha STATUS
               MOVF           PCLATH,W       ;zaloha PCLATH pozadovane iba ak sa pouzivaju banky 1,2,3 
               MOVWF          TEMP_PCLATH
               CLRF           PCLATH         ;prep. bank0
               MOVF           FSR,W          ;zaloha FSR
               MOVWF          TEMP_FSR
               ;uzivatelska rutina prerruseni zacina tu.
                ;========================================================================================
               ;obsluha prerusenia TMR1 casovaca
               BTFSS          PIR1,TMR1IF    ;ak bolo prerusenie od tmr1 pokracuj v obluhe
               GOTO           OUT_INT        ;inak odchod z preruseni
               MOVLW          3CH
               MOVWF          TMR1H
               MOVLW          193;176
               MOVWF          TMR1L
               INCF           TMR_10mS,F     ;Zvys casovac o 10msec
               INCF           TMR_mS,F       ;Zvys casovac o 10msec
               MOVLW          100            ;zisti ci citac ms pretiekol
               SUBWF          TMR_10mS,W
               BNZ            OUT_INT        ;ak nepretiekol tak nic a odchod
               CLRF           TMR_10mS       ;ak uplynulo 1000ms zvys citac sekund
               INCF           TMR_Sec,F      ;sec + 1
               MOVLW          60
               SUBWF          TMR_Sec,W      ;ak uplynulo 60 sekund zvys o minutu pocitadlo minut
               BNZ            OUT_INT        ;ak nepretiekol tak nic a odchod
               CLRF           TMR_Sec       ;nuluj sekundy
               INCF           TMR_Min,F      ;minuta + ;pocet minut ponechany az do 255 a hodiny neosetrene
               ;========================================================================================

               ;TU SA MOZE VLOZIT VOLANIE PODPROGRAMU V INTERVALE 10mSec.(CALL ...)

               ;koniec uzivatelskej obsluhy prerusenia ,obnova registrov
OUT_INT        CLRF           PIR1
               MOVF           TEMP_FSR,W      ;obnova FSR
               MOVWF          FSR
               MOVF           TEMP_PCLATH,W   ;obnova PCLATH
               MOVWF          PCLATH
               SWAPF          TEMP_STAT,W     ;obnova STATUS reg.
               MOVWF          STATUS
               SWAPF          TEMP_W,F        ;Obnova W bez ovplyvnenia priznakov
               SWAPF          TEMP_W,W
               RETFIE
               
;*****************************************************************************************************D
INIT           CLRWDT
               BANKSEL        PIE1
               BSF            PIE1,0               ;povol prerusenie od TMR1
               BANKSEL        T1CON
               MOVLW          B'00000001'
               MOVWF          T1CON                ;1:8;Fosc/4;1:65535/TMR1 on
               BSF            INTCON,7             ;povol prerusenie
               BSF            INTCON,6             ;povol prerusenie od periferii
              
;****;*****************************************************************************************************
START           CLRWDT
               BANKSEL        PORTA
               ;hlavna programova slucka ,tu sa vlozi 
               ;napr. obsluha displeja
               ;staci prenasat obsah registrov TMR_Sec,TMR_min a doplnit TMR_Hod
               ;na display a mas hodiny.
         
                GOTO   START
 

 end