Форум по микроконтроллерам: ПП для работы с EEPROM - Форум по микроконтроллерам

Перейти к содержимому

  • 2 Страниц +
  • 1
  • 2
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

ПП для работы с EEPROM Чтение/запись

#1 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 891
  • Регистрация: 15 Февраль 11

Отправлено 20 Март 2011 - 22:24

Накатал я тут библиотечку для работы с EEPROM, вдруг кому пригодится.
И так, сам код:
ee_size 	equ    	0x7F	; Размер записываемых данных (адрес входного регистра)

;- EEPROM READ ----------;
ee_read_byte			; ПП чтения 1-ого байта
	bsf		STATUS,RP0
	movwf	EEADR
	bsf		EECON1,RD
	movf	EEDATA,W
	movwf	INDF
	bcf		STATUS,RP0
return;
ee_read					; ПП чтения нескольких байт
	call 	ee_read_byte
	bsf		STATUS,RP0
	incf	EEADR,F
	movf	EEADR,W
	incf	FSR,F
	bcf		STATUS,RP0
	decfsz 	ee_size
	goto 	ee_read
return;
;-------------------------;

;- EEPROM WRITE ----------;
ee_write_byte			; ПП записи 1-ого байта
	bsf		STATUS,RP0
	movwf	EEADR
	movf	INDF,W
	movwf	EEDATA      
	bsf		EECON1,WREN
	movlw	0x55
	movwf	EECON2
	movlw	0xAA
	movwf	EECON2
	bsf		EECON1,WR
	btfsc 	EECON1,WR
	goto 	$-1
	bcf		STATUS,RP0
return;
ee_write			; ПП записи нескольких байт
	call 	ee_write_byte
	bsf		STATUS,RP0
	incf	EEADR,F
	movf	EEADR,W
	incf	FSR,F
	bcf		STATUS,RP0
	decfsz 	ee_size
	goto 	ee_write
return;
;------------------------;


Для записи однобайтной переменной, необходимо в регистр FSR записать адрес переменной, в аккумулятор записать адрес eeprom и вызвать ПП ee_write_byte
; Сохраняем переменную var в eeprom по адресу 0x01
movlw 	var		; Адрес переменной 
movwf	FSR		; в FSR
movlw 	0x01		; Адрес eeprom
call 	ee_write_byte	; Вызываем ПП записи
;--------------------

Для записи многообайтной переменной (например массива), необходимо в регистр FSR записать начальный адрес переменной, в регистр ee_size записать размер переменной (кол-во сохраняемых байт), в аккумулятор - начальный адрес eeprom и вызвать ПП ee_write
; Сохраняем массив arr (8 байт) в eeprom, с адреса 0x10
movlw 	arr 		; Адрес переменной 
movwf	FSR		; в FSR
movlw 	.8		; Размер массива
movwf 	ee_size		; в size
movlw 	0x10		; Адрес eeprom
call 	ee_write	; Вызываем ПП записи
;--------------------

Для чтения 1-ого байта в переменную из еепром, необходимо в регистр FSR записать адрес переменной, в аккумулятор записать адрес eeprom и вызвать ПП ee_read_byte
; Читаем 1 байт в переменную var из eeprom по адресу 0x10
movlw 	var		; Адрес переменной 
movwf	FSR		; в FSR
movlw 	0x10		; Адрес eeprom
call 	ee_read_byte	; Вызываем ПП чтения
;--------------------

Для чтения в переменную нескольких байт из еепром, необходимо в регистр FSR записать начальный адрес переменной, в регистр ee_size записать размер переменной (кол-во читаемых байт), в аккумулятор записать начальный адрес eeprom и вызвать ПП ee_read
; Читаем 2 байта в переменную var из еепром по адресу 0x10
movlw 	var		; Адрес переменной 
movwf	FSR		; в FSR
movlw 	.2		; Размер переменной
movwf 	ee_size		; в size
movlw 	0x10		; Адрес eeprom
call 	ee_read		; Вызываем ПП чтения
;--------------------


В общем, как то так...

Проект с примером Прикрепленный файл  eeprom.rar (16,84К)
Количество загрузок:: 1986
Приятного Вам программирования !
Не говорите что мне делать, и я не скажу куда Вам идти !
0

#2 Пользователь офлайн   MAZ 

  • Консерватор - до мозга костей и суставов
  • PipPipPipPip
  • Группа: SuperMod
  • Сообщений: 1 391
  • Регистрация: 15 Февраль 11
  • ГородРоссия

Отправлено 20 Март 2011 - 22:41

нормальный вариант. :rolleyes: Можно на сайт в сборник подпрограмм. Для начинающих понятно. Не портянки листать с благоверным ужасом. Я тоже свой вариант добавлю без косвенной
Если бы Бог не был консерватором, вместо десяти заповедей мы имели бы десять предложений
0

#3 Пользователь офлайн   MAZ 

  • Консерватор - до мозга костей и суставов
  • PipPipPipPip
  • Группа: SuperMod
  • Сообщений: 1 391
  • Регистрация: 15 Февраль 11
  • ГородРоссия

Отправлено 21 Март 2011 - 09:22

вопрос, если никогда не запишется

btfsc EECON1,WR
goto $-1

программа зависнет?
Если бы Бог не был консерватором, вместо десяти заповедей мы имели бы десять предложений
0

#4 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 891
  • Регистрация: 15 Февраль 11

Отправлено 21 Март 2011 - 09:44

Цитата

если никогда не запишется
А такое может быть ? :) Цикл записи в любом случае закончится, даже если данные не запишутся (запишутся неправильно), тогда и WR сбросится.
Не говорите что мне делать, и я не скажу куда Вам идти !
0

#5 Пользователь офлайн   MAZ 

  • Консерватор - до мозга костей и суставов
  • PipPipPipPip
  • Группа: SuperMod
  • Сообщений: 1 391
  • Регистрация: 15 Февраль 11
  • ГородРоссия

Отправлено 23 Март 2011 - 09:47

Т.е. записано, не записано, флагу все равно? Ну тогда рекомендуют делать проверку записи. А это опять какая то команда ветвления. Если запись не верна, и так несколько циклов, что делать? И зачем тогда проверку делать.
Если запись верна, то понятно.
Если не верна постоянно, что делать?
Если бы Бог не был консерватором, вместо десяти заповедей мы имели бы десять предложений
0

#6 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 891
  • Регистрация: 15 Февраль 11

Отправлено 23 Март 2011 - 15:38

Проверять верна запись или нет, это уже дело программиста, пишушего программу. Он после записи спокойно может прочитать данные и сравнить. И что делать если они не совпали это тоже его дело.
Не говорите что мне делать, и я не скажу куда Вам идти !
0

#7 Пользователь офлайн   MAZ 

  • Консерватор - до мозга костей и суставов
  • PipPipPipPip
  • Группа: SuperMod
  • Сообщений: 1 391
  • Регистрация: 15 Февраль 11
  • ГородРоссия

Отправлено 23 Март 2011 - 16:23

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

#8 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 891
  • Регистрация: 15 Февраль 11

Отправлено 23 Март 2011 - 17:43

MAZ, если честно, я Вас не понимаю. Какой глюк, где ? :rolleyes:
И про какую проверку Вы говорите ? :rolleyes:
Не говорите что мне делать, и я не скажу куда Вам идти !
0

#9 Пользователь офлайн   MAZ 

  • Консерватор - до мозга костей и суставов
  • PipPipPipPip
  • Группа: SuperMod
  • Сообщений: 1 391
  • Регистрация: 15 Февраль 11
  • ГородРоссия

Отправлено 23 Март 2011 - 19:31

Просмотр сообщенияAlex (23 Март 2011 - 17:43) писал:

MAZ, если честно, я Вас не понимаю. Какой глюк, где ? :rolleyes:
И про какую проверку Вы говорите ? :rolleyes:


Да я не про Вашу программу. Захотелось по философствовать. :D
Просто часто задумывался. А что должна основная программа делать если в EEPROM постоянно число с ошибкой при проверке записи. Постоянно проверять, ожидая правильного результата - это и будет вечный глюк. Или если ошибка записи, после нескольких попыток не устранилась, что должна сделать программа? доложить об этом и все выключить или продолжать работать. Выбор у программиста небольшой
Если бы Бог не был консерватором, вместо десяти заповедей мы имели бы десять предложений
0

#10 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 891
  • Регистрация: 15 Февраль 11

Отправлено 23 Март 2011 - 21:31

Цитата

Захотелось по философствовать. :D
Понятно. :)

Цитата

А что должна основная программа делать если в EEPROM постоянно число с ошибкой при проверке записи.
Опять же, зависит от устройства и важности сохраняемых данных. Можно попробовать записать в другое место (другие ячейки еепром), либо каким-нибудь образом оповестить пользователя об ошибке и прекратить работу устройства (опять же, если необходимо).
В любом случае если данные достаточно важны, необходимо дублировать их запись, а возможно и не раз.

Сообщение отредактировал Alex: 23 Март 2011 - 21:34

Не говорите что мне делать, и я не скажу куда Вам идти !
0

#11 Пользователь офлайн   wws63 

  • Завсегдатай
  • PipPipPip
  • Группа: SuperMod
  • Сообщений: 261
  • Регистрация: 15 Февраль 11

Отправлено 24 Март 2011 - 11:41

Или на крайний случай, если долго не может записать, включить сторожевой таймер
0

#12 Пользователь офлайн   MAZ 

  • Консерватор - до мозга костей и суставов
  • PipPipPipPip
  • Группа: SuperMod
  • Сообщений: 1 391
  • Регистрация: 15 Февраль 11
  • ГородРоссия

Отправлено 24 Март 2011 - 12:30

Просмотр сообщенияwws63 (24 Март 2011 - 11:41) писал:

Или на крайний случай, если долго не может записать, включить сторожевой таймер

Ну и что дальше, опять глюк. Сбросит, опять запись и опять сброс.
Если бы Бог не был консерватором, вместо десяти заповедей мы имели бы десять предложений
0

#13 Пользователь офлайн   Sergey Roslik 

  • Завсегдатай
  • PipPipPip
  • Группа: SuperMod
  • Сообщений: 390
  • Регистрация: 15 Февраль 11

Отправлено 24 Март 2011 - 17:59

Просмотр сообщенияMAZ (24 Март 2011 - 12:30) писал:

Просмотр сообщенияwws63 (24 Март 2011 - 11:41) писал:

Или на крайний случай, если долго не может записать, включить сторожевой таймер

Ну и что дальше, опять глюк. Сбросит, опять запись и опять сброс.

А в начале исполнения программы проверяем , был сброс по сторожевому таймеру или нет.
Далее ищем причину и исправляем.
0

#14 Пользователь офлайн   MAZ 

  • Консерватор - до мозга костей и суставов
  • PipPipPipPip
  • Группа: SuperMod
  • Сообщений: 1 391
  • Регистрация: 15 Февраль 11
  • ГородРоссия

Отправлено 24 Март 2011 - 18:25

Чего исправляем? Почему мк не записывает технически в EEPROM? Я же имею ввиду отказ процедуры записи в какой то момент. Программа работоспособна, флаги работают, а проверка не подтверждает факт записи. Кто скажет, что это перестраховка, возможно. Но судя по многим рекомендациям, надо предохраняться. :D
Все отрубать и кричать, что у нас трагическая ошибка. :D И надо менять мк.
Если бы Бог не был консерватором, вместо десяти заповедей мы имели бы десять предложений
0

#15 Пользователь офлайн   Алексей 

  • Завсегдатай
  • PipPipPip
  • Группа: SuperMod
  • Сообщений: 243
  • Регистрация: 15 Февраль 11

Отправлено 24 Март 2011 - 19:42

Просмотр сообщенияMAZ (24 Март 2011 - 18:25) писал:

Чего исправляем? Почему мк не записывает технически в EEPROM? Я же имею ввиду отказ процедуры записи в какой то момент. Программа работоспособна, флаги работают, а проверка не подтверждает факт записи. Кто скажет, что это перестраховка, возможно. Но судя по многим рекомендациям, надо предохраняться. :D
Все отрубать и кричать, что у нас трагическая ошибка. :D И надо менять мк.

В этом случае можно просто ограничить количество попыток записи :P ... А там решить, может подумать и автоматически сменить адрес ячейки EEPROM на свободную... Но до этого дело не должно дойти, если конечно не записывать каждую секунду :D
Не ищи лучшее, а ищи свое. Ведь лучшее не всегда станет твоим, зато твое - всегда лучшее...
0

#16 Пользователь офлайн   Sergey Roslik 

  • Завсегдатай
  • PipPipPip
  • Группа: SuperMod
  • Сообщений: 390
  • Регистрация: 15 Февраль 11

Отправлено 24 Март 2011 - 22:41

Просмотр сообщенияMAZ (24 Март 2011 - 18:25) писал:

Чего исправляем? Почему мк не записывает технически в EEPROM? Я же имею ввиду отказ процедуры записи в какой то момент. Программа работоспособна, флаги работают, а проверка не подтверждает факт записи. Кто скажет, что это перестраховка, возможно. Но судя по многим рекомендациям, надо предохраняться. :D
Все отрубать и кричать, что у нас трагическая ошибка. :D И надо менять мк.


Ну тогда использовать всевозможные способы на определение, записалось или нет и применять алгоритм защиты, который придумает программист.
Всевозможные сигналы, обходы записи, переход на упрощённый вариант работы (аварийный) ну и тд. Всё от фантазии зависит.
0

#17 Пользователь офлайн   Al_Kuz 

  • Знаток
  • PipPip
  • Группа: Пользователи
  • Сообщений: 132
  • Регистрация: 20 Февраль 11
  • ГородКадников Вологодская обл

Отправлено 25 Март 2011 - 22:37

Подпрограмма мне понравилась, спасибо! Однако, как я понял, она годится в таком виде для 64 и 628,688 и др Пиков. Для F88, 873 и др., нужные регистры находятся в других банках (2,3). И еще, в ДШ прописано, что во время записи отключают прерывания. Это необходимо или необязательно?
0

#18 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 891
  • Регистрация: 15 Февраль 11

Отправлено 27 Март 2011 - 18:06

Цитата

И еще, в ДШ прописано, что во время записи отключают прерывания. Это необходимо или необязательно?
В ДШ написано для чего это необходимо.
Если Вы используете в своей программе прерывания, то их нужно отключать, затем восстаналивать.
Не говорите что мне делать, и я не скажу куда Вам идти !
0

#19 Пользователь офлайн   stashuk 

  • Новичок
  • Pip
  • Группа: Пользователи
  • Сообщений: 45
  • Регистрация: 14 Ноябрь 12

Отправлено 05 Февраль 2013 - 12:46

Запись при прошивке PIC18F252:
            org         0xF00000     ; Обращение к EEPROM
            DE          0x00,0x00    ; 
            DE          0x00,0x00    ; 
            DE          0x00,0x00    ; 
            DE          0x00,0x00    ;  
            DE          0x00,0x00    ; 
            DE          0x00,0x00    ; 
            DE          0xC0,0xA8    ; 
            DE          0x32,0x02    ;
            DE          0x02,0x90    ;
            DE          0x4C,0x09    ;
            DE          0x00,0x01    ;
            DE          0x01         ;

В окне EEPROM программатора "icprog" вижу через один байт. И при считывании во время выполнения похоже тоже, поскольку вылетает далеко на байты "FF", хотя симуляция правильная. Считываю циклом, кодом как в даташите. Что не так?
0

#20 Пользователь офлайн   stashuk 

  • Новичок
  • Pip
  • Группа: Пользователи
  • Сообщений: 45
  • Регистрация: 14 Ноябрь 12

Отправлено 05 Февраль 2013 - 17:57

Вопрос снят - оказалось PIC18 не терпит перечислений через "," как в PIC16. Если вводить байты отдельными строками, все работает.
0

Поделиться темой:


  • 2 Страниц +
  • 1
  • 2
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей