; ; ISR for Serial I/O ; SerIsr btfsc P1Stat,RxBusy goto P1busy ; in the middle of receiving btfss RegPortb,P1RxIn goto P1RxDone ; if DbgComm != 0 bsf RegPortb,ByteDbg bcf RegPortb,ByteDbg endif ; movlw SerCount ; Start bit detected movwf P1RxCount bsf P1Stat,RxBusy goto P1RxDone P1busy decf P1RxCount,1 movf P1RxCount,0 andlw CountMask ; is it the fourth count? JMPNZ P1RxDone ; if DbgComm != 0 bsf RegPortb,BitDbg ; Rising edge on debug line bcf RegPortb,BitDbg ; Falling edge on debug line endif ; movf P1RxCount,0 xorlw StartBit ; is it the start bit? JMPNZ P1Recv1 btfsc RegPortb,P1RxIn goto P1RxDone ; Start bit is 0. Whew! bsf P1Stat,FramErr ; Framing error. Reset. bcf P1Stat,RxBusy goto P1RxDone P1Recv1 movf P1RxCount,0 xorlw StopBit ; is it the stop bit? JMPNZ P1Recv2 ; Nope. Just some old data bit. btfsc RegPortb,P1RxIn bsf P1Stat,FramErr ; Stop bit was 0. Framing error. bcf P1Stat,RxBusy movf P1RxSr,0 movwf P1RxByte ; Byte received btfsc P1Stat,RxRdy bsf P1Stat,RxOver ; Byte overwritten. Receiver overrun. bsf P1Stat,RxRdy goto P1RxDone P1Recv2 bcf RegStatus,BitCarry ; Assume bit to be 0 rrf P1RxSr,1 btfss RegPortb,P1RxIn bsf P1RxSr,7 ; and fix it if not P1RxDone btfss P1Stat,TxBusy goto P1TxDone ; Not transmitting anything decf P1TxCount,1 movf P1TxCount,0 andlw CountMask JMPNZ P1TxDone movf P1TxCount,0 ; The fourth tick. Get to work. xorlw StartBit JMPNZ P1Xmit1 bsf RegPortb,P1TxOut ; Send start bit goto P1TxDone P1Xmit1 movf P1TxCount,0 xorlw StopBit JMPNZ P1Xmit2 bcf RegPortb,P1TxOut ; Send stop bit goto P1TxDone P1Xmit2 movf P1TxCount,0 JMPNZ P1Xmit3 bcf P1Stat,TxBusy btfsc P1Stat,TxRdy ; Finished transmiting byte goto P1TxDone ; Jump if nothing in transmit buffer movf P1TxByte,0 ; Set up next byte for transmission movwf P1TxSr bsf P1Stat,TxBusy bsf P1Stat,TxRdy movlw SerCount movwf P1TxCount goto P1TxDone P1Xmit3 rrf P1TxSr,1 btfss RegStatus,BitCarry bsf RegPortb,P1TxOut btfsc RegStatus,BitCarry bcf RegPortb,P1TxOut P1TxDone return ; ; InitPort bcf P1Stat,RxRdy ; Set all status bits bcf P1Stat,RxBusy bsf P1Stat,TxRdy bcf P1Stat,TxBusy bcf P1Stat,RxOver bcf P1Stat,FramErr ; bsf RegStatus,BitRp0 bcf RegTrisb,P1TxOut ; Set Tx to output bsf RegTrisb,P1RxIn ; Set Rx to input if DbgComm != 0 bcf RegTrisb,BitDbg ; Bit tick for debugging bcf RegTrisb,ByteDbg ; Byte tick for debugging endif bcf RegOption,BitRts ; Enable RTCC timer bcf RegStatus,BitRp0 movlw RtccCount movwf RegRtcc ; Load RTCC bsf RegIntcon,BitGie ; Enable Global interrupt bsf RegIntcon,BitRtie ; Enable RTCC interrupt return ; ; P1PutC btfss P1Stat,TxRdy goto P1PutC ; Transmitter busy. keep looping btfss P1Stat,TxBusy goto TxEmpty movwf P1TxByte bcf P1Stat,TxRdy goto PutDone TxEmpty movwf P1TxSr movlw SerCount movwf P1TxCount bsf P1Stat,TxBusy PutDone return ; ; P1GetC btfss P1Stat,RxRdy goto P1GetC ; No char received yet movf P1RxByte,0 bcf P1Stat,RxRdy return