2013-05-07 4 views
0

PIC18에 번호를 저장하고 전원이 끊어 지거나 장치가 리셋 되더라도 그것을 유지하고 싶습니다. 필자가 작성한 코드 부분은 괜찮아 보인다. 장치가 리셋 된 후 읽기 부분이 이상하게 보입니다.PIC18로 메모리에 쓰고 읽는 방법은 무엇입니까?

나는 마이크로 칩에서 얻은 다음 코드를 사용 중이다.

코드 : 나는 장치를 재설정 만 읽기 코드를 사용할 때 항상 읽을 수 255

코드를 얻을 그러나 1

:

unsigned int value; 
unsigned int DEEdata = 1; 
unsigned int DEEaddr = 0x04; 

DataEEInit(); 
dataEEFlags.val = 0; 

DataEEWrite(DEEdata,DEEaddr); 
value = DataEERead(DEEaddr); 
Nop(); 
printf("%d",value); 

OUPUT :

,210

출력 255

이 일어나는 이유는 무엇입니까? 아마도 값이 저장되지 않았거나 읽기 부분이 올바르지 않다고 가정합니다. 고맙습니다!

+0

거기에 설치 프로그램에서 eeprom 사용할 수 있습니까? 당신이 255 (0xFF)를 얻는다면 그것은 지워졌고 쓰여지지 않았거나 시작시 지우기를 수행하는 것입니다. Funcon의'EE'는 eeprom에 쓰는 것을 암시합니다. 장치의 부품 번호는 무엇입니까? –

+0

제가 가지고 있습니다 pic18f87j11 – Ammar

+1

@Ammar 여기서 답변을 찾지 못한 경우 (일부 유망한 답변이 있음에도 불구하고) 마이크로 칩 포럼 http://www.microchip.com/forums/에서 확인할 수 있습니다. 나는 그들이 과거에 도움이되었다는 것을 발견했다. –

답변

0

일부 PIC18 마이크로에는 내부 플래시 외에 내부 EEPROM이 있습니다. 18F87J11에는이 옵션이 없으므로 다음과 같은 두 가지 옵션이 있습니다.

1) 프로그램을 저장하는 곳입니다. 응용 프로그램에 쓰기/읽기 사이클 수가 맞는지 확인하십시오.

2) 아래의 코멘트에 링크 된 마이크로 칩 (에서 'EEPROM 에뮬레이션'라이브러리에서 사용하는

DataEEWrite은

구성 설정에 대한 외부 I2C 또는 SPI 메모리를 사용합니다. 몇 가지에가 있습니다 !의주의 : - 당신이 할 수있는

  • 플래시를 재 프로그래밍 할 때 쓰기 사이클이 제한되어 정말 EEPROM되지 않은 기억
  • 설정 덮어 쓸 수 조심하고 메모리의 큰 부분을 삭제해야 싱글 바이트 지우기
  • 가능한 경우 1. 내부 EEPROM :
+0

C 언어를 사용하여 플래시 메모리에 쓰는 것에 대한 예제를 정말 고맙게 생각합니다. 지금은 이것이 내 최선의 선택이라고 생각합니다. DataEEWrite()의 경우 - 다음 링크에서 가져 왔습니다. (http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2680&dDocName=en538000), Thanks @Will. – Ammar

+0

아직도 작동하지 않습니다 : ( – Ammar

+1

OK 이제 에뮬레이션 라이브러리를 사용하고 있습니다. 이렇게하면 플래시를 일종의 EEPROM으로 사용할 수 있습니다.이를 위해 몇 가지 상수를 설정하고 init 함수를 사용하기 전에이 문서의 14 페이지에있는 체크리스트를 참조하십시오. http://ww1.microchip.com/downloads/en/AppNotes/01095D.pdf – Will

-2

전원을 껐다 켤 때 값을 유지하려면 SRAM 메모리를 사용해야합니다. 먼저 SRAM 메모리를 사용할 수 있는지 확인하십시오.

+0

나는이 순간을 정직하게 알지 못한다. 그러나 나는 누군가에게 물었고 나는 곧 응답해야한다.불편을 드려 죄송합니다. 당신이 의심하는 유일한 문제입니까? – Ammar

+0

예. 플래시 메모리 (내가 갖고 있지 않은 것으로 의심되는)에 쓰기를 제공하지 않는 한, SRAM을 사용하는 것이 전원을 껐다 켤 때 값을 유지하는 유일한 방법입니다. 언제든지 마이크로 컨트롤러와 SRAM을 인터페이스 할 수 있습니다. – CatchMeIfYouTry

+0

이 정보가 유용 할 수도 있습니다. pic18f87j11이 있습니다. – Ammar

1

사용중인 장치에는 플래시 이외의 내부 비 휘발성 메모리가 없으며 일반적으로 코드 저장에 사용됩니다.

당신은 내가 볼 수있는 두 가지 옵션이 있습니다

  1. 가 일부 외부 플래시 또는 EEPROM을 사용하여이 PIC에 가능한 외부 메모리 버스로 인터페이스를 (가족 데이터 시트의 97 페이지 참조).
  2. 데이터를 저장하는 데 사용할 수있는 작은 부분을 예약하여 (코드 전용으로 사용되는 메모리 영역을 간섭하지 않도록)이 영역에 데이터를 쓸 수 있도록 내부 플래시를 다시 매핑하십시오 (87 페이지).

저는 몇 년 동안 PIC와 함께 작업 해본 적이 없으므로 구현 세부 사항을 많이 제공 할 수는 없지만 마이크로 칩 웹 사이트에서 제공 할 수있는 예제가 많습니다.

코드가 작동하지 않는 이유는 거기에없는 메모리에 액세스하려고하기 때문입니다. 그곳에 있으면 인터페이스가 올바르지 않습니다.

편집 : 마이크로 칩의 웹 사이트에 PIC18에 대한 코드 예제 페이지를 통해 살펴 했어 프로그램 메모리에 쓰기 위해 어떤 C 예제를 찾을 수 없습니다

. 불행히도 어셈블러에서 구현해야하는 것처럼 보입니다. 내가 인라인을 할 거라면이 같은 뭔가 수 있습니다, 일반적으로 MPLAB 컴파일러에 대한 의미를 알고 있지만하지 않습니다 또는

void my_assembler_function(void) 
{ 
    // Inline assembler code, actioned via C. 
    asm("MOV x y"); 
    asm("MOV y z"); 
} 

를, 마이크로 프로세서의 많은 C 컴파일러는 당신에게 허용 C 함수 호출로 외부 .s 파일을 호출하여 인라인으로 저장하지 않아도됩니다.

예를 들어 내가 실제로 찾은 기능을 구현하기 위해 here이라는 예를 찾을 수 있다고 생각합니다.

+0

나는 지금 옵션 2를 시험해보고 싶다. 그리고 필요하다면 나는 옵션 1로 바꿀 것이다, 옵션 2에 대한 예제는 당신의 답을 완성 할 것이다. – Ammar

+0

어떤 컴파일러를 사용하고 있습니까? –

+0

MPLAB IDE C18을 사용합니다. – Ammar

1

SRAM은

SRAM은

옵션 ... 전원주기 동안 데이터를 잃어 버릴 것입니다 ... 비 휘발성 데이터를 저장하는 데 사용할 수 없습니다. 2. I2C 또는 SPI를 통한 외부 EEPROM. 3. PIC18 데이터 에뮬레이션 라이브러리.

0

255의 값은 EEPROM 메모리의 기본값입니다. 나는 코드를 변경 한 후에 다시 마이크로 컨트롤러 IC를 프로그래밍한다고 생각한다. 따라서 EEPROM 메모리는 지워지고 기본값으로 돌아갑니다. MPLAB을 컴파일러로 사용하는 경우 'Programmer'tab> Settings ..> Program Memory> Program Options로 이동하여 Program에서 EEPROM 보존을 클릭하십시오. 희망이 있습니다.

0

두 가지 기능 : 8 바이트 블록의 64 바이트 버퍼와 읽기/비교 플래시 기능을 사용하여 플래시에 쓰기. 장치에 대한

: PIC18F46K80 헤더 파일에 대한

재료 :

#define PRGM_BUFFER_SIZE 8 
#define TABLE_WRITE_SIZE 64 

#define LOAD_TBL_PTR(x) { TBLPTRU = ((((x)>>8)>>8)&0xff);\ 
         TBLPTRH = (((x) >> 8) & 0xff);\ 
         TBLPTRL = ((x) & 0xff);\ 
        } 

쓰기 플래시 기능 :

/****************************************************** 
* Function  : write_block 
* Input  : uint16_t position in destination flash 
* Global  : uint8_t buffer[64] - Location of source data 
* Output  : None 
* Description : Writes the contents of the 64 byte 
* data buffer to program flash space. Only 64 bytes 
* can be written at once. The process of writing 
* to flash is: Erase->Write. 
******************************************************/ 
static void write_block(uint16_t addr) 
{ 
    int r, c; 

    // Erase flash block first. Erases a 64 byte block at a time. 

    LOAD_TBL_PTR(addr); 

    EECON1bits.EEPGD = 1; // Point to flash program memory 
    EECON1bits.CFGS = 0; // Access flash memory 
    EECON1bits.WREN = 1; // Enable write to memory 
    EECON1bits.FREE = 1; // Enable Erase operation 

    EECON2 = 0x55; 
    EECON2 = 0xAA; 

    EECON1bits.WR = 1;  // Clear the flash 

    asm("NOP");    // Stall 

    // Write buffer to internal buffer. This process writes 8 bytes at a time 
    // so we need to loop 8 times (8*8 = 64).) 

    for (r = 0; r < 8; r++) 
    { 
     LOAD_TBL_PTR((addr + (r * 8))); 

     for (c = 0; c < PRGM_BUFFER_SIZE; c++) 
     { 
      TABLAT = buffer[(r * 8) + c]; 

      asm("TBLWT*+");  // Push byte and then inc to next internal buffer cell 
     } 

     // Write the block to flash 

     asm("TBLRD*-");   // Point back to original row 

     // Write internal buffer to flash 

     EECON1bits.EEPGD = 1; // Point to flash program memory 
     EECON1bits.CFGS = 0; // Access flash program memory 
     EECON1bits.WREN = 1; // Enable write to memory 
     INTCONbits.GIE = 0;  // Disable interrupts 

     EECON2 = 0x55; 
     EECON2 = 0xAA; 

     EECON1bits.WR = 1;  // Start programming flash 
     INTCONbits.GIE = 1;  // Re-enable interrupts 
     EECON1bits.WREN = 0; // Disable write to memory 
    } 
} 

것은 기록 된 데이터를 확인 (증명 플래시 읽기)

/****************************************************** 
* Function  : compare_block 
* Input  : uint16_t position in destination flash 
* Global  : uint8_t buffer[64] - Location of previous written data 
* Output  : bool true=successful, false=did not match 
* Description : Reads a 64 byte block of flash memory and 
* compares it to the data found in the global buffer. 
******************************************************/ 
static bool compare_block(uint16_t addr) 
{ 
    bool retVal = true; // succeeds 
    uint8_t i = 0; 

    INTCONbits.GIE = 0;  // Disable interrupts 

    LOAD_TBL_PTR(addr); 

    for (i = 0; i < TABLE_WRITE_SIZE && retVal == true; i++) 
    { 
     asm("TBLRD*+"); 

     if (buffer[i] != TABLAT) 
      retVal = false; 
    } 

    INTCONbits.GIE = 1;  // Enable interrupts 

    return retVal; 
} 

너, 브라이언 Wilcutt

관련 문제