Sorry, I'm still not clear about using interupt. Please give me more details. TQ
Sorry, I'm still not clear about using interupt. Please give me more details. TQ
Hi,
What is the maximum expected rotation per second. And with your current setup what are you exactly experiencing.
Regards
Sougata
Wishing a speedy recovery of our forum member Steve who is hurt in a car accident.
maximum rev / sec is 20 rps. I'm currently running a line tracer robot. I wanna know how far the robot can go. TQ
Hi,
I understand that you are new to using interrupts but everybody has a first time so go ahead. This forum will always be beside you. Here http://www.picbasic.co.uk/forum/show...ant+Interrupts you will find more information. To learn more about how to setup the interrupts, read the datasheet carefully. Enable global interrupt and portb.0 interrupts (your encoder should be connected here), also set the Interrupt edge as per your encoder. Now when you are in the ISR just increment the counter variable. You should check overflow of your variable or use a comparison to increment a pulse/meter (another variable). It is sure you will find problems but do write some code and test.
Good Luck
Sougata
I try using this code. But only get forward and backward only. The value of pulse is totaly depend on rotation per second. How I need to maintain pulse / rotation regardless how fast I rotate the encoder. So the distance are varies depend on speed, although the distance is same. Please help
DEFINE LOADER_USED 1
' Define LCD pins
Define LCD_DREG PORTD
Define LCD_DBIT 4
Define LCD_RSREG PORTE
Define LCD_RSBIT 0
Define LCD_EREG PORTE
Define LCD_EBIT 1
define PULSIN_MAX 200
ADCON1 = 4 ' Set PortA 0, 1, 3 to A/D inputs
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,
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
Bookmarks