Hi,
See this thread.
http://www.picbasic.co.uk/forum/showthread.php?t=1552
Read all the posts first.
Best regards,
Luciano
Hi,
See this thread.
http://www.picbasic.co.uk/forum/showthread.php?t=1552
Read all the posts first.
Best regards,
Luciano
I was so wonder by counter result is deferent. When I turn the encoder slower I get more count and when I turn the encoder faster I get less count. Count refers to variable cnt. Can someone explain?
------code--------------
old var word
new var word
dir var byte
cnt var word ' pulse/rotation
Encoder: ' Routine to read rotary encoder
old = PortB & %00000011 ' Read PortB.0 and PortB.1
pause 2 ' Add some time between reads
new = PortB & %00000011 ' Read PortB.0 and PortB.1
if old = new then goto Encoder ' If old and new equal, read again
old = old & %00000001 ' Only need PortB.0
new = new >> 1 ' Only need PortB.1
dir = old ^ new ' Dir equals PortB.0 XOR PortB.1
If dir = 1 then ' If Dir = 1 then...
cnt = cnt + 1 ' ...Count up
else ' Otherwise
cnt = cnt - 1 ' ...Count down
endif ' End If statement
Lcdout $fe, 1 ' Clear LCD screen
Lcdout #cnt ' Display Hello
Lcdout $fe,$C0, 1 ' Clear LCD screen
Lcdout #dir
pause 10
goto encoder ' Do it forever (I hope)
End
Hi there,
When you are turning the rotary encoder slower you get good results:
Reason : Your loop has enough time to "PAUSE" or "LCDOUT" and does not miss pulse.
When you are turning the encoder faster:
It is missing pulses while you are doing other tasks. It is always reliable to use an asm interrupt. No other way out perhaps.
Regards
Sougata
Originally Posted by sougata
Can anybody tell me how to use ASM interupt. What are the advantages? TQ
Hi,
I do not have a 16F877A lying around still I would try to one. I basically design with PIC18F452. The memory bank is different than 16F877A. At least I will try to simulate it.
Regards
Sougata
I think you can just post the code because I just wanna some idea....TQ
You need to UP your sample rate or use interrupts (on change) to prevent aliasing.
If you MUST display the current values on an LCD, I believe you'll need to use interrupts as others have said.
I'm currently working with an encoder with 50 slots, rotating at 1rps (200 positions per second in grey code) and need to sample at <1mS to ensure no errors. This is because there are no absolute guarantees that each of the 4 phases (codes) are equal in length, due to quality control issues with soldering and placement of the LEDs and Photodiodes. Thus, although technically you expect 200 codes per second in this scenario, "normal" oversampling rules dictate 2x that sampling rate, and the error factor that I'm encountering with component placement suggests 5x instead. If you cut your sampling time back, or miss one of these, it can result in an incorrect count.
Thus you're pretty much bound to use interrupts: either on change, or on timer to sample (change is more efficient for obvious reasons).
-------------Picster-----------------------
Bookmarks