dsPic33f Quadratur Enkoder ccs index pals sıfırlamama hatası

Başlatan mehmetem, 03 Ağustos 2011, 14:17:35

mehmetem

Herkese merhaba
dsPic33fj32mc204 ile quadrature encoder okumaya çalışıyorum

main() fonksiyonu içinde
setup_qei(QEI_MODE_X4|QEI_RESET_WHEN_IDX_PULSE,QEI_FILTER_DIV_1|QEI_IDX_WHEN_A0_B0);

timer2 interrupt içinde
count=qei_get_count();

kullandım. fiziksel olarak indeks palsi gelmesine rağmen sayıcı yukarı aşağı sayabiliyor ama sıfırlama yapmıyor. İndex pals yerine max count için set edilince sıfırlama yapıyor. Ancak benim uygulamam için index pals önemli.

Bir tavsiyesi olan var mı?

ayrıca şunu da denedim ama bir işe yaramadı;

.h dosya içinde
#define RPINR14 0x069C //QEI remap reg
#define QEI1CON 0x01E0 //qei control register
#define DFLT1CON 0x01E2 //qei dflt control register

main() içinde:
*(RPINR14)=21; //qeb remap (my qeb pin)
*(RPINR14+1)=20; //qea remap (my qea pin)
*(RPINR14+3)=19; //ind remap (my index pin)

*(QEI1CON)=((*(QEI1CON)&0xFB)|0x04); // index pulse reset enable
*(QEI1CON+1)=((*(QEI1CON+1)&0xF8)|0x06); //qei 4x mode, index pulse reset
*(DFLT1CON+1)=((*(DFLT1CON+1)&0xFE)|0x01); // count error detect disabled


iyildirim

Adım adım gidersek;
Kullandığınız işlemcide PPS denen özellik var.
Index pini ile ilgili input mapping işleminin yapıldığından emin olun. Mümkünse kodunuzun tanımlamaların yapıldığı kısmını tam olarak paylaşın.
QEA, QEB, INDEX pinlerinin bağlı olduğu pinleri de yazın.

Ayrıca şunu da denedim dediğiniz kısımda REGISTERLERI neden pointer gibi kullandığınızı da anlamadım. Bir register atama yapmak istiyorsanız direkt yapın.
RPINR14 = 0X00; vs gibi.

RPINR14 A ve B kanallarının input mappinglerini tutan register. Bunu h dosya dediğiniz, işlemcinin header dosyası ise bununla oynamanız gerekli değil. İçeriğinide değiştirmemelisiniz. Aynı şekilde QEI1CON ve diğer registerler de zaten tanımlı.

Sadece RPINR14 ve 15 registerlerinin içeriğini  A,B ve index kanalları hangi pine bağlı ise o şekilde update etmeniz yeterli.  14 A, B 15 de INDX için.

CCS'nin hazır fonksiyonlarını bilmem ama sanırım diğer QEI setup kısımları doğrudur.

mehmetem

İlginiz için çok teşekkür ederim, Yine adım adım gidelim;
PPS'i bilmiyorum, hemen bakıp ne olduğunu anlamaya çalışacağım.
Index pini için yaptığım mapping ile A ve B pinleri için yaptığım mapping aynı;  a ve b kanalları çalışıyor, index çalışmıyor tanımlama aşağıda, diğer tanımlamalar en altta:

main.h dosya içinde
#define RPINR14 0x069C //QEI remap reg    //burada RPINR14 adresini tanımlıyorum
#define QEI1CON 0x01E0 //qei control register
#define DFLT1CON 0x01E2 //qei dflt control register

main() içinde:
*(RPINR14)=21; //qeb remap (my qeb pin) //b pini rp21
*(RPINR14+1)=20; //qea remap (my qea pin) //a pini rp20
*(RPINR14+3)=19; //ind remap (my index pin) //index pini rp19

QEA rp20 -rc4, Qeb rp21 -rc5, index rp19 -rc3,

RPINR14 adında bir register tanımlı değil, yukarıda ki gibi sfr içinde ki adresleri tanımladım. Başka yolu var mı bilmiyorum,
Aynı şekilde QEI1CON da tanımlı değil.

Benim pointerlarla yaptığım işlem qei_setup ile aynı. bir bug varmıdır anlamında el ile yapıp denedim sonuçta index palsini alamadım.

Diğer tanımlamalar:

#include <33FJ32MC204.h>
//#include <PPS.h>               //*************pps.h dosyası yokmuş, bu satırı onun için kaldırdım****************
//#device *=16                   //16 bit pointer kullanımı için

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOWRTB                   //Boot block not write protected
#FUSES NOBSS                    //No boot segment
#FUSES PROTECTS                 //Standard Code protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES PR                       //Primary Oscillator
#FUSES NOCKSFSM                 //Clock Switching is disabled, fail Safe clock monitor is disabled
#FUSES NOOSCIO                  //OSC2 is general purpose output
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES WINDIS                   //Watch Dog Timer in non-Window mode
#FUSES WPRES128                 //Watch Dog Timer PreScalar 1:128
#FUSES WPOSTS16                 //Watch Dog Timer PostScalar 1:32768
#FUSES PUT128                   //Power On Reset Timer value 128ms
#FUSES NOALTI2C                 //I2C mapped to alternate pins
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES IOL1WAY                  //Allows only one reconfiguration of peripheral pins
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOCOE                    //Device will reset into operational mode
#FUSES NOJTAG                   //JTAG disabled
#FUSES ICS0                     //ICD communication channel 0
#FUSES NOPWMPIN                 //PWM outputs drive active state upon Reset
#FUSES HPOL_HIGH                //High-Side Transistors Polarity is Active-High (PWM 1,3,5 and 7)
   //PWM module high side output pins have active high output polarity
#FUSES LPOL_HIGH                //Low-Side Transistors Polarity is Active-High (PWM 0,2,4 and 6)
   //PWM module low side output pins have active high output polar

#use delay(clock=40000000)
#define AN0   PIN_A1            //Analog 0
#define AN1   PIN_A0            //Analog 1
#define AN2   PIN_B0            //Analog 2
#define AN3   PIN_B1            //Analog 3
#define AN4   PIN_B2            //Analog 4
#define AN5   PIN_B3            //Analog 5

#define Q1    PIN_A4            //dijital out
#define Q2    PIN_A7            //dijital out
#define Q3    PIN_A9            //dijital out
#define Q4    PIN_A10            //dijital out
#define Q5    PIN_C0            //dijital out
#define Q6    PIN_C1            //dijital out

#define INT_0  PIN_B7         //external interrupt

#define 18FTx  PIN_B4         //serial input
#define 18FRx  PIN_C2         //serial output

#define 33FRx  PIN_C8         //serial input
#define 33FTx  PIN_C9         //serial output

//SDA ve SCL 2402.c içinde tanımlı
//#define SDA    PIN_B9         //i2c SDA
//#define SCL    PIN_B8         //i2c SCL

//#define QEI    PIN_C3         //Quadrature Encoder Index                      //bu şekilde tanılamayı kabul etmedi
//#define INDX1    PIN_C3         //Quadrature Encoder Index
//#define QEA1    PIN_C4         //Quadrature Encoder Phase A
//#define QEB1    PIN_C5         //Quadrature Encoder Phase B

//   #pin_select QEA    PIN_20         //Quadrature Encoder Phase A            //bu şekilde tanılamayı kabul etmedi
//   #pin_select QEB    PIN_21         //Quadrature Encoder Phase B
//   #pin_select INDX    PIN_19         //Quadrature Encoder Phase A

#define RPINR2   0x0683         //EXT Int 2 remap reg
#define RPINR14   0x069C         //QEI remap reg
#define QEI1CON   0x01E0         //qei control register
#define DFLT1CON   0x01E2         //qei dflt control register

#define RPINR20   0x06A8         //spi in remap reg
#define RPOR4     0x06C8         //spi out remap reg

//#PIN_SELECT QEI    PIN_C3         //Quadrature Encoder Index

#define PWM1H3    PIN_B10          //PWM
#define PWM1L3    PIN_B11          //PWM
#define PWM1H2    PIN_B12          //PWM
#define PWM1L2    PIN_B13          //PWM
#define PWM1H1    PIN_B14          //PWM
#define PWM1L1    PIN_B15          //PWM
#define PWM2H1    PIN_C6          //PWM
#define PWM2L1    PIN_C7          //PWM


int16 count=0;
int8* countPtr=&(count);
unsigned int8 countL=0;
unsigned int8 countH=0;

int buffer[7]="012345";    //buffer'a 30h ..35h atandı

mehmetem

*(RPINR14)=21; //qeb remap (my qeb pin) //b pini rp21
*(RPINR14+1)=20; //qea remap (my qea pin) //a pini rp20
*(RPINR14+2)=19; //ind remap (my index pin) //index pini rp19

ile  problemi  çözdüm :)