Запись в EEPROM на PIC



Есть ли здесь программисты микроконтроллеров 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
685   3  

3 ответов:

На странице 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 всегда задано, то вы попытаетесь записать в память программы (aka перезаписать флэш-память программы), которая всегда должна завершаться неудачей, если вы не сделали все возможное, чтобы специально включить это.

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

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

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

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

#include <xc.h>

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

Comments

    Ничего не найдено.