PIC18F2520 mplab x xc8 EEPROM

pic mplab eeprom

2790 просмотра

2 ответа

16 Репутация автора

Platform MPLAB X
CPU PIC18F2520
Compiler XC8 v1.38

Мы переносим проект из старого (htc) компилятора на платформу MPLAB X, но не можем получить доступ к EEPROM.

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

#if _EEPROMSIZE > 0 && defined(_PLIB)

Не запускается, а вместо этого #else. Кажется, что ни _EEPROMSIZE, ни _PLIB не определены.

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

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

Мы попытались увидеть, что бы сделал MicroCip Code Configure, но процессор PIC18F2520 не поддерживается MCC.

The chip do have 256 byte eeprom according to

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

С уважением

Автор: user6127660 Источник Размещён: 18.07.2016 12:25

Ответы (2)


1 плюс

775 Репутация автора

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

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

Один из вариантов - вернуться к прямому манипулированию регистрами для выполнения чтения / записи 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)
}
Автор: gbmhunter Размещён: 19.07.2016 06:09

0 плюса

11 Репутация автора

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

Автор: user4406260 Размещён: 01.04.2017 01:20
32x32