2016-07-18 10 views
1
Platform MPLAB X 
CPU PIC18F2520 
Compiler XC8 v1.38 

Мы двигаемся проект от старого (ЦВТ) компилятор в MPLAB X платформы, но не может получить доступ к EEPROM.PIC18F2520 MPLAB х xc8 EEPROM

Старый компилятор поддерживает eeprom_read и eeprom_write, но XC8 не так ли определяет их определение, но они являются «пустыми». (xc.h включает в себя htc.h, которые включают pic18.h) в системе pic.h линии

#if _EEPROMSIZE > 0 && defined(_PLIB) 

не запускается, но вместо соответствующий #else Кажется, что ни _EEPROMSIZE, ни _PLIB определена.

Почему это так, что старые (eeprom_read и eeprom_write) не поддерживаются в xc8?

Что мы должны сделать, чтобы иметь возможность доступа к EEPROM?

Мы попытались выяснить, что сделало бы Конфигурация кода микрочипа, , но CPU PIC18F2520 не поддерживается MCC.

The chip do have 256 byte eeprom according to 

http://ww1.microchip.com/downloads/en/DeviceDoc/39631E.pdf

С уважением

ответ

0

Да, как вы обнаружили, Microchip удалила EEPROM функции чтения/записи для PIC18 семейства микроконтроллеров в MPLAB X IDE. Он оставил макросы в виде пустых оболочек (EEPROM_READ(), eeprom_read(), e.t.c), которые не будут бросать ошибку/предупреждение компилятора, , но фактически ничего не делают!

pic18.h предполагает, что если #if _EEPROMSIZE > 0 && defined(_PLIB) верно, то макросы будут заполнены, но вручную путем добавления определения PLIB макроса, компилятор затем жаловался не в состоянии найти plib.h. Я не мог найти подходящее место для загрузки «plib».

Один из вариантов, чтобы вернуться обратно в прямой регистр манипуляции выполнять EEPROM чтение/запись (см 75 в http://ww1.microchip.com/downloads/en/DeviceDoc/39626e.pdf для определения регистра EEPROM для одного конкретного PIC18 микро). Я написал следующие функции, которые отвлеченные, что далеко и обеспечить аналогичные функциональные возможности, что удалены Microchip:

//! @brief  Reads a single byte of data from the EEPROM. 
//! @param  address  The EEPROM address to write the data to (note that not all 
//!       16-bits of this variable may be supported). 
//! @returns The byte of data read from EEPROM. 
//! @warning This function does not return until read operation is complete. 
uint8_t Eeprom_ReadByte(uint16_t address) 
{ 

    // Set address registers 
    EEADRH = (uint8_t)(address >> 8); 
    EEADR = (uint8_t)address; 

    EECON1bits.EEPGD = 0;  // Select EEPROM Data Memory 
    EECON1bits.CFGS = 0;  // Access flash/EEPROM NOT config. registers 
    EECON1bits.RD = 1;   // Start a read cycle 

    // A read should only take one cycle, and then the hardware will clear 
    // the RD bit 
    while(EECON1bits.RD == 1); 

    return EEDATA;    // Return data 

} 

//! @brief  Writes a single byte of data to the EEPROM. 
//! @param  address  The EEPROM address to write the data to (note that not all 
//!       16-bits of this variable may be supported). 
//! @param  data  The data to write to EEPROM. 
//! @warning This function does not return until write operation is complete. 
void Eeprom_WriteByte(uint16_t address, uint8_t data) 
{  
    // Set address registers 
    EEADRH = (uint8_t)(address >> 8); 
    EEADR = (uint8_t)address; 

    EEDATA = data;   // Write data we want to write to SFR 
    EECON1bits.EEPGD = 0; // Select EEPROM data memory 
    EECON1bits.CFGS = 0; // Access flash/EEPROM NOT config. registers 
    EECON1bits.WREN = 1; // Enable writing of EEPROM (this is disabled again after the write completes) 

    // The next three lines of code perform the required operations to 
    // initiate a EEPROM write 
    EECON2 = 0x55;   // Part of required sequence for write to internal EEPROM 
    EECON2 = 0xAA;   // Part of required sequence for write to internal EEPROM 
    EECON1bits.WR = 1;  // Part of required sequence for write to internal EEPROM 

    // Loop until write operation is complete 
    while(PIR2bits.EEIF == 0) 
    { 
     continue; // Do nothing, are just waiting 
    } 

    PIR2bits.EEIF = 0;  //Clearing EEIF bit (this MUST be cleared in software after each write) 
    EECON1bits.WREN = 0; // Disable write (for safety, it is re-enabled next time a EEPROM write is performed) 
} 
+0

Да, я сделал то же самое Просто комментарий, у Microchip есть макрос, _LOAD_EEADR Что можно использовать вместо этого (я предполагаю, что это независимый процессор) EEADRH и EEADR, becosue на PIC у нас нет таких, как регистры, только EEADR – user6127660

0

с помощью MCC выберите модуль памяти, и он будет создавать memory.c со всеми функциями, необходимыми

 Смежные вопросы

  • Нет связанных вопросов^_^