OK - here it is in Assembler - disappointingly not that much faster!
Code:'**** mPULSIN defines *** Period var word[7] mPort var PortB Mask con %00000011 'Mask of port pins to check i var byte j var byte k var byte pCount var word sample var byte CALL mPULSIN END asm _mPULSIN: CLRF _Period ;Period[0] = 0 CLRF _Period + 1 CLRF _Period + 2 ;Period[1] = 0 CLRF _Period + 3 CLRF _Period + 4 ;Period[2] = 0 CLRF _Period + 5 CLRF _Period + 6 ;Period[3] = 0 CLRF _Period + 7 CLRF _Period + 8 ;Period[4] = 0 CLRF _Period + 9 CLRF _Period + 10 ;Period[5] = 0 CLRF _Period + 11 CLRF _Period + 12 ;Period[6] = 0 CLRF _Period + 13 CLRF _Period + 14 ;Period[7] = 0 CLRF _Period + 15 MOVLW 0xFF MOVWF _pCount MOVLW 0x0F MOVWF _pCount + 1 ;pCount = $FFF = 4095 MOVLW _Mask MOVWF _k ;k = Mask CLRF _sample ;clear sample flag cycle: MOVF _mPort, W ;Sample the Port ANDWF _k, W MOVWF _j ;j = Port AND Mask B0: BTFSS _j,0 ;Bit set? Pulse high GOTO B0Clear BSF _sample,0 ;flag that now sampling INCFSZ _Period ;Period[0] = Period[0] + 1 GOTO B1 INCF _Period + 1 GOTO B1 B0Clear: BTFSS _sample,0 ;Pulse low - already sampling? GOTO B1 BCF _k,0 ;Clear Bit in Mask B1: BTFSS _j,1 ;Bit set? Pulse high GOTO B1Clear BSF _sample,1 ;flag that now sampling INCFSZ _Period + 2 ;Period[1] = Period[1] + 1 GOTO B2 INCF _Period + 3 GOTO B2 B1Clear: BTFSS _sample,1 ;Pulse low - already sampling? GOTO B2 BCF _k,1 ;Clear Bit in Mask B2: BTFSS _j,2 ;Bit set? Pulse high GOTO B2Clear BSF _sample,2 ;flag that now sampling INCFSZ _Period + 4 ;Period[2] = Period[2] + 1 GOTO B3 INCF _Period + 5 GOTO B3 B2Clear: BTFSS _sample,2 ;Pulse low - already sampling? GOTO B3 BCF _k,2 ;Clear Bit in Mask B3: BTFSS _j,3 ;Bit set? Pulse high GOTO B3Clear BSF _sample,3 ;flag that now sampling INCFSZ _Period + 6 ;Period[3] = Period[3] + 1 GOTO B4 INCF _Period + 7 GOTO B4 B3Clear: BTFSS _sample,3 ;Pulse low - already sampling? GOTO B4 BCF _k,3 ;Clear Bit in Mask B4: BTFSS _j,4 ;Bit set? Pulse high GOTO B4Clear BSF _sample,4 ;flag that now sampling INCFSZ _Period + 8 ;Period[4] = Period[4] + 1 GOTO B5 INCF _Period + 9 GOTO B5 B4Clear: BTFSS _sample,4 ;Pulse low - already sampling? GOTO B5 BCF _k,4 ;Clear Bit in Mask B5: BTFSS _j,5 ;Bit set? Pulse high GOTO B5Clear BSF _sample,5 ;flag that now sampling INCFSZ _Period + 10 ;Period[5] = Period[5] + 1 GOTO B6 INCF _Period + 11 GOTO B6 B5Clear: BTFSS _sample,5 ;Pulse low - already sampling? GOTO B6 BCF _k,5 ;Clear Bit in Mask B6: BTFSS _j,6 ;Bit set? Pulse high GOTO B6Clear BSF _sample,6 ;flag that now sampling INCFSZ _Period + 12 ;Period[6] = Period[6] + 1 GOTO B7 INCF _Period + 13 GOTO B7 B6Clear: BTFSS _sample,6 ;Pulse low - already sampling? GOTO B7 BCF _k,6 ;Clear Bit in Mask B7: BTFSS _j,7 ;Bit set? Pulse high GOTO B7Clear BSF _sample,7 ;flag that now sampling INCFSZ _Period + 14 ;Period[7] = Period[7] + 1 GOTO Next INCF _Period + 15 GOTO Next B7Clear: BTFSS _sample,7 ;Pulse low - already sampling? GOTO Next BCF _k,7 ;Clear Bit in Mask Next: MOVF _k, F ;Is Mask = 0? BTFSC STATUS,Z ;Branch on No Zero RETURN ;Finished all samples DECFSZ _pCount GOTO cycle DECFSZ _pCount + 1 GOTO cycle RETURN ;pCount reached 0 - Timeout ENDASM




Bookmarks