Цитата(snek @ May 18 2007, 16:29)

В документации на микроконтроллер PIC16f877 описаны операции чтения\записи во Flash память программ. Делаю все по приведенным алгоритмам, но в результате чтения получаю лишь нули. Подскажите может есть какие проблемы связанные с записью\чтение Flash памяти в данном контроллере или может есть какие "заковырки" по этому поводу.
Вот подпрограммы из программы, работающей на PIC16F876 (с 877 полностью одинаков).
Код
;============================================================================
; подпрограмма чтения байта данных из EEPROM
;----------------------------------------------------------------------------
; адрес ячейки берется из EE_adr, результат чтения - в W
;----------------------------------------------------------------------------
ReadEE: bcf STATUS,RP0 ;|
bcf STATUS,RP1 ;|выбор банка 0
movf EE_adr,W ; копируем значение нужного адреса в W
bcf STATUS,RP0 ;|
bsf STATUS,RP1 ;|выбор банка 2
movwf EEADR ; указание требуемого адреса ячейки EEPROM
bsf STATUS,RP0 ;|выбор банка 3
bsf STATUS,RP1 ;|
bcf EECON1,EEPGD ;выбрать EEPROM память
bsf EECON1,RD ;инициализировать чтение
bcf STATUS,RP0 ;|
bsf STATUS,RP1 ;|выбор банка 2
movf EEDATA,W ;забрать прочитанный байт
bcf STATUS,RP0 ;|
bcf STATUS,RP1 ;| выбрать банк 0
return
;============================================================================
; подпрограмма записи байта данных в EEPROM
;----------------------------------------------------------------------------
; адрес ячейки берется из EE_adr, байт для записи - в EE_data
;----------------------------------------------------------------------------
WriteEE: bsf STATUS,RP0 ;|
bsf STATUS,RP1 ;|выбор банка 3
btfsc EECON1,WR ; |проверить, что завершены
goto $-1 ; |предыдущие операции записи
bcf STATUS,RP0 ;|
bcf STATUS,RP1 ;|выбрать банк 0
movf EE_adr,W ;
bcf STATUS,RP0 ;|выбрать банк 2
bsf STATUS,RP1 ;|
movwf EEADR ;пересылка адреса байта
bcf STATUS,RP0 ;|
bcf STATUS,RP1 ;|выбрать банк 0
movf EE_data,W ;
bcf STATUS,RP0 ;|выбрать банк 2
bsf STATUS,RP1 ;|
movwf EEDATA ;пересылка собственно байта
bsf STATUS,RP0 ;|
bsf STATUS,RP1 ;|выбрать банк 3
bcf EECON1,EEPGD ;выбрать EEPROM память данных
bsf EECON1,WREN;разрешить операции записи в EEPROM
bcf INTCON,GIE ;запретить прерывания на время записи
movlw 0x55 ;|
movwf EECON2 ;|записать 55h в регистр EECON2
movlw 0xAA ;|
movwf EECON2 ;|записать AAh в регистр EECON2
bsf EECON1,WR ;инициализировать запись
bsf INTCON,GIE ;разрешить прерывания
bcf EECON1,WREN;запретить запись в EEPROM память данных
bcf STATUS,RP0 ;|
bcf STATUS,RP1 ;| выбрать банк 0
return