Trouble understanding CTRMODE modes in CTRA and CTRB
MJHanagan
Posts: 189
I am having difficulty interpreting some PASM code from the OBEX object "jm_sircs_rx.spin". In the "mov ctra, NEG_DETECT" instruction it uses a CTRMODE value of %01100 (NEG detector) with no pin value specified. From this I assume that every internal clock tick increments the phsa register by 1. In essence this becomes an alternative CNT register which is user reset by writing a value of 0 to phsa (as is done in the code below).
The "mov ctrb, FREE_RUN" instruction uses a CTRMODE value of %11111 (LOGIC always) with no pin specified. From page 14 in the "AN001 Propeller P8X32A Counters" this seems to also act as a simple resetable CNT counter incrementing the phsb register by 1 with each clock tick.
My question is: how does CTRA differ from CTRB?
The "mov ctrb, FREE_RUN" instruction uses a CTRMODE value of %11111 (LOGIC always) with no pin specified. From page 14 in the "AN001 Propeller P8X32A Counters" this seems to also act as a simple resetable CNT counter incrementing the phsb register by 1 with each clock tick.
My question is: how does CTRA differ from CTRB?
dat
org 0
rxsircs mov ctra, NEG_DETECT ' set ctra for pulse timing
mov frqa, #1
mov ctrb, FREE_RUN ' set ctrb for frame timing
mov frqb, #1
waitok rdlong tmp1, okpntr wz ' wait for zero (FALSE).
if_nz jmp #waitok
waitstart waitpeq irmask, irmask ' wait for high
mov phsa, #0 ' start bit timer
waitpne irmask, irmask ' wait for low
mov phsb, #0 ' start frame timer
waitpeq irmask, irmask ' wait for high
cmp START_BIT, phsa wc ' valid start bit?
if_nc jmp #waitstart ' try again if no
mov irwork, #0
mov bits, #0 ' reset bit count
checkframe cmp MS_044, phsb wc ' check frame timer
if_c jmp #irdone ' abort @44ms
waitbit test irmask, ina wz ' look for new bit
if_nz jmp #checkframe ' check for end if no bit
measurebit mov phsa, #0 ' resstart bit timer
waitpeq irmask, irmask ' wait for high (end of bit)
cmp ONE_BIT, phsa wc ' ir bit --> C
rcr irwork, #1 ' C --> irwork.31
add bits, #1 ' inc bit count
cmp bits, #20 wc ' at max?
if_b jmp #checkframe ' keep scanning if no
irdone mov tmp1, #32
sub tmp1, bits
shr irwork, tmp1 ' right align ir code
report wrlong irwork, codepntr ' write code to hub
wrlong bits, bitspntr ' write bit count to hub
wrlong DONE, okpntr ' alert caller
jmp #waitok
' -------------------------------------------------------------------------------------------------
DONE long true
NEG_DETECT long %01100 << 26 ' ctr neg detector
FREE_RUN long %11111 << 26 ' ctr logic always mode
START_BIT long 0-0 ' counts in 80% of 2.4ms
ONE_BIT long 0-0 ' counts in 80% of 1.2ms
MS_044 long 0-0 ' counts in 44ms
irmask long 0-0 ' pin mask for ir input
okpntr long 0-0 ' pointer to ready flag
codepntr long 0-0 ' pointer to ir code
bitspntr long 0-0 ' pointer to bit count of code
irwork res 1 ' workspace for ir input
bits res 1 ' # bits in input
tmp1 res 1
tmp2 res 1
fit 492

Comments
It seems like in the case of ctra the input pin needs to be specified, but I cannot find where this is done. In my setup the IR input signal pin is 26. Since NEG_DETECT is defined as "long %01100 << 26" the lower bits 0-5 are zeros, therefore no pin specified.
Just had a look at the code, either the NEG_DETECT mode is intended - then the pin setup is missing otherwise pin #0 being high would block ctra - or it's supposed to be the same as ctrb. Not sure about the latter, I'd have to check the protocol first.
Update: My vote goes to missing setup. A NEG_DETECT.byte{0} := p in the init method should take care of that (untested).
I'm using a QuickStart board and don't think I am actively using pin 0 so it might indeed be low so it works. I will try adding the pin value in the init as you suggested and try it.
Thank you for the help.