реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> ограничение eeprom
стас
сообщение Jul 25 2011, 10:28
Сообщение #1





Группа: Участник
Сообщений: 13
Регистрация: 25-07-11
Пользователь №: 66 399



всем привет! какое-то время назад в силу нескольких обстоятельств решил постичь программирование pic-ов,но пока только просто читаю книжки и никогда ничего не программировал,
начал с Корабельникова, и пока особых неясностей нет, но возможно немного заглядывая вперёд, хочу задать несколько вопросов по EEPROM, просто именно об этом нигде не пишут а интересно так что даже засыпать стал плохо; насколько я понял циклов обращений к этой памяти хоть и вроде много но если это делать из программы, то этот ресурс очень быстро закончится, так как от начала до конца программа пробегает за какие-то микросекунды.Вот взять к примеру автосигнализацию, допустим мы установили какие-то новые настройки в режиме так называемого пользовательского программирования, я как понимаю именно эти настройки хранятся в EEPROM, поскольку энергонезависимы, но это значит в тексте программы присутствует постоянное обращение к этим значениям, почему же тогда EEPROM не выходит из строя?

Ещё Корабельников пишет что может сделать ограничение на количество включений контроллера, например - 3, я понимаю что он каким-то образом привязывается к событию включения, записывает в EEPROM - 3, а потом при каждом включении отнимается единица, а затем при нуле программа зацикливается навсегда и не продолжается, - и вот тут вопрос вот в чём: как так можно отнять единицу всего один раз если программа крутится по кругу постоянно(она же всегда будет отнимать)?-единственное что приходит мне в голову так это в конце программы вместо end ставить безусловный переход, например на 5-ю строчку программы, но разве так можно?

И ещё вопрос- можно ли программно ввести ограничение на работу контроллера на один год, а восстановить, например, вводом пароля, если да то на каких пиках так реально сделать и какова общая логика выполнени такой задачи?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jul 25 2011, 12:13
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(стас @ Jul 25 2011, 14:28) *
циклов обращений к этой памяти хоть и вроде много но если это делать из программы, то этот ресурс очень быстро закончится
Чтение EEPROM ресурс не уменьшает. Ячейки деградируются при записи/стирании.

Цитата(стас @ Jul 25 2011, 14:28) *
как так можно отнять единицу всего один раз если программа крутится по кругу постоянно(она же всегда будет отнимать)?
Значение в EEPROM можно записать при программировании ("заливке" программы). При старте по включению питания (в самом начале программы) считываем ячейку, и, если значение равно нулю, то программу не выполняем ("крутимся" в бесконечном цикле), в противном случае: вычитаем единицу и записываем новое значение в EEPROM

Цитата(стас @ Jul 25 2011, 14:28) *
можно ли программно ввести ограничение на работу контроллера на один год, а восстановить, например, вводом пароля, если да то на каких пиках так реально сделать и какова общая логика выполнени такой задачи?
Можно, но устройство должно иметь собственный энергонезависимый календарь или получать текующую дату из некоего доверительного источника.

Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 25 2011, 12:31
Сообщение #3


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(стас @ Jul 25 2011, 13:28) *
как так можно отнять единицу всего один раз если программа крутится по кругу постоянно(она же всегда будет отнимать

До того, как крутиться по кругу (называется superloop), программа со старта выполняет некую последовательность команд однократно (инициализация). Порты настроить, таймеры, прерывания и т.п. Вот в начале программы и можно отнять идиницу и записать в EEPROM.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jul 25 2011, 12:56
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(Палыч @ Jul 25 2011, 16:13) *
Можно, но устройство должно иметь собственный энергонезависимый календарь или получать текующую дату из некоего доверительного источника.

А может проще из 0x80520 = 525600 вычитать каждую минуту . Вот год и пролетит. 3 ячейки памяти в той же EEPROM, даже если питание "отрубят", то при любом вкл. пока не досчитает до 0 ( zero) ничего не произойдёт. Погрешность +1 минут.


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
стас
сообщение Jul 25 2011, 14:10
Сообщение #5





Группа: Участник
Сообщений: 13
Регистрация: 25-07-11
Пользователь №: 66 399



спасибо всем, теперь кое-что стало ясно, получается считывать из eeprom можно сколь угодно раз, а насчёт того что каждую минуту отнимать- вроде тоже многовато получается, но сама идея отличная, в конце концов можно и каждый час наверное;
а вот насчёт зоны однократного прохождения программы- такой информации в книжках нигде не читал, везде начинается с нулевого адреса, и после end на следующих витках к нему же и приходит, как же реализовать такой однократный проход? в голову только приходит то что я уже писал, ставить в вместо end безусловный переход не на самое начало(например на 5-ю строку), тогда по логике, до пятой строки программа пройдёт только один раз, но можно ли так делать и чем это грозит?

Сообщение отредактировал стас - Jul 25 2011, 14:11
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jul 25 2011, 14:27
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(стас @ Jul 25 2011, 18:10) *
...начинается с нулевого адреса, и после end на следующих витках к нему же и приходит...
Ну, Вы, собственно, интуитивно правильно поняли типичную программу для микроконтроллера:
Код
start: сюда программа попадает с адреса ноль
     выполняется инициализация устройств (портов, таймеров и др.)
loop:
     этот кусок кода повторяется в бесконечном цикле (может быть и пустым, если все действия выполняеются по прерываниям от устройств)
переход на метку loop
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jul 25 2011, 14:35
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(стас @ Jul 25 2011, 18:10) *
спасибо всем, теперь кое-что стало ясно, получается считывать из eeprom можно сколь угодно раз, а насчёт того что каждую минуту отнимать- вроде тоже многовато получается, но сама идея отличная, в конце концов можно и каждый час наверное;


Конечно можно. Только не много подумав , что со мной случается, я понял , что погрешность ( в случае часа ) может составлять от + 1 час до несколько веков. Если какой нить идиот будет постоянно дёргать питание системы. Но зато какое удивление это устройство вызовет у пра-пра-пра ....... внуков. Столько веков прошло,а воно взяло и заработало.

Цитата(стас @ Jul 25 2011, 18:10) *
а вот насчёт зоны однократного прохождения программы- такой информации в книжках нигде не читал, везде начинается с нулевого адреса, и после end на следующих витках к нему же и приходит, как же реализовать такой однократный проход?

Вам же написали как это делается
Цитата
Палыч Значение в EEPROM можно записать при программировании ("заливке" программы). При старте по включению питания (в самом начале программы) считываем ячейку, и, если значение равно нулю, то программу не выполняем ("крутимся" в бесконечном цикле), в противном случае: вычитаем единицу и записываем новое значение в EEPROM

и
Цитата
ViKo До того, как крутиться по кругу (называется superloop), программа со старта выполняет некую последовательность команд однократно (инициализация). Порты настроить, таймеры, прерывания и т.п. Вот в начале программы и можно отнять идиницу и записать в EEPROM
.

Цитата
а насчёт того что каждую минуту отнимать- вроде тоже многовато получается....


Возьмите внешнюю EEPROM типа 24СХХ у них 1 миллион циклов записи . Правда придётся принять меры по защите информации в EEPROM


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
стас
сообщение Jul 25 2011, 15:56
Сообщение #8





Группа: Участник
Сообщений: 13
Регистрация: 25-07-11
Пользователь №: 66 399



Цитата(ILYAUL @ Jul 25 2011, 18:35) *
Вам же написали как это делается


может я как-то не так понимаю, но по такой логике если в начале программы отнимать единицу от ранее записанного(я знаю что можно загрузить константы директивами) и результат снова помещать в eeprom, то уже через пару милисекунд (в зависимости от длины кода и изначально записанного числа) программа просто перестанет работать- поотнимает 3 раза в каждом витке и остановится, --но ведь речь шла о такой остановке только при четвёртом включении питания
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jul 25 2011, 16:12
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(стас @ Jul 25 2011, 19:56) *
программа просто перестанет работать- поотнимает 3 раза в каждом витке и остановится
О каких "витках" речь? Программу пишите Вы! Как Вы её напишите - так она и будет выполнятся! Единственно что неизменно - программа стартует с определенного адреса после подачи напряжения на МК.
Go to the top of the page
 
+Quote Post
стас
сообщение Jul 25 2011, 21:49
Сообщение #10





Группа: Участник
Сообщений: 13
Регистрация: 25-07-11
Пользователь №: 66 399



Цитата(Палыч @ Jul 25 2011, 20:12) *
О каких "витках" речь? Программу пишите Вы! Как Вы её напишите - так она и будет выполнятся! Единственно что неизменно - программа стартует с определенного адреса после подачи напряжения на МК.


имею ввиду, что рано или поздно программа подойдёт к строке где написано- end, и насколько я понял она начнёт исполнятся снова с нулевого адреса, это я и называю следующим "витком", по крайней мере во всех книжках в примерах программ везде в конце кода этот end. Так что же получается, он просто чисто символическое значение имеет? что он вообще значит на самом деле?
иными словами:
START ----------
-----------
-----------
GOTO (не START)
END
программа может заканчиватся так? это допустимо?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jul 26 2011, 05:28
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(стас @ Jul 26 2011, 01:49) *
что он вообще значит на самом деле?
Что далее в этом файле ассемблерных инструкций больше нет.

Цитата(стас @ Jul 26 2011, 01:49) *
это допустимо?
Да. Более того, типичная программа для МК, примерно, так и выглядит (см.пост #6).
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 04:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.01446 секунд с 7
ELECTRONIX ©2004-2016