2012-03-09 7 views
0

나는 PIC16F84 마이크로 컨트롤러 용 eeprom 읽기/쓰기 서브 루틴을 작성해야한다. 그러한 코드를 작성했습니다 :PIC16F84 - eeprom 읽기 및 쓰기

EEPROM_Read 
     clrw 
     bsf  STATUS, RP0 ; Bank0 
     movlw DATA_EE_ADDR ; Any location in Data EEPROM memory space 
     movwf EEADR  ; Address to read 
     bsf  EECON1, RD ; EE Read 

     movlw EEDATA 
     bcf  STATUS, RP0 ; Bank0 
     return 

EEPROM_Write   
     bcf  INTCON,GIE  ;disable interrupts for EEPROM write 
      banksel  EEADR   ;bank 2 
      movfw  DATA_EE_ADDR  ;load write address to EEPROM address pointer 
      movwf  EEADR 
      movfw  DATA_EE_DATA  ;load write data to EEPROM data buffer 
      movwf  EEDATA 
      banksel  EECON1   ;bank 3 
      bsf   EECON1,WREN   ;enable EEPROM write 
      movlw  0x55 ;unlock codes 
      movwf  EECON2 
      movlw  0xAA 
      movwf  EECON2 
      bsf   EECON1,WR  ;enable EEPROM write 
      btfsc  EECON1,WR  ;wait here until write completes 
      goto  $-1 
      bcf   EECON1,WREN  ;write complete, disable write mode 
      banksel  0 ;bank 0 
      movlw  0 ;are interrupts being used? 
      xorwf  INTCON,W 
      btfss  STATUS,Z 
      bsf  INTCON,GIE  ;yes,enable interrupts 
      return 

맞습니까? EEProm_Read에 문제가 있습니다. 그것은 제대로 작동하지 않는 것 같습니다. EEADR 레지스터하지 뱅크 1에서 코드의 경우와 같이 메모리 뱅크 0에 있고 때문에

답변

0

데이터 시트 정보에 따라 EEPROM 읽기 코드가 잘못입니다 :

올바른 코드는 다음과 같습니다

BCF STATUS, RP0 ; Bank 0 
MOVLW DATA_EE_ADDR 
MOVWF EEADR   ; Address to read 
BSF STATUS, RP0 ; Bank 1 
BSF EECON1, RD  ; EE Read 
BCF STATUS, RP0 ; Bank 0 
MOVF EEDATA, W  ; W = EEDATA