Smartpin "Quadrature Encoder" mode returns erratic values
ozpropdev
Posts: 2,793
in Propeller 2
Chip
I been experiencing weird behaviour of the smartpins in quad. enc mode.
At first I thought it might be faulty encoders, so I replaced them.
The issue persisted so I have removed them and implemented fake ecoders in another cog.
The issue remained so I did a few tests and found that the issue seems to be related to the period between PINGETZ instructions.
in the included code the fake encoder cycles back and forth at low speed and displays the Z value spaced by its lower bits.
If the WAITX instruction @ main is enabled the following output is returned (Correct).
The results vary on each download.
The test code has been running on a P123-A9 board.
I been experiencing weird behaviour of the smartpins in quad. enc mode.
At first I thought it might be faulty encoders, so I replaced them.
The issue persisted so I have removed them and implemented fake ecoders in another cog.
The issue remained so I did a few tests and found that the issue seems to be related to the period between PINGETZ instructions.
in the included code the fake encoder cycles back and forth at low speed and displays the Z value spaced by its lower bits.
If the WAITX instruction @ main is enabled the following output is returned (Correct).
00001862
0000185A
00001856
0000184E
00001846
00001842
0000183A
00001832
0000182A
00001826
0000181E
00001816
00001812
0000181A
00001822
00001826
0000182E
00001836
0000183A
00001842
0000184A
00001852
00001856
0000185E
00001866
When the WAITX @ main is removed erratic behaviour is observed.
00000000
0000023E
00000242
0000024A
00000252
00000000
0000025E
00000000
0000026E
00000272
0000027A
00000282
00000000
00000276
00000000
00000266
00000262
0000025A
00000252
00000000
00000246
00000000
00000236
00000232
0000022A
The results vary on each download.
The test code has been running on a P123-A9 board.

Comments
I'm looking into it right now.
You mean you checked the code in #1 and it ran 100% ?
Looking at the code, the delay patch seems to be in an unexpected place, (ie the loop has already taken many cycles sending data, why should a few more matter ? ), and it seems the counter itself is ok, just the read sometimes gets 00 by mistake.
The patch is right after a jump, could there be some interaction between pipeline and opcodes like pingetz ?
Is there enough timing margin in the FPGA's ?
OzPropdev: What range of delays is a fix, and does one or more NOP also fix ?
Addit: I also notice that failure seems periodic - it is always NYNYYYY ?
Could the loop time not be N*16 and so a variable phase on COG slot is occurring ?
( that would mean some NOPs could fix, and more NOPs could break again )
I fired up my DE2-115 board just as a point of reference.
Because the DE2 only has 8 snartpins and no smartpin on pin 62(Tx) I replaced the Tx code with a bit bang variant.
Code works fine with/without WAITX delay.
At first I thought this might be a Cyclone 4/5 timing difference.
Running the bit bang variant back on the A9 board and now everything works.
It seems to be a smartpin message issue from the async tx mode that upsets the quad mode smartpin?
The loop delay is likely also not exactly the same, so you could try inserting back dummy pingetz, and see if that
always breaks, no matter where it is inserted ?
I setup another smartpin in async mode but only ever reference it wuth a PINGETZ.
Works fine but does not (erratic quad. enc values), but a combination of the two works fine. ?????
I'm still thinking it's some sort of smartpin messaging issue.
One thing I did discover is that if I assign my dummy async Tx smartpin to a non existant smartpin the issue goes away.
So the code combination #2 now works on DE2-115.
Starts to look less like some marginal FPGA issue....
Maybe that just becomes a NOP ? - Chip will know how different a no-pin-there opcode is.
If you do 2 consecutive 'read encoder count' pingetz's, do they both have a failure pattern, or only the first one ?
I modified your test code slightly to display the encoder value on the A9's green leds.
By adding a async smartpin into the mix breaks your code too.
Particulary on rollover.
Edit: Same outcomes are observed using the three variants mentioned above.
As long as there is a Async PINGETZ before the ENC PINGETZ it works?
Ozpropdev, I got it to fail using your last program posted.
I see the problem. On the first clock of the GETPINZ instruction, it's reading the smart pin that was the object of the prior PINSETM/PINSETX/PINSETY/GETPINZ instruction. If that smart pin happens to be outputting a message header, the cog starts reeling in a message, starting on the next clock, from what is then the correct smart pin. So, it's sometimes using a wrong message header with the right pin, causing registration and sizing errors. Sorry about this. I should have thought this through better.
I'm fixing it now.
I'm sure glad you guys find things like this.
Jmg, you have the scariest imagination - a pipeline bug! There could be such things lurking, but, hopefully, we've weeded those out, already. Good guess, anyway.
Good if you have nailed it.
I'm starting up an A9 compile now.
It's nice when it's a quick fix.
The fix was maybe 10 minutes, but the compile takes 2 hours.
https://drive.google.com/file/d/0B9NbgkdrupkHby0xV0tsU3ZJZXM/view?usp=sharing
Any summary of what else changed ?
Dual-port LUT ? Better capture-mode controls ?
Dual-port LUT and phase setting in NCO mode. I'll document these things as soon as they are done and I'll make a new release.
Thanks Chip.
V8a running very nicely.
Cheers
Brian