Need Help ASM problem with Quadrature Encoder with speed
Hi Guys,
·I need some help with my code. I add speed code into Jeff's Quadrature Encoder v1.0 . what I want is getting speed of encoder (encoder count/ms). I only need·to use it on one encoder. I add few line of assembly , so I can start encoder as· Encoder.Start(19, 1, 1, @Pos)
the speed is write to Pos[noparse][[/noparse]2].
my code just accumulate CNT difference between each sample loop,·then compare with delay 1 ms CNT( I should use 80_000, but from testig 76_000 give me result close to actual speed.·I use 80Mhz system clock )
the result of speed output from my code about 95% is right, but get 1 count difference from time to time (following·are results of reading speed 20)
I am new to embedded controller and assembly. I just can't figure out where is the problem.· Please help !!
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 19
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 21
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 21
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 21
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 19
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 21
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 21
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 21
Speed: 21
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 21
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 21
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 19
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
·I need some help with my code. I add speed code into Jeff's Quadrature Encoder v1.0 . what I want is getting speed of encoder (encoder count/ms). I only need·to use it on one encoder. I add few line of assembly , so I can start encoder as· Encoder.Start(19, 1, 1, @Pos)
the speed is write to Pos[noparse][[/noparse]2].
my code just accumulate CNT difference between each sample loop,·then compare with delay 1 ms CNT( I should use 80_000, but from testig 76_000 give me result close to actual speed.·I use 80Mhz system clock )
the result of speed output from my code about 95% is right, but get 1 count difference from time to time (following·are results of reading speed 20)
I am new to embedded controller and assembly. I just can't figure out where is the problem.· Please help !!

Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 19
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 21
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 21
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 21
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 19
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 21
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 21
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 21
Speed: 21
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 21
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 21
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
Speed: 20
Speed: 19
Speed: 20
Speed: 19
Speed: 20
Speed: 19
Speed: 20
Speed: 20
Speed: 20
(VAR
byte Cog 'Cog (ID+1) that is running Update
byte TotDelta 'Number of encoders needing deta value support.
long Pos 'Address of position buffer
PUB Start(StartPin, NumEnc, NumDelta, PosAddr): Pass
''Record configuration, clear all encoder positions and launch a continuous encoder-reading cog.
''PARAMETERS: StartPin = (0..63) 1st pin of encoder 1. 2nd pin of encoder 1 is StartPin+1.
'' Additional pins for other encoders are contiguous starting with StartPin+2 but MUST NOT cross port boundry (31).
'' NumEnc = Number of encoders (1..16) to monitor.
'' NumDelta = Number of encoders (0..16) needing delta value support (can be less than NumEnc).
'' PosAddr = Address of a buffer of longs where each encoder's position (and deta position, if any) is to be stored.
''RETURNS: True if successful, False otherwise.
Pin := StartPin
TotEnc := NumEnc
TotDelta := NumDelta
Pos := PosAddr
Stop
longfill(Pos, 0, TotEnc+TotDelta)
Pass := (Cog := cognew(@Update, Pos) + 1) > 0
PUB Stop
''Stop the encoder-reading cog, if there is one.
if Cog > 0
cogstop(Cog-1)
PUB ReadDelta(EncID): DeltaPos
''Read delta position (relative position value since last time read) of EncID.
DeltaPos := 0 + -(EncID < TotDelta) * -long[noparse][[/noparse]Pos][noparse][[/noparse]TotEnc+EncID] + (long[noparse][[/noparse]Pos][noparse][[/noparse]TotEnc+EncID] := long[noparse][[/noparse]Pos][noparse][[/noparse]EncID])
'************************************
'* Encoder Reading Assembly Routine *
'************************************
DAT
'Read all encoders and update encoder positions in main memory.
'See "Theory of Operation," below, for operational explanation.
'Cycle Calculation Equation:
' Terms: SU = :Sample to :Update. UTI = :UpdatePos through :IPos. MMW = Main Memory Write.
' AMMN = After MMW to :Next. NU = :Next to :UpdatePos. SH = Resync to Hub. NS = :Next to :Sample.
' Equation: SU + UTI + MMW + (AMMN + NU + UTI + SH + MMW) * (TotEnc-1) + AMMN + NS
' = 92 + 16 + 8 + ( 16 + 4 + 16 + 6 + 8 ) * (TotEnc-1) + 16 + 12
' = 144 + 50*(TotEnc-1)
org 0
Update test Pin, #$20 wc 'Test for upper or lower port
muxc :PinSrc, #%1 'Adjust :PinSrc instruction for proper port
mov IPosAddr, #IntPos 'Clear all internal encoder position values
movd :IClear, IPosAddr ' set starting internal pointer
mov Idx, TotEnc ' for all encoders...
:IClear mov 0, #0 ' clear internal memory
add IPosAddr, #1 ' increment pointer
movd :IClear, IPosAddr
djnz Idx, #:IClear ' loop for each encoder
mov St2, ina 'Take first sample of encoder pins
shr St2, Pin
:Sample mov IPosAddr, #IntPos 'Reset encoder position buffer addresses
movd :IPos+0, IPosAddr
movd :IPos+1, IPosAddr
mov MPosAddr, PAR
Mov MSpeedAddr,MPosAddr
Add MSpeedAddr,#8
mov St1, St2 'Calc 2-bit signed offsets (St1 = B1:A1)
mov T1, St2 ' T1 = B1:A1
shl T1, #1 ' T1 = A1:x
:PinSrc mov St2, inb ' Sample encoders (St2 = B2:A2 left shifted by first encoder offset)
shr St2, Pin ' Adj for first encoder (St2 = B2:A2)
xor St1, St2 ' St1 = B1^B2:A1^A2
xor T1, St2 ' T1 = A1^B2:x
and T1, BMask ' T1 = A1^B2:0
or T1, AMask ' T1 = A1^B2:1
mov T2, St1 ' T2 = B1^B2:A1^A2
and T2, AMask ' T2 = 0:A1^A2
and St1, BMask ' St1 = B1^B2:0
shr St1, #1 ' St1 = 0:B1^B2
xor T2, St1 ' T2 = 0:A1^A2^B1^B2
mov St1, T2 ' St1 = 0:A1^B2^B1^A2
shl St1, #1 ' St1 = A1^B2^B1^A2:0
or St1, T2 ' St1 = A1^B2^B1^A2:A1^B2^B1^A2
and St1, T1 ' St1 = A1^B2^B1^A2&A1^B2:A1^B2^B1^A2
mov Idx, TotEnc 'For all encoders...
:UpdatePos ror St1, #2 'Rotate current bit pair into 31:30
mov Diff, St1 'Convert 2-bit signed to 32-bit signed Diff
sar Diff, #30
:IPos add 0, Diff 'Add to encoder position value
wrlong 0, MPosAddr 'Write new position to main memory
add IPosAddr, #1 'Increment encoder position addresses
movd :IPos+0, IPosAddr
movd :IPos+1, IPosAddr
add MPosAddr, #4
:Next djnz Idx, #:UpdatePos ' my code from next line -------------------------------
mov after, cnt ' load curent CNT into after
sub after, before ' calculate CNT difference between sample
mov before , cnt ' load CNT for next calculate
add time,after ' add CNT difference to
Cmp Delay, time Wc ' compare with Delay to
if_NC jmp #:Sample ' if time not reach delay do another sample
Mov Restlt,IntPos ' load current position counter to Result
Sub Restlt, PreSped ' calculate position counter different between delay
wrlong Restlt, MSpeedAddr ' Write Result to hub address
Mov time, #0 ' rest time back to 0
Mov PreSped,IntPos ' load current position counter for next calculate
jmp #:Sample 'Loop forever
'Define Encoder Reading Cog's constants/variables
AMask long $55555555 'A bit mask
BMask long $AAAAAAAA 'B bit mask
MSB long $80000000 'MSB mask for current bit pair
Delay long 76_000
Pin long 0 'First pin connected to first encoder
TotEnc long 0 'Total number of encoders
before res 1 '
after res 1
PreSped res 1
Restlt res 1
time res 1
Idx res 1 'Encoder index
St1 res 1 'Previous state
St2 res 1 'Current state
T1 res 1 'Temp 1
T2 res 1 'Temp 2
Diff res 1 'Difference, ie: -1, 0 or +1
IPosAddr res 1 'Address of current encoder position counter (Internal Memory)
MPosAddr res 1 'Address of current encoder position counter (Main Memory)
MSpeedAddr res 1 'Address of current encoder position counter(Speed) /ms (Main Memory)
IntPos res 16 'Internal encoder position counter buffer)

Comments
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Nyamekye,
John Abshier
Hi John, I attached encoder onto a stepper with motion controller and run tesing at 20000 microstep per second(encoder and stepper are both 2000 per revolution)
Is that something with timing issue( delay time or accumulate time)? or somthing else?
Post Edited (Julian800) : 7/19/2010 11:20:39 PM GMT
>I should use 80_000, but from testig 76_000 give me result close to actual speed. I use 80Mhz system clock. Do you know why you have to use 76000? That is 5% from 80000.
Two points that may ring a bell: The reading is never over 20 and the 19s do not appear in a periodic manner.
John Abshier
Of course the resolution of your measurement is actually the time it takes to complete the loop but this is not very long really, only 40 instructions or so. The jitter you see it not that surprising, if you trigger the start of your counting with a pulse from the encoder then this will probably stop. Why does it happen? If your pulses are short and 1ms only just encloses 20 of the pulses then the 1ms period only has to occur just after a pulse to get a reading of 19. It also explains why you never see 21.
Graham
I checked the encoder signal on scope meter and that is 20,000 hz .
For using 76_000, I am not too clear with how to calculate time of assembly code. But I think the reason is some code is not count into time accumulation. Such as Mov CNT to register and calculate position counter difference between delay. That is why I am asking for help for your guys. Maybe someone with more experience with assembly can give me some suggestion. thanks John for your help. your suggestion let me thing more futher into my problem.
Hi Graham,
I also thought about the problem is jitter but that is not reading like 19 and following by a 21. I also see 21 in my speed reading in my post(but only once or twice in 100 ).
I think there is some thing with timing of my code, but I just can't fighure it out.
Each assembly instruction takes four clock cycles apart from writes and reads to hub ram which take a bit longer. You can work out from that your expected resolution.
Graham