MPLAB Harmony Hakkında

Başlatan okg, 12 Eylül 2017, 20:45:36

okg

Arkadaşlar merhaba, bir projemden dolayı 32bit pic kullanmak durumunda kaldım ve derleyici olarak da mplab x ide harmony kullanıyorum. Daha önceden mplab harmony kullanan var mı acaba? i2c haberleşmesinde debug yaparken PLIB_I2C_ReceivedByteGet(...) fonksiyonunda takılıp kalıyor. harmony ile i2c kullanan var ise yardımcı olursa çok sevinirim.
KTU Elektronik Haberleşme - YTÜ Haberşelme YL - GTU Haberleşme YL

baran123

Harmony falan fark etmiyor bu I2C nerede olursa olsun takılıyor !!!
Durum registerlerını kontrol et(debug) mutlaka biri SET/RESET olmuyordur.

okg

#2
Alıntı yapılan: baran123 - 12 Eylül 2017, 21:33:05
Harmony falan fark etmiyor bu I2C nerede olursa olsun takılıyor !!!
Durum registerlerını kontrol et(debug) mutlaka biri SET/RESET olmuyordur.

maalesef ne var ne yoksa kontrol ettim, farklı 3-5 kod yazdım ama nafile. harmony nasıl çalışıyor hala kavrayamadım. bazı örneklerde ack-nack gönderilip alınmıyor bazı örneklerde start + address + w + register işleminden sonra stop gönderilmemiş direk start + address + r işlemleri yapılıp veri okunmuş. kafam 1 milyon oldu.

kullandığım sensör smb380

#define slave_ADDR          0x38
#define slave_WRITE_ADDR    0x70    
#define slave_READ_ADDR     0x71
#define accx1_DATA_ADDR     0x02

APP_DATA appData;

uint8_t count;
uint8_t length = 6;
uint8_t buffer[6];
uint16_t x,y,z;
void APP_Initialize ( void )
{
    appData.state = APP_STATE_INIT;
}

void APP_Tasks ( void )
{
    PLIB_I2C_Enable(I2C_ID_2);
    PLIB_I2C_MasterStart(I2C_ID_2);
    PLIB_I2C_TransmitterByteSend(I2C_ID_2 , slave_WRITE_ADDR);
    while(!PLIB_I2C_MasterReceiverReadyToAcknowledge(I2C_ID_2));
    PLIB_I2C_TransmitterByteSend(I2C_ID_2 , accx1_DATA_ADDR);
    while(!PLIB_I2C_MasterReceiverReadyToAcknowledge(I2C_ID_2));
    PLIB_I2C_MasterStop(I2C_ID_2);
 
    
    PLIB_I2C_MasterStartRepeat(I2C_ID_2);
    PLIB_I2C_TransmitterByteSend(I2C_ID_2 , slave_READ_ADDR);   
//    while(!PLIB_I2C_MasterReceiverReadyToAcknowledge(I2C_ID_2));
    for(count= 0 ; count < length ; count ++)
        
    {
        buffer[count] = PLIB_I2C_ReceivedByteGet(I2C_ID_2);
        if(count == length -1)
        {
            PLIB_I2C_ReceivedByteAcknowledge(I2C_ID_2 , false);
        }
        else
        {
            PLIB_I2C_ReceivedByteAcknowledge(I2C_ID_2 , true);
        }     
    }
    PLIB_I2C_MasterStop(I2C_ID_2);
    
    
        x = ((((int16_t)buffer[1]) << 8) | buffer[0]) >> 6;
        y = ((((int16_t)buffer[3]) << 8) | buffer[2]) >> 6;
        z = ((((int16_t)buffer[5]) << 8) | buffer[4]) >> 6;
}



debug sonrası:

KTU Elektronik Haberleşme - YTÜ Haberşelme YL - GTU Haberleşme YL

baran123

Harmony bilmiyorum ama benim PIC18 için I2C rutinlerim şu şekilde

Write
void I2C_WriteData(uint8_t slaveAddr, uint8_t regAddr, uint8_t data)
{
    I2C_State(I2C_State_Start);                   
    I2C_Address(slaveAddr, I2C_WRITE);
    I2C_Write(regAddr);	                
    I2C_Write(data);	         
    I2C_State(I2C_State_Stop); 
}


Read
void I2C_ReadData(uint8_t slaveAddr, uint8_t regAddr, uint8_t *data)
{
    I2C_State(I2C_State_Start);                       
    I2C_Address(slaveAddr, I2C_WRITE); 
    I2C_Write(regAddr);	              
    I2C_State(I2C_State_Restart);                
    I2C_Address(slaveAddr, I2C_READ);   
    *data = I2C_Read(I2C_NACK);
    I2C_State(I2C_State_Stop);   
}

okg

@baran123  peki idle, ack veya nack işlemleri nerede yapılıyor?  Start ve write fonksiyonlarında mı tanımlı?
KTU Elektronik Haberleşme - YTÜ Haberşelme YL - GTU Haberleşme YL

baran123

Evet fonksiyonların içinde yapılıyor.
Şurası size I2C'nin temel rutinlerin hakkında örnek sağlar.
https://electrosome.com/i2c-pic-microcontroller-mplab-xc8/

okg

@baran123 o fonksiyonların içerisinde yazanları buraya ekleyebilir misiniz? Yoldayım,  telefondan zor bulurum muhtemelen
KTU Elektronik Haberleşme - YTÜ Haberşelme YL - GTU Haberleşme YL