PASM code not working
Hello All,
The following code is intended for recording the CNT of the positive edge of 18 pulses. The first 12 pulses are 39 kHz , the following phase continious 6 pulses are 41 kHz . The purpose is to determine the CNT of the frequency change point. The code starts but PHSA counter never becomes 1 and it is stuck in the loop.
The pulses are there, verified by osciloscope and also the following PASM code counts them:
Alternatively I have written the following code using INA register instead of the CTRA counter and it works fine.
But what is the problem with the first code.
I am also attaching the spin object.
Thank you
O.A.Ardali
The following code is intended for recording the CNT of the positive edge of 18 pulses. The first 12 pulses are 39 kHz , the following phase continious 6 pulses are 41 kHz . The purpose is to determine the CNT of the frequency change point. The code starts but PHSA counter never becomes 1 and it is stuck in the loop.
DAT
ORG 0
'---------------------------------Receive_CTRA--------------------------------------------
'Records cnt of the positive edge of 18 pulses
'------------------------------------------------------------------------------------
Receive_CTRA mov ctra, CTRArx_ ' set up counter, pos edge trigger
mov frqa, #1 ' 1 count/trigger
mov p4, par
add p4, #16 ' initilize p4 --> T[4}
mov idx, last
:repeat add p4, #4 ' increment p4
mov phsa, #0 ' clear phsa - holds accumulated count
:loop mov timeP, cnt ' renew time_
tjz phsa, #:loop ' repeat until pulse received
wrlong timeP, p4 ' write cnt for pulse idx to T[idx+4]
mov phsa, #0
sub idx, #1 WZ ' Z flag is set if valee = 0
if_NZ jmp #:repeat ' repeat until idx = 0
:exit wrlong last, par
mov ctra, #0
cogid cog_rx
cogstop cog_rx ' stop the cog
CTRArx_ long (%01010 << 26 ) | (0 << 9) | (pin)
RXpin long |< pin
last long 18
idx res 1
timeP res 1
cog_rx res 1
The pulses are there, verified by osciloscope and also the following PASM code counts them:
DAT
ORG 0
{---------------------------------CountPulse----------------------------------------
Counts pulses by using CTRA on pin for 1 milisecs and stops the cog
-----------------------------------------------------------------------------------}
Count mov ctra, CTRArx ' set up counter, pos edge trigger
mov frqa, #1 ' 1 count/trigger
mov phsa, #0 ' clear phsa - holds accumulated count
mov wait2, cnt ' Set cnt0
add wait2, dur_
waitcnt wait2, #0 ' wait for 1 milisec
mov value, phsa
mov p2, par
add p2, #20
wrlong value, p2 ' write value to T[5]
mov ctrb, #0
wrlong last, par
cogid cog_
cogstop cog_ ' stop the cog
CTRArx long (%01010 << 26 ) | (0 << 9) | (pin)
dur_ long 80_000
last long 19
p2 res 1
wait2 res 1
value res 1
cog_ res 1
Alternatively I have written the following code using INA register instead of the CTRA counter and it works fine.
But what is the problem with the first code.
DAT
ORG 0
'---------------------------------Receive--------------------------------------------
'Records cnt for the positive edge of 18 pulses
'------------------------------------------------------------------------------------
Receive_INA
mov p3, par
add p3, #16 ' initilize p3 --> T[4]
mov idx, last_
:repeat add p3, #4 ' increment p3
:loop mov time_, cnt ' renew time_
test RXpin, ina WC ' C flag is set if ina is high (1)
if_NC jmp #:loop
wrlong time_, p3 ' write cnt for pulse idx to T[idx+4]
waitpeq null_, RXpin ' Wait for low signal
sub idx, #1 WZ ' Z flag is set if value = 0
if_NZ jmp #:repeat ' repeat until idx = 0
:exit wrlong last_, par
cogid cog_rx
cogstop cog_rx ' stop the cog
RXpin long |< pin
CTRArx long (%01010 << 26 ) | (0 << 9) | (pin)
last_ long 18
null_ long 0
p3 res 1
idx res 1
time_ res 1
cog_rx res 1
I am also attaching the spin object.
Thank you
O.A.Ardali
spin
11K

Comments
When phsa is read as a destination register, its shadow register is used instead which, in your case was set to zero when you initialized phsa. The solution is to mov phsa into another register with a wz, then jump on the zero-flag condition.
-Phil
I suspected tjz statement is the problem but I didn't know the reason.
Thanks again.
O.A.Ardali