INCLUDE ‹P18F2480.INC›
; Reset Vector
ORG 0x000000
ResV bra START
; High Priority IRQ Vector
ORG 0x000008
HPIV bra HPIVEC
; Low Priority IRQ Vector
ORG 0x000018
LPIVEC movff STATUS , 0x0050 ;
movff WREG , 0x004F
movff FSR1L , 0x0051
movff FSR1H , 0x0052
btfss 0x9D , 4 , ACCESS ; PIE1,TXIE
bra LPIV1
btfsc 0x9E , 4 , ACCESS ; PIR1,TXIF
rcall USARTTX
LPIV1 btfss 0xF2 , 5 , ACCESS ; INTCON, TMR0IE
bra LPIV2
btfsc 0xF2 , 2 , ACCESS ; INTCON, TMR0IF
rcall TIMEP
LPIV2 btfsc 0xA4 , 1 , ACCESS ; PIR3, RXB1IF
rcall CANRX1
btfsc 0xA4 , 0 , ACCESS ; PIR3, RXB0IF
rcall CANRX0
movff 0x0051 , FSR1L
movff 0x0052 , FSR1H
movff 0x004F , WREG
movff 0x0050 , STATUS
retfie 0
USARTTX lfsr 0x1 , 0x000
movf 0x46 , W , ACCESS ;
movff PLUSW1 , TXREG
incf 0x46 , F , ACCESS ;
decfsz 0x45 , F , ACCESS ;
return 0
bcf 0x9D , 4 , ACCESS ; PIE1, TXIE
return 0
TIMEP bcf 0xF2 , 5 , ACCESS ; INTCON,TMR0IE
btfss 0xAB , 1 , ACCESS ; RCSTA,OERR
bra TIMP1
bcf 0xAB , 4 , ACCESS ; RCSTA,CREN
bsf 0xAB , 4 , ACCESS ; RCSTA,CREN
clrf 0x44 , ACCESS ;
TIMP1 bcf 0x81 , 4 , ACCESS ; PORTB, BIT4 (LED-RS232-CMD ON)
bsf 0x4E , 0 , ACCESS ;
bcf 0xAB , 4 , ACCESS ; RCSTA,CREN
return 0
CANRX1 movff CANCON , 0x0055
movff 0x0047 , FSR1H
movff 0x0048 , FSR1L
bsf 0x6F , 1 , ACCESS ; CANCON, WIN0
bcf 0x6F , 2 , ACCESS ; CANCON, WIN1
bsf 0x6F , 3 , ACCESS ; CANCON, WIN2 [RecBuf1]
movff RXB0SIDH , POSTINC1
movff RXB0SIDL , POSTINC1
movff RXB0EIDH , POSTINC1
movff RXB0EIDL , POSTINC1
movff RXB0DLC , POSTINC1
movff RXB0D0 , POSTINC1
movff RXB0D1 , POSTINC1
movff RXB0D2 , POSTINC1
movff RXB0D3 , POSTINC1
movff RXB0D4 , POSTINC1
movff RXB0D5 , POSTINC1
movff RXB0D6 , POSTINC1
movff RXB0D7 , POSTINC1
movlw 0x0D
addwf 0x48 , F , ACCESS ;
clrf 0xE8 , ACCESS ; WREG
addwfc 0x47 , F , ACCESS ;
movlw 0x02
cpfseq 0x47 , ACCESS ;
bra CRX1 ; Верхняя граница буфера HB?
movlw 0xF3
cpfsgt 0x48 , ACCESS
bra CRX1 ; Верхняя граница буфера LB?
clrf 0x47 , ACCESS
movlw 0x60
movwf 0x48 , ACCESS
CRX1 bcf 0xA4 , 1 , ACCESS ; PIR3,RXB1IF
bcf 0x60 , 7 , ACCESS ; RXB0CON, RXFUL
bcf 0x81 , 6 , ACCESS ; PORTB, BIT6 (LED-CANRX ON)
movff 0x0055 , CANCON
return 0
CANRX0 movff CANCON , 0x0055
movff 0x0047 , FSR1H
movff 0x0048 , FSR1L
movlw 0xF1
andwf 0x6F , F , ACCESS ; CANCON ; [RecBuf0]
movff RXB0SIDH , POSTINC1
movff RXB0SIDL , POSTINC1
movff RXB0EIDH , POSTINC1
movff RXB0EIDL , POSTINC1
movff RXB0DLC , POSTINC1
movff RXB0D0 , POSTINC1
movff RXB0D1 , POSTINC1
movff RXB0D2 , POSTINC1
movff RXB0D3 , POSTINC1
movff RXB0D4 , POSTINC1
movff RXB0D5 , POSTINC1
movff RXB0D6 , POSTINC1
movff RXB0D7 , POSTINC1
movlw 0x0D
addwf 0x48 , F , ACCESS ;
clrf 0xE8 , ACCESS ; WREG
addwfc 0x47 , F , ACCESS ;
movlw 0x02
cpfseq 0x47 , ACCESS
bra CRX2 ; Верхняя граница буфера HB?
movlw 0xF3
cpfsgt 0x48 , ACCESS
bra CRX2 ; Верхняя граница буфера LB?
clrf 0x47 , ACCESS
movlw 0x60
movwf 0x48 , ACCESS
CRX2 bcf 0xA4 , 0 , ACCESS ; PIR3,RXB0IF
bcf 0x60 , 7 , ACCESS ; RXB0CON, RXFUL
bcf 0x81 , 6 , ACCESS ; PORTB, BIT6 (LED-CANRX ON)
movff 0x0055 , CANCON
return 0
HPIVEC movff FSR1L , 0x0053 ; High Priority IRQ
movff FSR1H , 0x0054
clrf 0xD6 , ACCESS ; TMR0L
movf 0x44 , W , ACCESS ;
andlw 0x7F
bnz HPIV1
bsf 0x81 , 4 , ACCESS ; PORTB, BIT4 (LED-RS232-CMD OFF)
bcf 0xF2 , 2 , ACCESS ; INTCON, TMR0IF
bsf 0xF2 , 5 , ACCESS ; INTCON, TMR0IE
HPIV1 lfsr 0x1 , 0x022
movff RCREG , PLUSW1
incf 0x44 , F , ACCESS
movlw 0x22
cpfslt 0x44 , ACCESS ;
bcf 0xAB , 4 , ACCESS ; RCSTA, CREN
movff 0x0053 , FSR1L
movff 0x0054 , FSR1H
retfie 1
; Начало работы МК
START bsf 0x81 , 2 , ACCESS ; PORTB, BIT2 (TX-CAN=1)
bsf 0x81 , 4 , ACCESS ; PORTB, BIT4 (LED-RS232-CMD OFF)
bsf 0x81 , 5 , ACCESS ; PORTB, BIT5 (LED-WORK OFF)
bsf 0x81 , 6 , ACCESS ; PORTB, BIT6 (LED-CAN-RX OFF)
bsf 0x81 , 7 , ACCESS ; PORTB, BIT7 (LED-CAN-TX OFF)
movlw 0x0B
movwf 0x93 , ACCESS ; TRISB (OOOOIOII)
movlw 0x24
movwf 0xAC , ACCESS ; TXSTA, [TXEN,BRGH]
movlw 0x90
movwf 0xAB , ACCESS ; RCSTA, [SPEN,CREN]
movlw 0x02
movwf 0xAF , ACCESS ; SPBRG, [833333kps]
bcf 0x9F , 4 , ACCESS ; IPR1, TXIP
bsf 0x9D , 5 , ACCESS ; PIE1, RCIE
bsf 0x6F , 7 , ACCESS ; CANCON, REQOP2
STRT1 clrwdt
btfss 0x6E , 7 , ACCESS ; CANSTAT, OPMODE2
bra STRT1
bcf 0x60 , 6 , ACCESS ; RXB0CON, RXM1
bcf 0x60 , 5 , ACCESS ; RXB0CON, RXM0
bsf 0x60 , 2 , ACCESS ; RXB0CON, RXB0DBEN
lfsr 0x2 , RXB1CON
bcf 0xDF , 6 , ACCESS ; INDF2, RXM1
bcf 0xDF , 5 , ACCESS ; INDF2, RXM0
lfsr 0x2 , RXF0SIDH
STRT2 setf 0xDE , ACCESS ; POSTINC2 [RXF0=FFFFFFFF]
btfss 0xD9 , 5 , ACCESS ; FSR2L
bra STRT2
movlw 0x01
movwf 0x70 , ACCESS ; BRGCON1
movlw 0xFA
movwf 0x71 , ACCESS ; BRGCON2
movlw 0x07
movwf 0x72 , ACCESS ; BRGCON3; [500k]
bsf 0x73 , 5 , ACCESS ; CIOCON, ENDRHI
bcf 0xA4 , 1 , ACCESS ; PIR3, RXB1IF
bcf 0xA4 , 0 , ACCESS ; PIR3, RXB0IF
bsf 0xA3 , 1 , ACCESS ; PIE3, RXB1IE
bsf 0xA3 , 0 , ACCESS ; PIE3, RXB0IE
bcf 0xA5 , 0 , ACCESS ; IPR3, RXB0IP
bcf 0xA5 , 1 , ACCESS ; IPR3, RXB1IP
movlw 0xC2
movwf 0xD5 , ACCESS ; T0CON, [TMR0ON,T08BIT,1:8]
bcf 0xF1 , 2 , ACCESS ; INTCON2, TMR0IP
lfsr 0x0 , 0x000
STRT3 clrf 0xEE , ACCESS ; POSTINC0 [0-255 = 0x0]
btfss 0xEA , 0 , ACCESS ; FSR0H
bra STRT3
clrf 0x47 , ACCESS ;
clrf 0x49 , ACCESS ;
movlw 0x60
movwf 0x48 , ACCESS ;
movwf 0x4A , ACCESS
bsf 0xD0 , 7 , ACCESS ; RCON, IPEN [IRQ Priority EN]
movlw 0xC0
movwf 0xF2 , ACCESS ; INTCON, [GIE, PEIE]
bcf 0x81 , 5 , ACCESS ; PORTB, BIT5 (LED-WORK ON)
clrf 0x6F , ACCESS ; CANCON [ВКЛ CAN]
STRT4 clrwdt
movf 0x6E , W , ACCESS ; CANSTAT []
andlw 0xE0
btfss 0xD8 , 2 , ACCESS ; STATUS, Z
bra STRT4 ; Проверка включения CAN
MAIN clrwdt
btfsc 0x4E , 0 , ACCESS ;
rcall RXUSART ; Наличие приема команд по USART
btfsc 0xAC , 1 , ACCESS ; TXSTA, TRMT
bsf 0x81 , 7 , ACCESS ; PORTB, BIT7 (LED-CAN-TX OFF)
movf 0x49 , W , ACCESS ; Проверяем расхождение
cpfseq 0x47 , ACCESS ; индексов цикличного буфера
bra MAIN1
movf 0x4A , W , ACCESS ;
cpfseq 0x48 , ACCESS ;
bra MAIN1
bra MAIN
MAIN1 rcall TXUSART ; Передача в USART CAN-пакета из ЦБ
bra MAIN ; Основной цикл программы
; Формирование CAN пакета из буфера для USART-порта
TXUSART movff 0x0049 , FSR0H
movff 0x004A , FSR0L
TXUS1 clrwdt
btfsc 0x9D , 4 , ACCESS ; PIE1, TXIE
bra TXUS1 ; ждем окончания передачи CAN
movlw 0x70
movwf 0x00 , ACCESS
movlw 0x04
movwf 0x01 , ACCESS
movff POSTINC0 , 0x0002
movff POSTINC0 , 0x0003
movff POSTINC0 , 0x0004
movff POSTINC0 , 0x0005
lfsr 0x2 , 0x003
rcall CHNG1B1
btfss 0xEF , 6 , ACCESS ; INDF0 (Здесь Byte1 CAN-адреса)
bra TXUS2
bsf 0x03 , 7 , ACCESS ; Ставим RTR если он был
bra TXUS4
TXUS2 movf 0xEE , W , ACCESS ; POSTINC0
bz TXUS4
addwf 0x01 , F , ACCESS
movwf 0x4B , ACCESS
lfsr 0x2 , 0x006
TXUS3 movff POSTINC0 , POSTINC2 ; Копируем CAN DATA BYTES
decfsz 0x4B , F , ACCESS
bra TXUS3
TXUS4 movf 0x01 , W , ACCESS
addlw 0x02
movwf 0x45 , ACCESS
clrf 0x46 , ACCESS
lfsr 0x1 , 0x000
bsf 0x9D , 4 , ACCESS ; PIE1, TXIE
bsf 0x81 , 6 , ACCESS ; PORTB, BIT6 (LED-CANRX OFF)
movlw 0x0D
addwf 0x4A , F , ACCESS ;
clrf 0xE8 , ACCESS ; WREG
addwfc 0x49 , F , ACCESS ; Прибавляем индекс RX из CAN буф
movlw 0x02 ;
cpfseq 0x49 , ACCESS ; Верхняя граница буфера HB?
return 0
movlw 0xF3
cpfsgt 0x4A , ACCESS ; Верхняя граница буфера LB?
return 0
clrf 0x49 , ACCESS
movlw 0x60
movwf 0x4A , ACCESS
return 0
; Разбор приема с USART порта
RXUSART movf 0x23 , W , ACCESS ; проверка на кол-во байт приема
addlw 0x02
cpfseq 0x44 , ACCESS
bra RXUS32
RXUS1 clrwdt
btfss 0xAC , 1 , ACCESS ; TXSTA, TRMT
bra RXUS1
movlw 0xC0 ; Проверка на команду C0
cpfseq 0x22 , ACCESS
bra RXUS4
tstfsz 0x23 , ACCESS
bra RXUS32
bsf 0x81 , 5 , ACCESS ; PORTB, BIT5 (LED-WORK OFF)
bsf 0x6F , 7 , ACCESS
RXUS2 clrwdt
btfss 0x6E , 7 , ACCESS
bra RXUS2
movlw 0x01
movwf 0x70 , ACCESS
movlw 0xFA
movwf 0x71 , ACCESS
movlw 0x07
movwf 0x72 , ACCESS
clrf 0x6F , ACCESS
RXUS3 clrwdt
movf 0x6E , W , ACCESS
andlw 0xE0
btfss 0xD8 , 2 , ACCESS
bra RXUS3
movlw 0xC0
bra RXUS31
RXUS4 movlw 0x51 ; Проверка на команду 51
cpfseq 0x22 , ACCESS
bra RXUS7
tstfsz 0x23 , ACCESS
bra RXUS32
bsf 0x81 , 5 , ACCESS ; PORTB, BIT5 (LED-WORK OFF)
bsf 0x6F , 7 , ACCESS
RXUS5 clrwdt
btfss 0x6E , 7 , ACCESS
bra RXUS5
movlw 0x09
movwf 0x70 , ACCESS
movlw 0xFA
movwf 0x71 , ACCESS
movlw 0x07
movwf 0x72 , ACCESS
clrf 0x6F , ACCESS
RXUS6 clrwdt
movf 0x6E , W , ACCESS
andlw 0xE0
btfss 0xD8 , 2 , ACCESS
bra RXUS6
movlw 0x51
bra RXUS31
RXUS7 movlw 0x52 ; Проверка на команду 52
cpfseq 0x22 , ACCESS
bra RXUS12
tstfsz 0x23 , ACCESS
bra RXUS32
bsf 0x81 , 5 , ACCESS ; PORTB, BIT5 (LED-WORK OFF)
bsf 0x6F , 7 , ACCESS ; CANCON, CFG
RXUS8 clrwdt
btfss 0x6E , 7 , ACCESS
bra RXUS8
movlw 0x52
movwf 0x00 , ACCESS
movlw 0x20
movwf 0x01 , ACCESS
addlw 0x02
movwf 0x45 , ACCESS
lfsr 0x0 , 0x002
lfsr 0x2 , RXF0SIDH
RXUS9 movff POSTINC2 , POSTINC0
btfss 0xD9 , 5 , ACCESS ; FSR2L, BIT5
bra RXUS9
lfsr 0x2 , 0x003
movlw 0x08
movwf 0x4B , ACCESS
RXUS10 rcall CHNG1B1
movlw 0x04
addwf 0xD9 , F , ACCESS
decfsz 0x4B , F , ACCESS
bra RXUS10
clrf 0x46 , ACCESS
lfsr 0x1 , 0x000
bsf 0x9D , 4 , ACCESS
clrf 0x6F , ACCESS
RXUS11 clrwdt
movf 0x6E , W , ACCESS
andlw 0xE0
btfss 0xD8 , 2 , ACCESS
bra RXUS11
bcf 0x81 , 5 , ACCESS ; PORTB, BIT5 (LED-WORK ON)
bra RXUS32
RXUS12 movlw 0x53 ; Проверка на команду 53
cpfseq 0x22 , ACCESS
bra RXUS17
movlw 0x20
cpfseq 0x23 , ACCESS
bra RXUS32
bsf 0x81 , 5 , ACCESS ; PORTB, BIT5 (LED-WORK OFF)
bsf 0x6F , 7 , ACCESS
RXUS13 clrwdt
btfss 0x6E , 7 , ACCESS
bra RXUS13
lfsr 0x0 , 0x025
movlw 0x08
movwf 0x4B , ACCESS
RXUS14 rcall CNHG2B1
movlw 0x04
addwf 0xE9 , F , ACCESS
decfsz 0x4B , F , ACCESS
bra RXUS14
lfsr 0x0 , RXF0SIDH
lfsr 0x2 , 0x024
RXUS15 movff POSTINC2 , POSTINC0
btfss 0xE9 , 5 , ACCESS
bra RXUS15
clrf 0x6F , ACCESS
RXUS16 clrwdt
movf 0x6E , W , ACCESS
andlw 0xE0
btfss 0xD8 , 2 , ACCESS
bra RXUS16
movlw 0x53
rcall RXUS31
RXUS17 movlw 0x54 ; Проверка на команду 54
cpfseq 0x22 , ACCESS
bra RXUS18
tstfsz 0x23 , ACCESS
bra RXUS32
lfsr 0x2 , TXB0CON
bcf 0x60 , 3 , ACCESS
movlw 0x54
movwf 0x00 , ACCESS
movlw 0x02
movwf 0x01 , ACCESS
movlw 0x04
movwf 0x45 , ACCESS
movff INDF2 , 0x0002
movff COMSTAT , 0x0003
clrf 0x46 , ACCESS
lfsr 0x1 , 0x000
bsf 0x9D , 4 , ACCESS
bra RXUS32
RXUS18 movlw 0x55 ; Проверка на команду 55
cpfseq 0x22 , ACCESS
bra RXUS21
movlw 0x03
cpfseq 0x23 , ACCESS
bra RXUS32
bsf 0x81 , 5 , ACCESS ; PORTB, BIT5 (LED-WORK OFF)
bsf 0x6F , 7 , ACCESS
RXUS19 clrwdt
btfss 0x6E , 7 , ACCESS
bra RXUS19
movf 0x24 , W , ACCESS
movwf 0x70 , ACCESS
movf 0x25 , W , ACCESS
movwf 0x71 , ACCESS
movf 0x26 , W , ACCESS
movwf 0x72 , ACCESS
clrf 0x6F , ACCESS
RXUS20 clrwdt
movf 0x6E , W , ACCESS
andlw 0xE0
btfss 0xD8 , 2 , ACCESS
bra RXUS20
movlw 0x55
bra RXUS31
RXUS21 movlw 0x56 ; Проверка на команду 56
cpfseq 0x22 , ACCESS
bra RXUS26
movlw 0x01
cpfseq 0x23 , ACCESS
bra RXUS32
movlw 0x04
cpfseq 0x24 , ACCESS
bra RXUS22
bra RXUS25
RXUS22 bsf 0x81 , 5 , ACCESS ; PORTB, BIT5 (LED-WORK OFF)
bsf 0x6F , 7 , ACCESS
RXUS23 clrwdt
btfss 0x6E , 7 , ACCESS
bra RXUS23
movlw 0x09
movwf 0x70 , ACCESS
movlw 0xFA
movwf 0x71 , ACCESS
movlw 0x07
movwf 0x72 , ACCESS
clrf 0x6F , ACCESS
RXUS24 clrwdt
movf 0x6E , W , ACCESS
andlw 0xE0
btfss 0xD8 , 2 , ACCESS
bra RXUS24
RXUS25 movlw 0x56
bra RXUS31
RXUS26 movlw 0x60 ; Проверка на команду 60
cpfseq 0x22 , ACCESS
bra RXUS32
movlw 0x03
cpfsgt 0x23 , ACCESS
bra RXUS30
movlw 0x0D
cpfslt 0x23 , ACCESS
bra RXUS30
bcf 0x81 , 7 , ACCESS ; PORTB, BIT7 (LED-CAN-TX ON)
clrwdt
movlw 0x08
RXUS27 movwf 0x6F , ACCESS
btfsc 0x60 , 3 , ACCESS
bra RXUS27
clrf 0x65 , ACCESS
btfsc 0x25 , 7 , ACCESS
bsf 0x65 , 6 , ACCESS
lfsr 0x0 , 0x025
rcall CNHG2B1
movff 0x0024 , RXB0SIDH
movff 0x0025 , RXB0SIDL
movff 0x0026 , RXB0EIDH
movff 0x0027 , RXB0EIDL
movlw 0x04
subwf 0x23 , W , ACCESS
bz RXUS29
movwf 0x4B , ACCESS
iorwf 0x65 , F , ACCESS
lfsr 0x0 , TXB0D0
lfsr 0x2 , 0x028
RXUS28 movff POSTINC2 , POSTINC0
decfsz 0x4B , F , ACCESS
bra RXUS28
RXUS29 bsf 0x60 , 3 , ACCESS
clrf 0x6F , ACCESS
movlw 0x60
bra RXUS31
RXUS30 movlw 0x6F
bra RXUS31
RXUS31 movwf 0xAD , ACCESS
clrf 0x00 , ACCESS
movlw 0x01
movwf 0x45 , ACCESS
bcf 0x81 , 5 , ACCESS ; PORTB, BIT5 (LED-WORK ON)
bsf 0x81 , 4 , ACCESS ; PORTB, BIT4 (LED-RS232-CMD OFF)
clrf 0x46 , ACCESS
lfsr 0x1 , 0x000
bsf 0x9D , 4 , ACCESS
RXUS32 clrf 0x44 , ACCESS
bsf 0xAB , 4 , ACCESS
bcf 0x4E , 0 , ACCESS
return 0
; Преобразование Byte1 CAN-адреса в формат адаптера
CHNG1B1 movf 0xDF , W , ACCESS ; INDF2
andlw 0x03
movwf 0x4C , ACCESS
movlw 0xE0
andwf 0xDF , F , ACCESS ; INDF2
rrncf 0xDF , F , ACCESS ; INDF2
rrncf 0xDF , F , ACCESS ; INDF2
rrncf 0xDF , F , ACCESS ; INDF2
movf 0x4C , W , ACCESS
iorwf 0xDF , F , ACCESS ; INDF2
return 0
; Преобразование Byte1 из формата адаптера в CAN-адрес
CNHG2B1 movf 0xEF , W , ACCESS
andlw 0x40
movwf 0x4D , ACCESS
rrncf 0x4D , F , ACCESS
rrncf 0x4D , F , ACCESS
rrncf 0x4D , F , ACCESS
movf 0xEF , W , ACCESS
andlw 0x03
movwf 0x4C , ACCESS
rlncf 0xEF , F , ACCESS
rlncf 0xEF , F , ACCESS
rlncf 0xEF , F , ACCESS
movlw 0xE0
andwf 0xEF , F , ACCESS
movf 0x4C , W , ACCESS
iorwf 0xEF , F , ACCESS
movf 0x4D , W , ACCESS
iorwf 0xEF , F , ACCESS
return 0
ORG 0x300000 ; CONFIG
Data 0x2600 ; CONFIG1H,CONFIG1L : FOSC=HS+PLL OSCSEN=DISABLE
Data 0x050E ; CONFIG2H,CONFIG2L : WDTPS=1:4 WDT=EN Vbor=4,3V BOREN=Hardware PWRT=ON
Data 0x0000 ; CONFIG3H,CONFIG3L : MCLRE=OFF LPT1OSC=OFF PBADEN=OFF
Data 0x0081 ; CONFIG4H,CONFIG4L : DEBUG=OFF XINST=LEGASY BBSIZ=OFF LVP=OFF STVREN=ON
Data 0xC00F ; CONFIG5H,CONFIG5L : CODE PROTECT=NO
Data 0xE00F ; CONFIG6H,CONFIG6L : CODE PROTECT=NO
Data 0x400F ; CONFIG7H,CONFIG7L : EBTRB=Not PRTCK CODE PROTECT=NO
end ; |