2010-04-18 3 views
3

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

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

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

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

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

+0

Я очищаю EEPGD в предыдущем коде, который успешно читается из EEPROM и забыл сделать это снова здесь, но он все равно должен быть установлен на 0. На всякий случай я добавил, и он все еще не работает. Есть ли что-нибудь, что мне нужно установить в моих контрольных флагах или что-то в этом роде, которое я, возможно, пропустил, чтобы разрешить писать? – jcoder

+0

И да, я все еще участвую, и пока я еще не изучил прерывания, это и таймеры в моем списке. – jcoder

+0

Принял этот ответ, потому что он правильный и указывает на небольшую ошибку в моем коде. У меня есть это для работы, удалив ненужные высказывания. Кажется, что в середине последовательности программирования фактически прекращается ее работа – jcoder

1

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

Я действительно не был достаточно храбр, чтобы писать свои фото в сборке. Удачи!!