Перейти к содержанию

Некорректная работа функции eeprom_update_block


-=FISHER=-

Рекомендуемые сообщения

Приветствую всех!

Столкнулся сейчас с такой необычной штукой, функция eeprom_update_block из стандартной библиотеки eeprom.h (использую Atmel Studio) всегда записывает в первый байт число 255, на какое бы значение я его не менял, всегда именно 255. Чтобы обойти этот "глюк" пришлось добавить в структуру первый пустой байт-костыль, в который бы эта функция писала все что ей вздумается, и все стало ОК. Начиная со второго байта значения обновляются четко.

Может быть кто-то сталкивался с подобным поведением? Или я что-то делаю не так?

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

А что за еепром ? Встроенный в МК ? Если да , то какой мк? 

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

вобще-то в еепром атмега изначально  ff (это и есть 255) записано . тоесть скорее всего вы либо незаписали ничего либо напутали с адресами. 

Ссылка на комментарий
Поделиться на другие сайты

Особенности хранения литиевых аккумуляторов и батареек

Потеря емкости аккумулятора напрямую зависит от условий хранения и эксплуатации. При неправильном хранении даже самый лучший литиевый источник тока с превосходными характеристиками может не оправдать ожиданий. Технология, основанная на рекомендациях таких известных производителей литиевых источников тока, как компании FANSO и EVE Energy, поможет организовать правильный процесс хранения батареек и аккумуляторов. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

5 часов назад, artos5 сказал:

А что за еепром ?

 

5 часов назад, Bass85 сказал:

тоесть скорее всего вы либо незаписали ничего либо напутали с адресами.

Atmega8, да конечно встроенный в МК EEPROM. Просьба поверить на слово, я проверял, что перед командой записи блока данных в eeprom, первый байт 100% не равен 255, а там присутсвует определенное значение. Это доказывает тот факт, что добавив в блок данных первый байт-костыль со второго байта все началось читаться как надо.

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Никогда такого не было :) 

Давным-давно в AVR был баг, связанный с тем, что при определенном состоянии фьюзов и медленном нарастании напряжения питания, по случайному адресу EEPROM при сбросе писался мусор. Практический опыт показывал, что это был совсем не случайный адрес 0. Лечился этот баг установкой фьюза BODEN или подачей питания "резко", или удержанием принудительно RST в нуле до момента, пока напряжение не достигнет минимум 4В.

Однако, этот баг был устранен, чтобы не соврать, лет 7 назад. На всякий случай попробуйте проверить, как у вас стоят фьюзы и, если он не активирован, активируйте BODEN - поможет?

А вообще из моего личного опыта скажу, что всегда, когда вдруг "библиотечная функция работает не правильно" или "компилятор генерирует нерабочий код", оказывается, что виноват программист, а не компилятор и не библиотека :)

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

14 минут назад, snn_krs сказал:

а для С указатель не может быть равен 0

С чего бы это?

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, ARV сказал:

по случайному адресу EEPROM при сбросе писался мусор

сомневаюсь что это поправили в одном устройстве использую атмегу2560  так вот долго ломал голову что за нафиг слетают настройки в еепром и все притом произвольным образом. Может и месяц работать все ок а потом оп и пиши заново настройки.  Пока не выставил фюзы бутлевела и сразу все полечилось. 

26 минут назад, snn_krs сказал:

а для С указатель не может быть равен 0

объясните пожалуйста я такого не слышал весьма интересно. 

Ссылка на комментарий
Поделиться на другие сайты

Неправильно выразился. Если указатель не инициализирован, то у него значение 0 (NULL).

Можно проверить это записав блок не с 0 а с адреса например 10. Если по адресу 10 будет нормально записано значит так и есть.

Изменено пользователем snn_krs
Ссылка на комментарий
Поделиться на другие сайты

2 минуты назад, Bass85 сказал:

сомневаюсь что это поправили

Вроде как Atmel (еще не Microchip) заявляли, что поправили... Мопед не мой, я только объявление видел :)

Возможно, у вас МК еще старой ревизии.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

6 часов назад, -=FISHER=- сказал:

Atmega8, да конечно встроенный в МК EEPROM.

Никогда такого не было ! Но я и Атмел студию не использовал . Раз юзал, но без применения еепром.

Вы бы лучше показали код , а то это гадание на кофейной гуще...

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

13 часов назад, ARV сказал:

А вообще из моего личного опыта скажу, что всегда, когда вдруг "библиотечная функция работает не правильно" или "компилятор генерирует нерабочий код", оказывается, что виноват программист, а не компилятор и не библиотека :)

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

13 часов назад, ARV сказал:

На всякий случай попробуйте проверить, как у вас стоят фьюзы и, если он не активирован, активируйте BODEN - поможет?

Проверю при случае. Спасибо!

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

Только что, -=FISHER=- сказал:

Но как можно ошибиться вызывая библиотечную функцию?

Я не знаю, код вы не показали

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

1 минуту назад, ARV сказал:

код вы не показали

Сейчас посмотрел, я выставил только BODLEVEL на 2,7В, а вот BODEN у меня не включен... Попробую включить отпишусь.

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

Как уже написали, раньше была проблема с первым (нулевым байтом). Потом вроде как вылечили. Я этот момент не проверял, и с того времени никогда не использую первый байт. Также всегда выставляю указатель EEPROM в 0, после любого обращения к EEPROM. Для того, чтобы если и произойдет случайная запись, то в неиспользуемый байт.

Скрытый текст

;*************************************************************************
;============================ EEPROM =====================================
;*************************************************************************

;Так как возможна случайная запись в EEPROM в случае сбоя питания, то:
;1 - В микроконтроллере включить контроль снижения напряжения питания. 
;2 - Первый (0x00) байт никогда не используется. 
;3 - После ресета обнулить указатель адреса EEPROM. 
;Решения для увеличения ресурса EEPROM:
;4 - Перед записью считывается байт, предназначенный для записи,
;проверяется на равенство с записываемым, если байты равны, то переход
;к записи следующего байта. 
;5 - В конце работы с EEPROM обнулить указатель адреса. 

#if (EEPROM==YES)

.macro Read_EEPROM
	ldix	@0 ; Указатель адреса EEPROM.
	ldiy	@1 ; Указатель адреса SRAM.
	ldi		r17,@2
	rcall	_Read_EEPROM
.endmacro

_Read_EEPROM:
	sbic	EECR,EEWE
	rjmp	_Read_EEPROM
.ifdef EEARH
	out		EEARH,XH
.endif
	out		EEARL,XL
	sbi		EECR,EERE
	sbi		EECR,EERE
	in		EEDREG,EEDR
	st		Y+,EEDREG
	adiw	XL,1
	dec		r17
	brne	_Read_EEPROM
_Read_EEPROM_0:
	sbic	EECR,EEWE
	rjmp	_Read_EEPROM_0
.ifdef EEARH
	out		EEARH,RCLR
.endif
	out		EEARL,RCLR
	ret

EERead:
	sbic	EECR,EEWE
	rjmp	EERead
.ifdef EEARH
	out		EEARH,XH
.endif
	out		EEARL,XL
	sbi		EECR,EERE
	sbi		EECR,EERE
	in		EEDREG,EEDR
EERead_1:
	sbic	EECR,EEWE
	rjmp	EERead_1
.ifdef EEARH
	out		EEARH,RCLR
.endif
	out		EEARL,RCLR
	ret

EEWrite:
	sbic	EECR,EEWE
	rjmp	EEWrite
.ifdef EEARH
	out		EEARH,XH
.endif
	out		EEARL,XL
	out		EEDR,EEDREG
	sbi		EECR,EEMWE
	sbi		EECR,EEWE
EEWrite_1:
	sbic	EECR,EEWE
	rjmp	EEWrite_1
.ifdef EEARH
	out		EEARH,RCLR
.endif
	out		EEARL,RCLR
	ret

.macro Write_EEPROM
	ldiy	@0 ; Указатель адреса SRAM.
	ldix	@1 ; Указатель адреса EEPROM.
	ldi		r17,@2
	rcall	_Write_EEPROM
.endmacro

_Write_EEPROM:
	sbic	EECR,EEWE
	rjmp	_Write_EEPROM
.ifdef EEARH
	out		EEARH,XH
.endif
	out		EEARL,XL
	ld		EEDREG,Y+
	out		EEDR,EEDREG
	sbi		EECR,EEMWE
	sbi		EECR,EEWE
	adiw	XL,1
	dec		r17
	brne	_Write_EEPROM
_Write_EEPROM_0:
	sbic	EECR,EEWE
	rjmp	_Write_EEPROM_0
.ifdef EEARH
	out		EEARH,RCLR
.endif
	out		EEARL,RCLR
	ret

.macro	Clear_EEPROM
	ldx		@0
	ldy		@1
	rcall	_Clear_EEPROM
.endmacro

_Clear_EEPROM:
	sbic	EECR,EEWE
	rjmp	_Clear_EEPROM
.ifdef EEARH
	out		EEARH,XH
.endif
	out		EEARL,XL
	out		EEDR,RCLR
	sbi		EECR,EEMWE
	sbi		EECR,EEWE
	adiw	XL,1
	sbiw	YL,1
	brne	_Clear_EEPROM
_Clear_EEPROM_0:
	sbic	EECR,EEWE
	rjmp	_Clear_EEPROM_0
.ifdef EEARH
	out		EEARH,RCLR
.endif
	out		EEARL,RCLR
	ret

#endif
;*************************************************************************

 

Скрытый текст

            ptr_1++;
            ptr_2++;
         }

         volatile u08 a = ee_empty_val;

         break;
      }
   }
}

 

 

Изменено пользователем demiurg1978
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...