Запись в EEPROM на PIC - PullRequest
       37

Запись в EEPROM на PIC

3 голосов
/ 18 апреля 2010

Есть ли здесь программисты для микроконтроллеров PIC?

Я изучаю программирование микроконтроллеров PIC с использованием pickit2 и микросхемы 16F690, поставляемой с ним. Я сейчас работаю, пробуя различные возможности. Я могу успешно прочитать байт из EEPROM в коде, если я установлю EEPROM vaklue в MPLAB, но я не могу изменить значение, используя сам PIC. Просто ничего не происходит, и я не читаю измененное значение, я всегда получаю оригинал, который подразумевает, что запись не работает?

Это мой код для этого раздела, я что-то упустил? Я знаю, что делаю много ненужных банковских переключений, я добавил большинство из них, чтобы убедиться, что проблема была не в том банке.

        ; ------------------------------------------------------
        ; Now SET the EEPROM location ZERO to 0x08
        ; ------------------------------------------------------

        BANKSEL EEADR
        CLRF    EEADR           ; Set EE Address to zero

        BANKSEL EEDAT
        MOVLW   0x08            ; Store the value 0x08 in the EEPROM
        MOVWF   EEDAT

        BANKSEL EECON1
        BSF     EECON1, WREN    ; Enable writes to the EEPROM

        BANKSEL EECON2
        MOVLW   0x55            ; Do the thing we have to do so
        MOVWF   EECON2          ; that writes can work
        MOVLW   0xAA
        MOVWF   EECON2

        BANKSEL EECON1      
        BSF     EECON1, WR      ; And finally perform the write

WAIT
        BTFSC   EECON1, WR      ; Wait for write to finish
        GOTO    WAIT

        BANKSEL PORTC           ; Just to make sure we are on the right bank

Ответы [ 3 ]

3 голосов
/ 18 апреля 2010

На странице 122 таблицы 16F690 подробно описан правильный способ записи в EEPROM:

BANKSEL EEADR                   ;
MOVF    DATA_EE_ADDR, W;
MOVWF   EEADR          ;Data Memory Address to write
MOVF    DATA_EE_DATA, W;
MOVWF   EEDAT                   ;Data Memory Value to write
BANKSEL EECON1                  ;
BCF     EECON1, EEPGD ;Point to DATA memory
BSF     EECON1, WREN   ;Enable writes
BCF     INTCON, GIE             ;Disable INTs.
BTFSC   INTCON, GIE             ;SEE AN576
GOTO    $-2
; BEGIN REQUIRED SEQUENCE
MOVLW   55h            ;       
MOVWF   EECON2         ;Write 55h
MOVLW   AAh                     ;
MOVWF   EECON2                  ;Write AAh
BSF     EECON1, WR              ;Set WR bit to begin write
BSF     INTCON, GIE             ;Enable INTs.
SLEEP                  ;Wait for interrupt to signal write complete
; END REQUIRED SEQUENCE
BCF     EECON1, WREN   ;Disable writes
BANKSEL 0x00           ;Bank 0

Я заметил, что вам не хватает этой строки:

 BCF     EECON1, EEPGD ;Point to DATA memory

Если EEPGD всегда задан, то вы попытаетесь записать в память программы (она же перезаписывает память программы flash), которая всегда будет давать сбой, если только вы не позаботились о том, чтобы специально включить это.

Кроме того, насколько я могу судить по чтению вашего кода, все остальное выглядит хорошо. Это нормально, что вы опрашиваете EECON1.WR вместо установки прерывания. Это будет стоить вам больше энергии, чем перевести устройство в спящий режим, но, конечно, вам следует беспокоиться только об одной вещи за раз.

1 голос
/ 17 июля 2010

Если вы используете высокотехнологичный компилятор, запись в EEPROM так же проста, как #include, а затем в main, EEPROM_WRITE (0, 0x00); или действительно EEPROM_WRITE (место для записи, значение для записи в него);

На самом деле я не был достаточно смел, чтобы писать свои фотографии в сборке. Удачи !!

0 голосов
/ 20 июля 2018

Путь к компилятору xc8:

#include <xc.h>

.....
value = eeprom_read(address);
eeprom_write(address, data);
...