; TITLE "Crank + Cam Signal Generator"; LIST p=16C56 ; ERRORLEVEL 0 ; ; ;****************************************************************************** ; ;External Ossc. used = 4.0Mhz. ; ; 0 1 2 3 4 26 27 28 29 30 31 ; _ _ _ _ _ _ _ _ _ _ _ ; Input: | |_| |_| |_| |_| |_............| |_| |_| |_| |_| |_| |_ (50% duty) ; 0 1 2 13 14 15 16 ; _ _ _ _ _ _ _ ; Output1: | |_____| |_____| |_............| |_____| |_____| |_| |_ (fixed pw) ; 0 ; _ ; Output2: ____________________............________________| |_____ (fixed pw, ; every other rev) ; ; Program: sig48.asm ; Revision Date: ; 10-18-97 A. Grippo ; ;****************************************************************************** ; ; ;Define RAM Locations: INDF EQU 0 RTCC EQU 1 PC EQU 2 STATUS EQU 3 FSR EQU 4 PORTA EQU 5 PORTB EQU 6 ; F EQU 1 C EQU 0 DC EQU 1 Z EQU 2 ; ; ;Define Variables TPULSE EQU 8h ;factor determining pulsewidth of ;outputs(=true pw/ 5 for 4MHz) count EQU 09h ;tooth counter tic EQU 0Ah ;counter for pulse time delay ; ; ; ========================================================= ; <-- S T A R T O F E X E C U T I O N H E R E --> ; ========================================================= org 0 LOOKUP addwf PC ;jump to the appropriate retlw ; PortB Tooth ; ----- ----- retlw D'1' ; 0 retlw D'0' ; retlw D'1' ; 1 retlw D'0' ; retlw D'1' ; 2 retlw D'0' ; retlw D'1' ; 3 retlw D'0' ; retlw D'1' ; 4 retlw D'0' ; retlw D'1' ; 5 retlw D'0' ; retlw D'1' ; 6 retlw D'0' ; retlw D'1' ; 7 retlw D'0' ; retlw D'1' ; 8 retlw D'0' ; retlw D'1' ; 9 retlw D'0' ; retlw D'1' ; 10 retlw D'0' ; retlw D'1' ; 11 retlw D'0' ; retlw D'1' ; 12 retlw D'0' ; retlw D'1' ; 13 retlw D'0' ; retlw D'1' ; 14 retlw D'0' ; retlw D'1' ; 15 retlw D'0' ; retlw D'1' ; 16 retlw D'0' ; retlw D'1' ; 17 retlw D'0' ; retlw D'1' ; 18 retlw D'0' ; retlw D'1' ; 19 retlw D'0' ; retlw D'1' ; 20 retlw D'0' ; retlw D'1' ; 21 retlw D'0' ; retlw D'1' ; 22 retlw D'0' ; retlw D'1' ; 23 retlw D'0' ; retlw D'1' ; 24 retlw D'0' ; retlw D'1' ; 25 retlw D'0' ; retlw D'1' ; 26 retlw D'0' ; retlw D'1' ; 27 retlw D'0' ; retlw D'1' ; 28 retlw D'0' ; retlw D'1' ; 29 retlw D'0' ; retlw D'1' ; 30 retlw D'0' ; retlw D'1' ; 31 retlw D'0' ; retlw D'1' ; 32 retlw D'0' ; retlw D'1' ; 33 retlw D'0' ; retlw D'1' ; 34 retlw D'0' ; retlw D'1' ; 35 retlw D'0' ; retlw D'1' ; 36 retlw D'0' ; retlw D'1' ; 37 retlw D'0' ; retlw D'1' ; 38 retlw D'0' ; retlw D'1' ; 39 retlw D'0' ; retlw D'1' ; 40 retlw D'0' ; retlw D'1' ; 41 retlw D'0' ; retlw D'1' ; 42 retlw D'0' ; retlw D'1' ; 43 retlw D'0' ; retlw D'1' ; 44 retlw D'0' ; retlw D'1' ; 45 retlw D'0' ; retlw D'1' ; 46 retlw D'0' ; retlw D'3' ; 47 (cam) retlw D'1' ; 48 (xtra tooth) retlw D'1' ; 49 retlw D'0' ; retlw D'1' ; 50 retlw D'0' ; retlw D'1' ; 51 retlw D'0' ; retlw D'1' ; 52 retlw D'0' ; retlw D'1' ; 53 retlw D'0' ; retlw D'1' ; 54 retlw D'0' ; retlw D'1' ; 55 retlw D'0' ; retlw D'1' ; 56 retlw D'0' ; retlw D'1' ; 57 retlw D'0' ; retlw D'1' ; 58 retlw D'0' ; retlw D'1' ; 59 retlw D'0' ; retlw D'1' ; 60 retlw D'0' ; retlw D'1' ; 61 retlw D'0' ; retlw D'1' ; 62 retlw D'0' ; retlw D'1' ; 63 retlw D'0' ; retlw D'1' ; 64 retlw D'0' ; retlw D'1' ; 65 retlw D'0' ; retlw D'1' ; 66 retlw D'0' ; retlw D'1' ; 67 retlw D'0' ; retlw D'1' ; 68 retlw D'0' ; retlw D'1' ; 69 retlw D'0' ; retlw D'1' ; 70 retlw D'0' ; retlw D'1' ; 71 retlw D'0' ; retlw D'1' ; 72 retlw D'0' ; retlw D'1' ; 73 retlw D'0' ; retlw D'1' ; 74 retlw D'0' ; retlw D'1' ; 75 retlw D'0' ; retlw D'1' ; 76 retlw D'0' ; retlw D'1' ; 77 retlw D'0' ; retlw D'1' ; 78 retlw D'0' ; retlw D'1' ; 79 retlw D'0' ; retlw D'1' ; 80 retlw D'0' ; retlw D'1' ; 81 retlw D'0' ; retlw D'1' ; 82 retlw D'0' ; retlw D'1' ; 83 retlw D'0' ; retlw D'1' ; 84 retlw D'0' ; retlw D'1' ; 85 retlw D'0' ; retlw D'1' ; 86 retlw D'0' ; retlw D'1' ; 87 retlw D'0' ; retlw D'1' ; 88 retlw D'0' ; retlw D'1' ; 89 retlw D'0' ; retlw D'1' ; 90 retlw D'0' ; retlw D'1' ; 91 retlw D'0' ; retlw D'1' ; 92 retlw D'0' ; retlw D'1' ; 93 retlw D'0' ; retlw D'1' ; 94 retlw D'0' ; retlw D'1' ; 95 retlw D'0' ; retlw D'1' ; 96 retlw D'1' ; 97 (xtra tooth) ; 192 table entries ; START ;Disable watchdog timer clrwdt ;Initialize variables ; movlw D'4' movwf TPULSE ;TPULSE = pw (usec) / 5 movlw D'255' movwf count ;count = -1 ; ;Set PORT A pin directions: Pin0 not used(=0), Pin1 = 555 input ; Input=1, Output=0 movlw 0x02 tris PORTA ;Set PORT B pin directions: Pin0 = crank output(=0), ; Pin1 = cam output (=0) movlw 0x00 tris PORTB ;Set all outputs low: clrf PORTB ; ; loop0 btfsc PORTA,1 ;read input pin 1 goto loop0 ;until low ; ; Main loop section. ; Always go back to here each iteration......... ; loop1 btfss PORTA,1 ;read input pin 1 goto loop1 ;until high ; incf count,F ;count++ ; movf count,W ;W=count call LOOKUP ;table value at index count ;is returned in W movwf PORTB ;set Port B iaw W from table pulsedly call delay ;delay to end of o/p pulse ; note: it is assumed delay for pulse always < input pw ; clrf PORTB ;set output pins low ; movlw D'191' subwf count,W ;W=count - 191 btfss STATUS,Z ;if W != 0, goto loop2 ;don't reset movlw D'255' ;reset count movwf count ;count = -1 ; loop2 btfsc PORTA,1 ;read input pin 1 goto loop2 ;until low goto loop1 ; ; arbitrary delay of TPULSE tics, where each tic = 5 instructions ; (goto counts as 2 instructions) delay movf TPULSE,W movwf tic ;tic=TPULSE dly nop nop decfsz tic,F ;tic--, break when 0 goto dly retlw 0 ;return ; ; ; ----------> System reset section <--------------- ; org 03ffh ;reset address goto START ; END