[an error occurred while processing this directive]
Естественно. т.к. после WrtMem у вас "подцеплен" банк 1 (!!!)...
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
миниатюрный аудио-видеорекордер mAVR

Отправлено Builder++ 05 июля 2002 г. 14:56
В ответ на: Не пишется EEPROM ! отправлено 12345 05 июля 2002 г. 12:11


;Естественно, сначала "пишем" байт.

WrtMem: ;запись
;Input: mem - байт для записи в EEPROM

banksel EEDATA ;банк 0 (гораздо проще!!!)
clrf INTCON ;запрет прерываний
movlw 0x00 ;Адрес = 0
movwf EEADR ;
movf mem,w ;Байт для записи
movwf EEDATA ;

banksel EECON1 ;банк 1
bsf EECON1,WREN ;разрешаем писАть в EEPROM
bcf EECON1,EEIF ;если вдруг захочется юзать прерывание.
movlw 0x55 ;инициирующая последовательность.
movwf EECON2 ;
movlw 0xAA ;
movwf EECON2 ;
bsf EECON1,WR ;запускаем запись.


;Таймер на 20 мс (с запасом в 2 раза). Грубо расчитано для тактовой частоты в 4МГц
;для других значений тактовой частоты следует пересчитать.

clrf TempTimer ;5 циклов * 256 раз = 1280 циклов
movlw d'255' ;1280 циклов * 16 раз = 20480 циклов (при Fosc=4MHz = ~20ms)
movwf TempTimer1

LoopWaitEEWR:
btfss EECON1,WR ;
goto EEWRComplete ;+2
decfsz TempTimer ;+1=3
goto LoopWaitEEWR ;+2=5
decfsz TempTimer1
goto LoopWaitEEWR

EEWRComplete:
bсf EECON1,WREN ;запрещаем писАть в EEPROM
banksel EEDATA ;bank 0
;Именно про это вы и забыли, в результате, чтение
;начиналось в Банке 1.
;желателен и контроль бита EECON1,WRERR на отсутствие ошибки.

;Теперь разберемся с чтением...

RdMem ;чтение
banksel EEADR ;это как раз то, про что вы забыли :((
bсf EECON1,WREN ;запрещаем писАть в EEPROM (на всякий случай, не повредит)
movlw 0x00 ;Адрес чтения
movwf EEADR ;
banksel EECON1 ;bank 1
bsf EECON1,RD ;запускаем чтение
banksel EEDATA ;bank 0
;результат чтения байта корректен уже в цикле, следующем за разрешением чтения...
movf EEDATA,w ;берём результат в Аккумулятор.
movwf mem ;кидаем его в требуемый регистр

Вроде ничего не забыл.
Написал сей код по памяти минут за 30... На симуляторе не откатывал, пару раз пробежал глазами - вроде всё корректно, хотя, где-нибудь возможны очипятки и просьба "ногами не пинать" :)

И ещё один совет...
Память данных в PIC16F84 как и в PIC16C84 подвержена к произвольной перезаписи.
В связи с этим настоятельно не рекомендую храниить в ней какие-либо данные, жизненно необходимые для вашей программы. Иначе, по прошествию некоторого времени вам получите "Эхо Событий" в виде необходимости "носиться" по сотне объектов и "заливать" прошивку в EEPROM.

Лушше использовать PIC16CE62x, они понадежнее, да и CodeProtect с них снять достаточно сложно ;)
Желаю Удачи.
Builder++

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru