2014-11-15 2 views
0

PIC24F16KA101 MCU의 내부 메모리와 상호 작용하려고합니다. 데이터 시트 및이 사이트에 대한 토론 (꽤 도움이되는 샘플 코드를 제공함) used in the project 이전에 썼던 값과 동일한 값을 성공적으로 읽을 수 있기 때문에 아래의 코드를 잘 작성하면됩니다. . 그러나 쓰기 후에 MCU의 플러그를 뽑고 EEPROOM의 읽기만 수행하면 기록 된 값을 반환하지 않습니다. 여기에 무슨 문제가있을 수 있습니까? 왜 내가 쓸 수 있고 성공적으로 읽을 수는 있지만 전원을 끈 후에는 읽을 수 없습니까? 도움에 대한 모든 사전에 감사 데미안내부 EEPROM의 읽기/쓰기 문제 PIC24F16KA101

int __attribute__ ((space(eedata))) ee_addr; 
void EepSetup(); 
void EepErase(void); 
int EepWrite(int index, int data); 
int EepRead(int index); 

int main(int argc, char** argv) 
{ 
    unsigned int data = 123; 
    unsigned int data_read = 0; 

    Init_UART1(); 
    UART1WriteString("START EEPROM PROGRAM \n"); 
    EepSetup(); 
    UART1WriteString("WRITING DATA TO MEMORY \n"); 
    EepWrite(1,data); 

    //if the code works, just comment the upper section and read eeprom after 
    //disconecting the power source 
    UART1WriteString("READING DATA FROM MEMORY \n"); 
    data_read = EepRead(1); 
    UART1WriteString("Value Read: "); 
    UART1WriteInt(data_read,16); 
    UART1WriteString("\n"); 
    __delay_ms(1000); 
    return (EXIT_SUCCESS); 
} 
void EepSetup(){ 
    //Disable Interrupts For 5 instructions 
    asm volatile("disi #5"); 
    //Issue Unlock Sequence 
    asm volatile("mov #0x55, W0 \n" 
    "mov W0, NVMKEY \n" 
    "mov #0xAA, W1 \n" 
    "mov W1, NVMKEY \n"); 
} 
void EepErase(void) { 
    NVMCON = 0x4050;   // Set up NVMCON to bulk erase the data EEPROM 
    asm volatile ("disi #5"); // Disable Interrupts For 5 Instructions 
    __builtin_write_NVM();  // Issue Unlock Sequence and Start Erase Cycle 
    while(_WR) 
    ; 
} 

int EepRead(int index){ 
    unsigned int offset; 

    TBLPAG = __builtin_tblpage(&ee_addr); // Initialize EE Data page pointer 
    offset = __builtin_tbloffset(&ee_addr); // Initizlize lower word of address 
    offset += index * sizeof(int); 
    return __builtin_tblrdl(offset); // read EEPROM data 
} 

int EepWrite(int index, int data){ 
    unsigned int offset; 
    NVMCON = 0x4004; // Set up NVMCON to erase one word of data EEPROM 
    TBLPAG = __builtin_tblpage(&ee_addr); // Initialize EE Data page pointer 
    offset = __builtin_tbloffset(&ee_addr); // Initizlize lower word of address 
    offset += index * sizeof(int); 
    __builtin_tblwtl(offset, data); 
    asm volatile ("disi #5"); // Disable Interrupts For 5 Instructions 
    __builtin_write_NVM();  // Issue Unlock Sequence and Start Erase Cycle 
    while(_WR); 
    return (EXIT_SUCCESS); 
} 

답변

0
난 그냥 문제가 당신이 MPLABX과 함께 PICKIT 3를 사용하는 경우가를 유지하기 위해 프로그래머의 옵션을 선택해야한다는 어떻게, 무엇인지 파악

EEPROM 메모리, 그래서 코드가 작동했다, 당신은 프로그래머 설정에서 "보존 EEPROM 메모리"의 옵션을 확인해야합니다. 나는 이것이 다른 사람들을 돕기를 바랍니다.

건배, Damian