Свежие обсуждения
Микроконтроллеры

Использование внутренего eeprom пика

1 2 3

Парни, я не ошибался, по поводу стороки while (i=25), не знаю откуда вкралась ошибка но исходный вариант, который в файле на форуме
while (i<=25)// цикл
Такой же и у меня дома Видимо при копировании пропадает значек.
А задача проста, до безобразия Имеем какое-то число, сейчас это 25 (для примера) включаем пик. Он начинает мыргать. Успел моргнуть 10раз его отключили, включили повторно он домыргивает свои 15 и останавливается. На данном этапе это работает. Но если его после того как он достчитал до 25 запустить по новой он опять работает. А не должен. Он как бы выработал свой ресурс уже в предыдущей раз. 25 это абстрактное чило нужно гораздо больше. Пока решаю задачу с упрощениями.
int8 i; // задаем начальное значение I

void main()
{
set_tris_d(0x00); //PORTD на вывод
i = read_eeprom (0x00);
if(i>25)
write_eeprom(0x00,0);
while (i=25) // цикл (ЗАМЕТИЛ ПРИ ПОВТОРНОЙ ПРАВКЕ СООБЩЕНИЯ НА ФОРУМЕ ЗНАЧЕК < ПРОПАДАЕТ, ВОТ ГДЕ КОСЯК И ГЛАВНОЕ ВОССТАНОВИТЬ НЕ МОГУ.
{
output_d(0x00); //светодиоды не горят
delay_ms(300);// задержка на секунду
output_d(0xff);//горят все светодиоды порта д, меняя значения от 0 до ff
//меняем горящие светодиоды
delay_ms(300);
i++; // увеличиваем значение
write_eeprom(0x00,i);
}
}
Вот что имею на данный момент. Тоже пробывал считать область еепром, после записи показывает все FF, но если тут же прочитать еепром, то вылазять все 00

 

Dad: ЗАМЕТИЛ ПРИ ПОВТОРНОЙ ПРАВКЕ СООБЩЕНИЯ НА ФОРУМЕ ЗНАЧЕК < ПРОПАДАЕТ, ВОТ ГДЕ КОСЯК И ГЛАВНОЕ ВОССТАНОВИТЬ НЕ МОГУ.

Есть такой косяк на форуме, значок "меньше" почему то заменяется на . Причём тег "pre" для кода не меняет дела. Можно ставить один пробел между значками "меньше" и "равно", тогда хотя бы значки не будут исчезать и при правке.

while (i< =25) // цикл

 

Dad: Пока решаю задачу с упрощениями.

Если предполагается сделать типа счётчика наработки на отказ, то алгоритм для задачи можно придумать такой: При каждом запуске программы в главной функции (main), считать значение переменной из eeprom, сравнить полученное значение с константой - временем наработки на отказ и, если ресурс не выработан, то инкременировать его и записать новое значение. Если есть совпадение, то сделать девайс нерабочим.

Получится, что запись в eeprom будет происходить один раз и каждый раз при включении устройства и нет необходимости вводить ещё один цикл while.

 

Dad: Но если его после того как он достчитал до 25 запустить по новой он опять работает. А не должен.

...

int8 i; // задаем начальное значение i

void main()
{
...
i = read_eeprom (0x00);
if(i>25)
write_eeprom(0x00,0);
while (i< =25) // цикл
{
...
i++; // увеличиваем значение
write_eeprom(0x00,i);
}
};

По логике работы этой программы получается, что неважно особо, изначально в eeprom 00 или FF, но когда i станет равным 25, то в eeprom окажется число 26 и при новом запуске в неё запишется ноль и после перезапуска всё начнётся сначала. И так постоянно, если i будет достигать своего конечного значения.

Попробуйте вместо while (i< =25) // цикл использовать while (i< 25) // цикл. Тогда должно получиться так, как задумали. Проверить не могу. И желательно вместо

if(i>25)
write_eeprom(0x00,0);

записать

if(i>25) {
write_eeprom(0x00,0);
}
т.е. с фигурными скобками.

 

Вчера не заметил, форум сожрал мой значок "меньше", хотя тег пре использовался.
Вариант проги рабочий, я проверял.

#include <16f877.h>

#FUSES RC,NOLVP,NOWDT,PUT,NOCPD,NOPROTECT,NOWRT
#use delay (clock=4000000)

int8 i=0; // задаем начальное значение I

void main()
{
i = read_eeprom (0x00);
output_d(0x00); //светодиоды не горят
set_tris_d(0x00); //PORTD на вывод

while(1)
{
while (i<25)// цикл 25 раз
{
output_d(0xff);//горят все светодиоды
delay_ms(300);// задержка на секунду
output_d(0x00); //светодиоды не горят
delay_ms(300);
i++; // увеличиваем значение
write_eeprom(0x00,i);
}
}
}/pre>

 

Умаялся редактировать, теперь хвост вылез...
Цикл повторится 25 раз (i от 0 до 24) и светодиоды не будут гореть

 

Dad, чтобы после достижения условного значения счетчика (в вашем примере = 25) МК повторно не запустился, запишите в какую-нибудь ячейку EEPROM флаг "конца работы".
Например так: четыре ячейки используем для хранения 32-битного значения счетчика, а в пятую пишем единицу, если цикл отработал. При запуске проверяем пятую ячейку и если она равна единице, то программа не стартует.

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

 

Да, это всё верно.
Интересно, портится конкретная ячейка еепром или всё разом? Даже если работать только с одной ячейкой всё время.

 

"Выжигается" одна ячейка, в которую происходит частая запись. Чтобы продлить жизнь EEPROM можно каждое новое значение писать в следующую ячейку, по достижении конца памяти снова начинать с адреса 0x00. Тогда память будет изнашиваться равномерно, что продлит срок службы в несколько раз. Но это лишь продление агонии Да и алгоритм значительно усложняется.

Кстати, 32-битное значение счетчика (именно это необходимо автору?) - это порядка 4 млрд. циклов записи. EEPROM расчитано на 100 тыс. Так что память гарантированно помрет прежде, чем счетчик автора достигнет нужного значения.

 

Мне в ремонте попадался телефон Русь. Ошибка еепром. Там в еепром вроде каждую секунду пишется что-то. И проблема оооочень частая на этих телефонах.
Интересно, как там происходит проверка еепрома. Запись, считывание, сравнение? Причём микросхема самая обычная стояла, не с повышенным количеством циклов записи. Преднамерено что-ли, чтоб в сервис народ шел.