                                     ; сигнал сброса 00м00с  по сообщениям от GPS

 ; Pins:
 ;                     +----+
 ;                Vdd -|1  8|- Vss
 ;                RA5 -|2  7|- RA0/ICSPDAT ESUART TX
 ;                RA4 -|3  6|- RA1/ICSPLCK ESUART RX
 ;           RA3/MCLR -|4  5|- RA2
 ;                     +----+
  ;
           #include    "p12f1822.inc"
           __CONFIG    _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOREN_OFF & _CLKOUTEN_OFF
           __CONFIG    _CONFIG2, _WRT_OFF & _PLLEN_OFF & _STVREN_ON & _BORV_LO & _LVP_OFF

           errorlevel  - 302
           cblock      0x20  
    uart_byte
    FLAG
    FLAG1
    time_null
           endc   
 
    #DEFINE    GPS      LATA,2  ;индикация приема сообщения "GPRMC"       
    #DEFINE    LED_NULL     LATA,4  ; выход сигнала коррекции по 00м00с
 

RESET_VECT CODE        0x0000
           PAGESEL     START
           Goto        START
ISR        CODE        0x0004
 ;-------------- прерывание по сигналу UART---------------------------
           banksel     PIR1
           Btfss       PIR1, RCIF 
           Retfie
           banksel     RCSTA
           Btfss       RCSTA, OERR
           Goto        priem_usart 
           Bcf         RCSTA, CREN
           Movf        RCREG, W
           banksel     uart_byte
           Movwf       uart_byte
           banksel     RCSTA
           Bsf         RCSTA, CREN
           Goto        out_int
priem_usart
           banksel     RCSTA
           Movf        RCREG,W 
           banksel     uart_byte
           Movwf       uart_byte           
           Bsf         FLAG, 0       ; установим флаг прерывания uart 
out_int
           banksel     PIR1
           Bcf         PIR1, RCIF 
           Retfie                                        
;--------------------------------------------------------------- 
         
;------------------ главный цикл-----------------------
START
           Call        init_pic
           Call        init_uart
 
;****************************************************************
;------------основной цикл-----------------
;****************************************************************
CYCLE
           banksel     FLAG
           Btfss       FLAG,0        ;опрос флага получения сообщения от GPS модуля
           Goto        CYCLE         ;сообщение не получено: переход на начало
                                     ;---------------------------------------- 
           Btfsc       FLAG, 1
           Goto        m_G
           Bcf         FLAG,0
           Movf        uart_byte, W
           Xorlw       '$'       
           bnz         CYCLE
           Bsf         FLAG, 1
           Goto        CYCLE
  ;------------------------------------------ 
m_G 
           Btfsc       FLAG, 2
           Goto        m_P
           Bcf         FLAG,0
           Movf        uart_byte, W
           Xorlw       'G'       
           bnz         CYCLE
           Bsf         FLAG, 2
           Goto        CYCLE
  ;------------------------------------------ 
m_P  
           Btfsc       FLAG, 3
           Goto        m_R
           Bcf         FLAG,0
           Movf        uart_byte, W
           Xorlw       'P'       
           bnz         CYCLE
           Bsf         FLAG, 3
           banksel     LATA  
           Bcf         GPS
           Goto        CYCLE
 
  ;------------------------------------------
m_R  
           Btfsc       FLAG, 4
           Goto        m_M
           Bcf         FLAG,0
           Movf        uart_byte, W
           Xorlw       'R'       
           bnz         CYCLE
           Bsf         FLAG, 4
           Goto        CYCLE
  ;------------------------------------------
m_M  
           Btfsc       FLAG, 5
           Goto        m_S
           Bcf         FLAG,0
           Movf        uart_byte, W
           Xorlw       'M'       
           bnz         CYCLE
           Bsf         FLAG, 5
           Goto        CYCLE
  ;------------------------------------------
m_S  
           Btfsc       FLAG, 6
           Goto        m_n
           Bcf         FLAG,0
           Movf        uart_byte, W
           Xorlw       'C'       
           bnz         CYCLE
           Bsf         FLAG, 6
           Goto        CYCLE  
  ;------------------------------------------
m_n  
           Btfsc       FLAG, 7
           Goto        m_null
           Bcf         FLAG,0
           Movf        uart_byte, W
           Xorlw       ','       
           bnz         CYCLE
           Bsf         FLAG, 7
           banksel     LATA
           Bsf         GPS
           Goto        CYCLE 
m_null                               ;-----------------------------------
           Btfsc       FLAG1, 0      ;вывод значения часов, разряд десятков
           Goto        m_DH
           Bcf         FLAG,0
           Bsf         FLAG1, 0 
           Movf        uart_byte, W
           Goto        CYCLE
m_DH    
           Btfsc       FLAG1, 1      ;вывод значения часов, разряд единиц
           Goto        m_EH
           Bcf         FLAG,0
           Bsf         FLAG1, 1
           Movf        uart_byte, W
           Goto        CYCLE
m_EH 
           Btfsc       FLAG1, 2
           Goto        m_DM
           Bcf         FLAG, 0
           Bsf         FLAG1, 2
           Movf        uart_byte,W   ;вывод значения минут, разряд десятков
           Movwf       time_null
           Goto        CYCLE
m_DM
           Btfsc       FLAG1, 3
           Goto        m_EM
           Bcf         FLAG, 0
           Bsf         FLAG1, 3
           Movf        uart_byte,W   ;вывод значения минут, разряд единиц    
           Xorwf       time_null, F
           bnz         CYCLE
           Bsf         FLAG1, 7
           Goto        CYCLE
m_EM
           Btfsc       FLAG1, 4
           Goto        m_DS
           Bcf         FLAG, 0
           Bsf         FLAG1, 4
           Movf        uart_byte,W   ;вывод значения секунд, разряд десятков
           Movwf       time_null
           Goto        CYCLE
m_DS
           Btfsc       FLAG1, 5
           Goto        m_ES
           Bcf         FLAG, 0
           Bsf         FLAG1, 5
           Movf        uart_byte,W   ;вывод значения секунд, разряд единиц   
           Xorwf       time_null, F
           bnz         CYCLE
           Bsf         FLAG1, 6
           Goto        CYCLE
m_ES
;----------------сравнение значений с нулевыми показаниями --------
           Btfss      FLAG1, 6
           Goto       m_n_0
           Btfss      FLAG1, 7
           Goto       m_n_0
           banksel    LATA
           Bsf        LED_NULL
           Goto       m_n_1
m_n_0
            banksel    LATA
            Bcf        LED_NULL
m_n_1           
           banksel    time_null
           Clrf       time_null
           Clrf       FLAG
           Clrf       FLAG1
           Goto       CYCLE
    
  
;********************* ПОДПРОГРАММЫ********************   
;----------------инициализация UART--------------------
init_uart
           banksel     TRISA
           Bsf         TRISA, 1      ; //Make UART RX pin input
           Bsf         TRISA, 0      ; // UART TX pin out

           banksel     SPBRGH
           Movlw       0x01
           Movwf       SPBRGH        ; //9600bps 16MHz Osc
           Movlw       0xA0
           Movwf       SPBRGL 
    
           banksel     RCSTA 
           Bsf         RCSTA, CREN   ; Enables receiver
           Bsf         RCSTA, SPEN   ; Serial port enabled (configures RX/DT
                                     ; and TX/CK pins as serial port pins)
           banksel     BAUDCON
           Bsf         BAUDCON, BRG16  ; 16-bit Baud Rate Generator 

           banksel     TXSTA
           Bcf         TXSTA, SYNC   ; Asynchronous mode
           Bsf         TXSTA, BRGH   ; High speed
           Bsf         TXSTA, TXEN   ; Transmit enabled
           banksel     PIE1
           Bsf         PIE1, RCIE    ; Enables the EUSART receive interrupt
           banksel     INTCON
           Bsf         INTCON,PEIE   ; разрешение прерывания периферийных модулей
           Bsf         INTCON,GIE    ; глобальное разрешение прерываний              
           Return          
;----------------инициализация микроконтроллера---------
init_pic
           banksel     OSCCON
           Movlw       b'01111000'   ; 16 Mhz частота
           Movwf       OSCCON        ;
           banksel     PORTA
           clrf        PORTA          
           banksel     LATA
           Clrf        LATA
           banksel     ANSELA
           clrf        ANSELA 
           banksel     TRISA  
           Movlw       b'00001011'   ; // RA0 == AN0, RA1 = in_uart   
           Movwf       TRISA
           ;banksel     APFCON
           ;movlw       b'00001001'
           ;movwf       APFCON
           banksel     FLAG
           Clrf        FLAG
           Clrf        FLAG1
           Clrf        time_null
           Return
;=====================================
           end                       ;конец всей программы





