마하전자기술연구소 LOGO

제품검색 고객센터053-604-2355
기술자료실

Home > 기술자료실 기술자료실

제 목 6. 프로그램 EEPROM에의 Read/Write의 방
첨부파일


프로그램 EEPROM에의 Read/Write 방법

【개요】

PIC16F877에 새롭게 추가된 기능으로, 의외로 알려지지 않은 것이, 프로그램
그리고 프로그램 내용 그 자체를 개서를 할 수 있게 되었다고 하는 것입니다.
즉, 지금까지는, PIC16F84를 시작해로서 프로그램 자신에서는, 데이타메모리
밖에 개서를 할 수가 없었습니다만, PIC16F8xx 시리즈에서는,
프로그람메모리가 플래쉬 메모리이며, 한편 프로그램으로, 이 메모리에 써
포함을 할 수 있게 되어 있습니다.

이것을 사용하면(자), 지금까지 256바이트 밖에 없었던 데이터 EEPROM가, 한꺼번에 최대
8 k워드(14비트폭)까지 확대하게 됩니다.
(우도 프로그램 자신이 있으므로 이것보다 적지는 됩니다만)

프로그람메모리에의 Read/Write 순서는, EEPROM 데이타메모리와 유사한 순서와
되어 있습니다만, 기입 완료 기다리는 방법이 크게 차이가 납니다.
즉, 일단 기입해 지령을 내리면(자), PIC 자신이HALT 모드, 즉 정지상태태
되어, 메모리에의 기입이 완료하면(자) 자동적으로 정지한 다음의 명령으로부터 프로그라
무의 실행을 재개합니다.

이것에 대해 읽기 순서는 EEPROM 데이타메모리와 같은 순서가 되고 있습니다.
그러나 주소도 데이터도 1바이트 이상의 폭이 있으니까, 거기의 곳이 조금
차이가 납니다.

【레지스터의 상세 내용】

프로그람메모리의 Read/Write에 관련하는 레지스터에는 아래와 같이가 있습니다.

  EECON1 :Read/Write 제어 레지스터
  EECON2 :Read/Write 순서 제어 레지스터
  EEDATA :데이터 하위 아르바이트
  EEDATH :데이터 상위 아르바이트(데이터는 14비트폭)
  EEADR  :주소 하위 아르바이트
  EEADRH :주소 상위 아르바이트(주소는 13비트폭)

≪EECON1 레지스터의 상세≫
 제어용 레지스터에서는 EECON1가 중요한 기능을 하고 있습니다. 그 내용은
밑그림과 같이 되어 있어, EEPGD 비트가 EEPROM의 데이타메모리와 프로그램
메모리의 구별을 실시하는 비트가 되고 있습니다.




【Read/Writte 순서 상세】

실제로 프로그람메모리에 Read/Write 하는 순서는 아래와 같은 플로우도와 같이
합니다.
독방편은 고속으로 1 명령의 실행 시간내에 읽어 동작을 완료하므로, 약속
등을 할 필요는 전혀 없습니다.
그러나 기록은,
4~10msec정도의 시간을 필요로 해, 이 약속의 사이
(은)는, PIC는 정지상태태가 되기 때문에, 사용법에 주의가 필요합니다.
특히 고속 처리로, 일정시간내의 실행을 필요로 하는 것 같은 처리중에서 기록을 실시한다
의는 위험합니다.




【C언어 프로그램예】

실제로 CCS사의 C언어에 의한 프로그램으로 프로그람메모리에 Read/Write 한다
에는 아래와 같이 함수를 사용합니다.

편성 함수 서식

기능 내용

long data = READ_PROGRAM_EEPROM(long adrs) 프로그람메모리의 adrs 번지의 내용을 읽어 data에 대입한다.
adrs, data는 모두 long나 long int로 정의되고 있는 것.
WRITE_PROGRAM_EEPROM (long adrs, long data) 프로그람메모리의 adrs 번지에 data라고 하는 데이터를 기입한다.
adrs와 data는 모두 long나 long int로 정의되고 있는 것.

≪프로그램예≫
 아래와 같은 리스트는 실제의 프로그램예로, 0 x1E00 번지로부터 순서에 주소와 같은 데이터
 (을)를 256바이트 써 넣어, 그 후 그것을 읽어내 액정 표시기에 표시한다고 한다 
 동작을 합니다.
 이 예의 회로는 밑그림과 같이 되어 있어, 액정 표시기는 전용의 라이브러리와
 되어 있습니다.



////////////////////////////////////////////////////////////
// This program is program memory read/write test program.
// This test executed on PIC16F877 that is flash memory.
///////////////////////////////////////////////////////////
#include  <16f877.h>
#use delay(CLOCK=10000000)       //10MHz

//////// Port define and link LCD library
#include

////////////// main routine
main() {
  long  adrs, data;
  lcd_init();               //initialize LCD
  ////main process
  printf(lcd_data, "Start EEPROM test");
  for (adrs=0x1E00;adrs<0x1F00;adrs++) {
    data=adrs;
    write_program_eeprom(adrs, data);
  }
  lcd_clear();
  for(adrs=0x1E00;adrs<0x1F00;adrs++) {
    data=read_program_eeprom(adrs);
    lcd_cmd(2);             //cursor at home
    printf(lcd_data, "%4LX %4LX", adrs, data);
    delay_ms(500);
  }
}



【어셈블러 프로그램예】

상기의 C언어의 예와 같은 기능을 어셈블러언어로 작성한 예입니다.
액정 표시기의 써브루틴은 전용이 되고 있습니다.
이 액정 표시기를 포토 D로 사용할 때에 주의가 필요한 것은, 포토 E
에 포토 D의 사용법을 설정할 필요가 있는 것을 잊지 않게 한다
일입니다.

전체의 리스트는 아래와 같이로 다운로드할 수가 있습니다.

  
★ 프로그램 EEPROM Read/write 테스트 프로그램 리스트

이 안에서, EEPROM의 Read/Write를 하는 써브루틴의 부분은 아래와 같이
리스트와 같이 되어 있어, 상기의 플로차트(flow chart)대로의 순서와
되어 있습니다.
(주) 아래와 같이 리스트에는 한자 스페이스가 섞이고 있기 때문에 그대로는 사용할 수 없습니다.

(1) 변수 정의부
  늘어놓는 순서는 이 대로가 아니면 안됩니다.

ADRH EQU 020H  ;EEPROM address upper
ADRS EQU 021H  ;EEPROM address lower
DATH EQU 022H  ;EEPROM data upper
DATL EQU 023H  ;EEPROM data lower


(2) Read 써브루틴
  써브루틴내에서 몇번이나 뱅크의 전환을 하기 때문에, 변수 지정
  (은)는 간접 주소로서 꺼내고 있습니다. 따라서 변수의 줄 순서
  (은)는(1) 대로로 되지 않으면 안됩니다.


;*****************************************
; program memory read subroutine
; address set in ADRH, ADRS
; return with set data in DATH, DATL
;*****************************************
READ_EEMEM
  BCF  STATUS, IRP  ;bank0 for indirect address
  MOVLW ADRH     ;start from 0CH
  MOVWF FSR      ;set indirect pointer
  BSF  STATUS, RP1
  BCF  STATUS, RP0  ;bank2
  MOVF  INDF, W    ;get address upper
  MOVWF EEADRH    ;set EEPROM address upper
  INCF  FSR, F     ;next
  MOVF  INDF, W
  MOVWF EEADR     ;set EEPROM address lower
  INCF  FSR, F
  BSF  STATUS, RP0  ;bank3
  BSF  EECON1, EEPGD ;set program memory
  BSF  EECON1, RD   ;start read
  NOP         ;HALT dumy
  NOP
  BCF  STATUS, RP0  ;bank2
  MOVF  EEDATH, W   ;get upper data
  MOVWF INDF     ;save to DATH
  INCF  FSR, F     ;next
  MOVF  EEDATA, W   ;get lower data
  MOVWF INDF
  BCF  STATUS, RP1  ;bank0
  RETURN


(3) Write 써브루틴
  글써브루틴에서는, 도중의 NOP 명령의 곳에서 수msec의 사이
  HALT(정지) 모드가 되기 때문에 실행 시간으로는 주의가 필요
  입니다.

;********************************************
; program memory write subroutine
; address set in ADRH, ADRS
; data set in DATH, DATL
;********************************************
WRITE_EEMEM
  BCF  STATUS, IRP  ;set bank0 for indirect
  MOVLW ADRH
  MOVWF FSR      ;set indirect
  BSF  STATUS, RP1  ;bank2
  BCF  STATUS, RP0
  MOVF  INDF, W    ;get upper address
  MOVWF EEADRH    ;set upper address
  INCF  FSR, F     ;next
  MOVF  INDF, W    ;get lower address
  MOVWF EEADR     ;set lower address
  INCF  FSR, F     ;next
  MOVF  INDF, W    ;get upper data
  MOVWF EEDATH    ;set upper data
  INCF  FSR, F     ;next
  MOVF  INDF, W    ;get lower data
  MOVWF EEDATA    ;set lower data

  BSF  STATUS, RP0  ;bank3
  BSF  EECON1, EEPGD ;program memory
  BSF  EECON1, WREN  ;write enable
  MOVLW 0x55     ;write sequence
  MOVWF EECON2
  MOVLW 0xAA
  MOVWF EECON2
  BSF  EECON1, WR   ;write start
  NOP         ;HALT NOP
  NOP
  BCF  EECON1, WREN  ;write disable
  BCF  STATUS, RP0
  BCF  STATUS, RP1  ;bank0
  RETURN

목록보기

www.1chip.com, www.1chip.co.kr
www.micom114.com
자료실바로가기

대구광역시 북구 산격2동 1629 산업용재관 10동 13호 (2층) / Tel. 053-604-2355 / Fax. 053-383-2354 / E-mail. maha@paran.com