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
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.
İ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ı
*(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 :)