CON ' tpin = 5 ' pin # to test. %AAAA_BBBB_FFF_PPPPPPPPPPPPP_TT_MMMMM_0 ' tcnt = tpin+1 ' pin # to accumulate pulses for verification marker = 6 ' pin # to show timing MMMMM = %00110 ' "NCO frequency" TT = %01 ' Required - Only this works when using an overide mode PPPPPPPPPPPPP = 0 ' default FFF = %000 ' no filtering BBBB = %0000 ' B-input unused AAAA = %0000 ' A-input unused 'Serial functions for data logging (borrowed from Dave H's prefix.spin2) rx_pin = 63 tx_pin = 62 clock_freq = 40_000_000 baud_rate = 115_200 lr = $1f6 DAT ORGH 0 'what does this do? '******************************************************************************* ' COG Variables '******************************************************************************* ORG 'ticks hubset #$0f ' Change to 5 MHz sysclock 'ticks hubset #$1f ' Change to 10 MHz sysclock 'ticks hubset #0 ' Change to 20 MHz sysclock ticks hubset #$7f ' Change to 40 MHz sysclock 'ticks hubset #$ff ' Change to 80 MHz sysclock ticke jmp #_main chr long 0 j long 0 i long 20 state long 1 tpin long 4 spin long 5 sec long clock_freq '******************************************************************************* ' COG Code '******************************************************************************* getch mov char, bitcycles shr char, #1 mov temp1, #10 mov parm, #0 'getch0 jp #rx_pin, #getch0 getch0 testp #rx_pin wz if_z jmp #getch0 getct temp2 addct1 temp2, char waitct1 getch1 mov char, inb and char, inbit ror parm, #1 or char, parm addct1 temp2, bitcycles waitct1 djnz temp1, #getch1 ror parm, #31 - 8 and parm, #255 ret inbit long 1 << (rx_pin & 31) bitcycles long clock_freq / baud_rate putch or char, #$100 shl char, #1 mov temp1, #10 getct temp2 putch1 shr char, #1 wc drvc #tx_pin addct1 temp2, bitcycles waitct1 djnz temp1, #putch1 ret parm long 0 char long 0 temp1 long 0 temp2 long 0 '******************************************************************************* ' HUB Code '******************************************************************************* ORGH $400 ALIGNL '=============================================== 'CR/LF emit putnl mov char, #13 call #putch mov char, #10 jmp #putch '=============================================== 'SPACE emit putsp mov char, #$20 call #putch mov char, #$20 jmp #putch '=============================================== 'String emit puts rdbyte char, parm wz if_z ret 'null termination call #putch 'emit character ijnz parm, #puts 'increment pointer (assumes non-zero address) '=============================================== 'Integer (long) to ascii hex and emit itoa getnib char, parm, #7 'most significant nibble of eight (zero extended) call #.itoa1 getnib char, parm, #6 call #.itoa1 getnib char, parm, #5 call #.itoa1 getnib char, parm, #4 call #.itoa1 getnib char, parm, #3 call #.itoa1 getnib char, parm, #2 call #.itoa1 getnib char, parm, #1 call #.itoa1 getnib char, parm, #0 .itoa1 or char, #$30 '0-9 cmp char, #$39 wcz if_a add char, #$27 'a-f jmp #putch '=============================================== 'State of test pin to ascii hex and emit ' Only works for lowest 16 pins tpintoa shr char, #tpin and char, #1 or char, #$30 call #putch mov char, #$20 jmp #putch '=============================================== 'Draw timing diagram ' param = bit pattern, bigendian right justified ' i = number of bits in pattern (max 32 bits) wave mov j, #5 .wave1 mov char, #" " call #putch djnz j, #.wave1 mov temp1, #32 sub temp1, i wcz if_gt shl parm, temp1 jmp #.wave3 .wave2 shl parm, #1 wc testb parm, #31 wz if_c_and_nz mov chr, #"\" if_nc_and_z mov chr, #"/" mov char, chr call #putch .wave3 testb parm, #31 wz if_z mov chr, #"-" if_nz mov chr, #"_" mov j, #9 .wave4 mov char, chr call #putch djnz j, #.wave4 djnz i, #.wave2 ret '******************************************************************************* ' Program Code (HubExec) '******************************************************************************* _main mov tpin, #9 waitx sec mov parm, ##message call #puts .main1 call #putsp mov char, tpin add char, #$30 call #putch call #putsp mov spin, tpin add spin, #1 wrpin ##%0111_0000_000_0000000000000_00_00000_0, spin ' A=(pin-1) M=normal input wxpin #0, spin wypin #0, spin mov state, #0 ' Clear pin state sampling bits mov j, #4 ' Extra delay for second sample of pin state dirl tpin ' Disable Smartpin while setting up (not really!) wrpin ##%0100_0000_011_0000000000000_01_01111_0, tpin ' A=OUT B=pin F=A^B M=Count highs wxpin #0, tpin wypin #0, tpin testp spin wc waitx #4 ' Input to output pin transition, counting circuit already active dirh tpin ' Release Z to accumulate rqpin parm, tpin ' check Z at reset waitx j testp spin wz rczl state ' capture two pin state samples call #itoa call #putsp waitx sec rqpin parm, tpin ' check Z hasn't changed after 1 second call #itoa call #putsp outh tpin testp spin wc rqpin parm, tpin ' check Z at OUT rise waitx j testp spin wz rczl state ' capture two pin state samples call #itoa call #putsp rqpin parm, tpin ' check Z a little later call #itoa call #putsp outl tpin testp spin wc rqpin parm, tpin ' check Z at OUT fall waitx j testp spin wz rczl state ' capture two pin state samples call #itoa call #putsp rqpin parm, tpin ' check Z a little later call #itoa call #putnl mov parm, state ' doodle of pin sampled waveform mov i, #6 call #wave mov parm, state call #itoa call #putnl djnf tpin, #.main1 ' DJNZ doesn't execute for zero case call #putnl jmp #$ message byte 13,10,"SmartPin mode = %01111, Count highs",13,10,"pin# reset pause high......later low.......later",13,10,0