View previous topic :: View next topic |
Author |
Message |
gokulrred
Joined: 22 Nov 2011 Posts: 32 Location: puducherry
|
help needed to debug Quadrature Encoder coding ( very Basic) |
Posted: Mon Feb 06, 2012 12:14 am |
|
|
hi.
I am using pic 18f4431.
When qei is used with older versions it was working fine.
Now updated to the latest version.
This is my code:
Code: |
#include <18F4331.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#fuses SSP_RD
#use delay(clock=20000000)
#byte MCHH=0Xf65 //SET THE MAX COUNT HIGH
#byte MCLL=0Xf64 //SET THE MAX COUNT LOW
#bit up = 0xFB6.5 //UP AND DOWN CALCULATION
long value;
int b;
#int_IC3DR
void IC3DR_isr(void)
{
MCHH=0X03;MCLL=0XE8;
value = qei_get_count(0);
output_c(value);
}
#int_IC2QEI
void IC2QEI_isr(void)
{
MCHH=0X03;
MCLL=0XE8;
value = qei_get_count(0);
output_b(value);
}
void main()
{
MCHH=0X03; MCLL=0XE8;
set_tris_b(0x00);
set_tris_c(0x00);
enable_interrupts(GLOBAL);
enable_interrupts(INT_IC3DR);
enable_interrupts(INT_IC2QEI);
enable_interrupts(GLOBAL);
setup_qei(QEI_MODE_X2_RESET_ON_MATCH | QEI_FILTER_DISABLED);
qei_set_count(0);
while(1);
}
|
My objective is whenever there is change in rotor position in motor I want to display the count of position counter for every count.
When there is a change in direction the count gets displayed in C-PORT due to direction change interrupt...
But for every count the position counter value is NOT GETTING DISPLAYED in B-PORT due to Position counter interrupt.
I wanted to reset the counter for every 1000 pulses.
Correct the code and help me if I am wrong. |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9228 Location: Greensville,Ontario
|
|
Posted: Mon Feb 06, 2012 6:22 am |
|
|
If you mean you updated the compiler and your original program no longer works correctly, then there is a bug in the newer compiler.
Simply compare the listings of the program the older version and the new one. Since the code is short, it should only take a few minutes to see the difference.
You don't say what version of the compiler but report the 'bug' to CCS and include versions as well as your program (so they can test as well).
If you mean this program is the 'updated' one, but same compiler then you've changed something which we don't know as you haven't shown us your old working program. Since I don't have this PIC (I use external QEI) I can't further comment on the code you've shown or the hardware that I can't see. |
|
|
gokulrred
Joined: 22 Nov 2011 Posts: 32 Location: puducherry
|
|
Posted: Mon Feb 06, 2012 10:52 pm |
|
|
EUREKA..... EUREKA.....
found the theory behind it......
IC3DR:
this is the interrupt which gets generated whenever there is a change in direction of rotation of motor.
IC2QEI:
this interrupt gets generated in one of the following cases:
1. when position counter gets reset due to index pulse.
2. when we set the MAXCNT and if it is reached then this interrupt gets generated.
i think in former versions there was a bug and it might be corrected in this updated version....... |
|
|
gokulrred
Joined: 22 Nov 2011 Posts: 32 Location: puducherry
|
|
Posted: Mon Feb 06, 2012 10:55 pm |
|
|
Code: | #include <18F4431.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#byte MCHH=0Xf65 //SET THE MAX COUNT HIGH
#byte MCLL=0Xf64 //SET THE MAX COUNT LOW
#bit up = 0xFB6.5 //UP AND DOWN CALCULATION
long new_count, old_count, value,value1;
int b;
#int_IC3DR
void IC3DR_isr(void)
{
value= qei_get_count();
output_c(value);
}
#int_IC2QEI
void IC2QEI_isr(void)
{
value1=value1+1;
output_b(value1);
}
void main()
{
enable_interrupts(INT_IC3DR);
enable_interrupts(INT_IC2QEI);
value1=0;
enable_interrupts(GLOBAL);
setup_qei(QEI_MODE_X2_RESET_ON_MATCH | QEI_FILTER_DISABLED);
MCHH=0X00; MCLL=0X20;
while(TRUE)
{
new_count= qei_get_count();
output_d(new_count);
}
|
check out this code......
whenever direction changes port C displays the current count value.
i've set the max count = 20(hex).
whenever the position counter crosses 20 and reset to zero the port B will increment count and displays it..... |
|
|
|