Запись в 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
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