не жизнь а лень )) правду и только правду ))
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено DSN 06 августа 2004 г. 12:05
В ответ на: а что делать - жизнь заставляет:) для 6585 отправлено Hol` 06 августа 2004 г. 11:59

;---------------------------------------;
intlo: movwf w_il ;
movff STATUS,s_il ;
movff BSR,b_il ;
movff FSR0H,fh_il ;
movff FSR0L,fl_il ;
intloc: ;
movff CANCON,tcancon ;
movff CANSTAT,tcanstat ;
btfsc PIR3,ERRIF ;
bra intcanerr ;
btfsc PIR3,RXB0IF ;
bra intcanrxb0 ;
btfsc PIR3,RXB1IF ;
bra intcanrxb1 ;
btfsc PIR3,TXB0IF ;
bra intcantxb0 ;
nointtx: ;
movff fl_il,FSR0L ;
movff fh_il,FSR0H ;
movff b_il,BSR ;
movf w_il,W ;
movff s_il,STATUS ;
retfie ;


;==================_CAN_INT_===============================
intcanerr: ;Error
bcf PIR3,ERRIF ;Clear the interrupt flag
movlb 0x0f ;
clrf RXERRCNT,1 ;сброс ошибок приемника.
clrf TXERRCNT,1 ;сброс ошибок передатчика.
movlb 0x00 ;
bra intloc ;end
intcantxb2: ;TXB2
bcf PIR3,TXB2IF ;Clear the interrupt flag
bra intloc ;end
intcantxb1: ;TXB1
bcf PIR3,TXB1IF ;Clear the interrupt flag
bra intloc ;end
intcantxb0: ;TXB0
bcf PIR3,TXB0IF ;Clear the interrupt flag
call cansrch ;TRANSMIT
bra intloc ;end
intcanrxb1: ;RXB1
movlw 0x0A ;
call canrecived ;
bcf PIR3,RXB1IF ; Clear the interrupt flag
movlb 0x0f ;
bcf RXB1CON,RXFULL,1 ;Clear Buffer.
movlb 0x00 ;
bra intloc ;end
intcanrxb0: ;RXB0
movlw 0x0C ;
call canrecived ;
bcf PIR3,RXB0IF ; Clear the interrupt flag
movlb 0x0f ;
bcf RXB0CON,RXFULL,1 ;Clear Buffer.
movlb 0x00 ;
bra intloc ;end
intcanwup: ;Wake-up on interrupt
bcf PIR3,WAKIF ;Clear the interrupt flag
bra intloc ;end
;-----------------------------------------------;
canrecived: ;
movlb 0x0f ;bank 15
bcf CANCON,1,1 ;
bcf CANCON,2,1 ;
bcf CANCON,3,1 ;
iorwf CANCON,F,1 ;
btfss RXB0CON,RXFULL,1 ;
return ;нет данных.
btfsc RXB0CON,RXRTRRO,1 ;
bra canrecend ;не тот тип сообщения.
movlw 0x07 ;
cpfseq RXB0DLC,1 ;
bra canrecend ;неверная длина сообщения.
btfss canon ;
bra canrecend ;CAN запрещен.
btfss canrcen ;
bra canrecend ;CAN запрещен.
;-------------------------------;
canrsrch: ;
lfsr 1,bftr ;загрузка указателя на буффера передатчиков.
canrsrch0: ;
btfsc INDF1,7 ;занят ?
bra canrsrch1 ;да.
bsf INDF1,7 ;занять буфер.
bsf INDF1,2 ;CAN+
bra canrecdat ;end
canrsrch1: ;
movlw 0x08 ;
addwf FSR1L,F ;
btfss fc ;=256
bra canrsrch0 ;
bra canrecend ;нет свободных буферов.
;-------------------------------;
canrecdat: ;копирование сообщения в буфер.
incf FSR1L,F ;
movff RXB0D0,INDF1 ;
incf FSR1L,F ;
movff RXB0D1,INDF1 ;
incf FSR1L,F ;
movff RXB0D2,INDF1 ;
incf FSR1L,F ;
movff RXB0D3,INDF1 ;
incf FSR1L,F ;
movff RXB0D4,INDF1 ;
incf FSR1L,F ;
movff RXB0D5,INDF1 ;
incf FSR1L,F ;
movff RXB0D6,INDF1 ;
canrecend: ;
bcf RXB0CON,RXFULL,1 ;Clear Buffer.
movff tcancon,CANCON ;
movlb 0x00 ;
return ;
;-----------------------------------------------;
cansrch: ;
lfsr 1,bftr ;загрузка указателя на буффера передатчиков.
cansrch0: ;
btfss INDF1,7 ;занят ?
bra cansrch1 ;нет.
btfss INDF1,5 ;CAN send ?
bra cansrch1 ;нет.
bra cantransmit ;нашли.
cansrch1: ;
movlw 0x08 ;
addwf FSR1L,F ;
btfss fc ;=256
bra cansrch0 ;
bcf PIE3,TXB0IE ;Disable Interrupt
return ;
cantransmit: ;
bcf INDF1,5 ;CAN обработал.
bcf INDF1,7 ;освободить буфер.
;данные.
incf FSR1L,F ;
movff INDF1,TXB0D0 ;
incf FSR1L,F ;
movff INDF1,TXB0D1 ;
incf FSR1L,F ;
movff INDF1,TXB0D2 ;
incf FSR1L,F ;
movff INDF1,TXB0D3 ;
incf FSR1L,F ;
movff INDF1,TXB0D4 ;
incf FSR1L,F ;
movff INDF1,TXB0D5 ;
incf FSR1L,F ;
movff INDF1,TXB0D6 ;
;идентификатор.
movff canadr3,TXB0SIDH ;адрес устройства.
movff canadr2,TXB0SIDL ;
movff canadr1,TXB0EIDH ;
movff canadr0,TXB0EIDL ;
;передать 7 байт ;
bcf PIR3,TXB0IF ;Clear the interrupt flag
movlb 0x0f ;bank 15
movlw 0x07 ;7=bytes
movwf TXB0DLC,1 ;long message
bsf TXB0CON,TXREQ,1 ;Start Transmit
movlb 0x00 ;bank 0
return ;

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru