Kütüphanelerde hatalar olabiliyor. Bu başlık altında denk geldiklerimizi paylaşalım.
Az önce yakaladığım, XC16'nın (v1.21) Quadrature Encoder Interface (QEI) kütüphanesi ile ilgili. Hatalı fonksiyon
ConfigIntQEI ise şu şekilde belgelendirilmiş:
Alıntı Yap3.2 ConfigIntQEI
Function Prototype
void ConfigIntQEI(unsigned int config);
Include
qei.h
Description
This function Configure the QEI Interrupt.
Arguments
config - QEI interrupt priority and enable/disable information as defined below.
QEI Interrupt Enable/Disable
QEI_INT_ENABLE
QEI_INT_DISABLE
QEI Interrupt Priority
QEI_INT_PRI_0
QEI_INT_PRI_1
QEI_INT_PRI_2
QEI_INT_PRI_3
QEI_INT_PRI_4
QEI_INT_PRI_5
QEI_INT_PRI_6
QEI_INT_PRI_7
Return Value
None
Remarks
This function clears the Interrupt Flag bit, sets the interrupt priority and enables/disables the interrupt.
Source File
ConfigIntQEI.c
Code Example
ConfigIntQEI(QEI_INT_ENABLE & QEI_INT_PRI_1);
Buradan anladığımız kadarıyla QEI_INT_DISABLE sabitinin QEI kesmesini kapatması gerekiyor. Ama gerçekte kapatmıyor. Neden? Cevap
qei.h dosyasında gizli. Bu dosyada sabit şöyle tanımlanmış:
#define QEI_INT_DISABLE 0xFF7F /* Clear the Interrupt enable bit */
Şimdi dsPIC30F2010'un datasheet'ine dönüp QEIIE bitinin nerede olduğuna bakarsak... IEC2 register'ının 8. biti (0'dan başlarsak). Ama yukarıda tanımlanan 0xFF7F değeri 8. değil 7. biti sıfırlıyor, yani PWM kesmeleri ile ilgili biti.
Siz de bir kontrol edin, yanlışım olmasın.
PIC kullanmasam da benim gibi hatayı en son kütüphanede arayanlar için güzel bir uyarı olmuş :)
Bu arada, bu tür hataları Microchip'e nasıl bildirebiliriz? Twitter hesaplarına tweet atsak olur mu acaba?
Alıntı yapılan: Tagli - 02 Ağustos 2014, 14:23:15
Bu arada, bu tür hataları Microchip'e nasıl bildirebiliriz? Twitter hesaplarına tweet atsak olur mu acaba?
cn@microchip.com adresinden sürekli düzeltme mailleri alıyorum.Denemedim ama iş yarayan bir adres olabilir.
DocErrors@microchip.com
http://www.microchip.com/support/hottopics.aspx (http://www.microchip.com/support/hottopics.aspx) adresinden Support Ticket oluşturup durumu anlattım.
Bu arada, hatayı yanlış tespit etmişim. Durumun bit numarası ile ilgisi yokmuş. Hatamı ConfigIntQEI.c dosyasına bakınca gördüm (support klasörünün içinden erişilebiliyor). Fonksiyon şöyle tanımlanmış:
void ConfigIntQEI(unsigned int config)
{
_QEIIF = 0; /* clear Interrupt flag */
_QEIIP = config & 0x07; /* bits <2:0> is the priority*/
_QEIIE = (config & 0x8)>>3; /* bit 3 is interrupt enable/diable */
}
Yani QEI_INT_DISABLE sabitinin 0xFF7F değil, 0xFFF7 olması gerekiyordu.