|
Запись на EEPROM |
|
|
|
Aug 25 2008, 17:01
|
Участник

Группа: Новичок
Сообщений: 21
Регистрация: 25-08-08
Пользователь №: 39 811

|
Я совсем начинающий в программировании,нужна помочь спецов.Вот программа для 2-хразрядного семисегментного индикатора,цифры переключается кнопками + и - от 00 до 99,при отключении питания обнуляется,а нужно,чтобы на какой цифре остался,на такой и включался.Понимаю,что надо написать на eeprom,подскажите,пожалуйста,как это сделать,желательно попроще,ткнуть пальцем,как говориться,куда что. Код #include <mega16.h> #include <delay.h>
#define digit1 PORTD.6 #define digit2 PORTD.5 flash char digits[] = { 0b11000000, //0 0b11111001, //1 0b10100100, //2 0b10110000, //3 0b10011001, //4 0b10010010, //5 0b10000010, //6 0b11111000, //7 0b10000000, //8 0b10010000, //9 0b10111111, //- 0b11111111 //пусто }; char digit_out[2], cur_dig; char tik;
unsigned int indication; void recoding(void) { if (indication<100) { digit_out[0]=indication%10; indication=indication/10; digit_out[1]=indication%10; } } interrupt [TIM0_OVF] void timer0_ovf_isr(void) { switch (cur_dig){ case 0:{digit2=1;digit1=0;break;}; case 1:{digit1=1;digit2=0;break;}; } PORTA=digits[digit_out[cur_dig]]; cur_dig++; if (cur_dig==2) cur_dig=0; }
void main(void) {
// Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x01; #asm("sei")
while (1) if(!PIND.1){ delay_ms(100); tik++; indication=tik; if(indication>100) indication=100; recoding();
} if(!PIND.2){ delay_ms(100); tik--; indication=tik; if(indication<0) indication=0; recoding(); } } }
Сообщение отредактировал chajnik - Aug 25 2008, 17:05
|
|
|
|
|
 |
Ответов
|
Aug 25 2008, 18:01
|

Местный
  
Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530

|
Поставьте перед переменной Код unsigned int indication; квалификатор еепром, для код визиона это eeprom. Правда энергонезависимая ячейка имеет ограниченый ресурс + Вы добавите "тормоз" на милисекунд так до 20 , в период записи чтения переменной когда прерывания запрещены компилятором, будет ли потом ваше устройство правильно - Вам виднее,период переполнения нулевого таймера мне неизвестен. обычно работают спеременными скопироваными в оперативку. еепром переменную обновляют при исчезновении питания. можна также обявить переменную как неинициализируемую при старте программы МК.
Сообщение отредактировал sKWO - Aug 25 2008, 18:13
--------------------
нельзя недооценивать предсказуемость глупости
|
|
|
|
|
Aug 25 2008, 18:17
|

Знающий
   
Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065

|
Цитата(sKWO @ Aug 26 2008, 00:01)  Правда энергонезависимая ячейка имеет ограниченый ресурс. Так-то оно так, но... Давайте посчитаем ресурс. АТМЕЛ гарантирует 100000 циклов страния/записи. Предположим, что мы делаем одно нажатие на кнопку в секунду. Без перерывов на обед/сон/туалет, без выходных и отпусков. За час, мы сделаем 3600 нажатий, если, конечно, палец при этом не отвалится. За сутки мы с трудом нагребем 86400, т.е. почти ресурс подойдем к исчерпанию ресурса. В результате этого убойного теста, что мы имеем? 1. Инвалидность. Убитый в хлам палец. 2. Убитый денежный эквивалент, равный трем сменам. 3. А до гарантированного исчерпания ЕЕПРОМ, еще сра да сра. Кроме того. Названная цифра 100000 --это та цифра, за которую Атмел отвечает своим лицом. Реально же это может превышать раз в 10. Здесь где-то на форуме кто-то целый год мучал память. И что? -- Не убил!!! А теперь сравните это все со стоимостью микросхемы и оцените всю тяжесть написанию кода для экстренного сохранения для chajnik. Он не асс, как многие тут. Он -- начинающий. Так что самый лучший способ -- писать значение в ЕЕПРОМ сразу после нажатия. Быстро, дешево, результативно. А что еще требуется от "стартовой" конструкции?
Сообщение отредактировал zhevak - Aug 25 2008, 18:23
--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
|
|
|
|
|
Aug 25 2008, 20:34
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(zhevak @ Aug 25 2008, 21:17)  Кроме того. Названная цифра 100000 --это та цифра, за которую Атмел отвечает своим лицом. Реально же это может превышать раз в 10. Здесь где-то на форуме кто-то целый год мучал память. И что? -- Не убил!!! Да нет, как раз мучали подругому. Не целый год, а очень быстро и целенаправленно убивали ячейки постоянной записью в них. получилось в районе 107-115k записей. Т.е. на 5-10% сверх заявленных 100k можно расчитывать, а уж никак не в 10 раз. Цитата Так что самый лучший способ -- писать значение в ЕЕПРОМ сразу после нажатия. Быстро, дешево, результативно. С этим можно согласиться. Цитата Ну тогда остаётся посоветовать писать переменную в еепром не с нулевого адресса, а к примеру с десятого, тоже рекомендация атмел, а как это сделать по ссылке выше есть. Эта рекомедация уже устаревшая. Она относилась к AT90 серии.
|
|
|
|
|
Aug 25 2008, 22:03
|
Частый гость
 
Группа: Новичок
Сообщений: 83
Регистрация: 25-08-08
Пользователь №: 39 801

|
Цитата(defunct @ Aug 26 2008, 00:34)  Да нет, как раз мучали подругому. Не целый год, а очень быстро и целенаправленно убивали ячейки постоянной записью в них. получилось в районе 107-115k записей. Т.е. на 5-10% сверх заявленных 100k можно расчитывать, а уж никак не в 10 раз. Вы не правы. Насколько мне помнится, речь кажется шла о 5,5млн записей.
|
|
|
|
|
Aug 26 2008, 01:14
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(Боинг749 @ Aug 26 2008, 01:03)  Вы не правы. Насколько мне помнится, речь кажется шла о 5,5млн записей. Где?  В ДШ (если вы их читаете) есть цифра 100K перезаписей. Производители eeprom не настолько тупы, чтобы писать 100k там, где реально есть 5.5M. Проверить оч. легко: Код void test(void) { static volatile __eeprom char x; char cnt = 0; long cycle = 0;
do { x = ++cnt; cycle += 1; } while (x == cnt);
printf("eeprom resource is %d cycles\n", cycle); } За 10-20 минут ячейку заелозит и увидите реальное число.
|
|
|
|
|
Aug 26 2008, 19:51
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(defunct @ Aug 26 2008, 05:14)  Где?  В ДШ (если вы их читаете) есть цифра 100K перезаписей. Производители eeprom не настолько тупы, чтобы писать 100k там, где реально есть 5.5M. Проверить оч. легко: Код void test(void) { static volatile __eeprom char x; char cnt = 0; long cycle = 0;
do { x = ++cnt; cycle += 1; } while (x == cnt);
printf("eeprom resource is %d cycles\n", cycle); } За 10-20 минут ячейку заелозит и увидите реальное число. defunct не все так просто на самом деле..., 100000 это долговременная стабильность при НЕтепличных условиях(по температуре например) и при питании 2,7(1,8)V, то есть 100000 при любых условиях гарантированны... В какой-то момент я сам решил проверить работу своего хитрого алгоритма по сохранению данных в EEPROM, так вот у меня не хватило терпения его проверять..., в итоге пришлось на симуляторе прогнать все состояния... При 2-3 миллионах записей на AT90S2313 сбоев не было ни в одной ячейке, правда условия эксперимента были вполне тепличными. Так что миллионы записей - вполне реально, НО все рассчеты НУЖНО делать исходя из 100000...
|
|
|
|
|
Aug 26 2008, 20:31
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(defunct @ Aug 27 2008, 00:08)  Да причем тут хитрый алгоритм. Почти не при чем, просто я его пытался проверить в реальном железе запустив запись и потом считывание и проверку по циклу, но проверить его было не суждено..., ждать надоело... Цитата Давайте остановимся на безхитростном алгоритме - тупой счетчик, как в приведенном примере. на проверку понадобится всего 10-20 минут, максимум полчаса и одна ячейка eeprom'a любого AVR чипа. Примерно так в итоге и проверял, писал в ячейку счетчик а в соседнюю его побитовую инверсию, если при считывании ячейки оказывались битыми, переходил на след пару ячеек, при нажатии кнопки(тестил на STK500) в 4 старшие ячейки прописывал количество записей в еепром и дальше просто ждал отключения. После 5-7 часов работы количество записей в eeprom соответствовало теоритическому(по скорости записи в еепром), задействованно было только 2 первых ячейки... Тест проводил раза 3 на следующих ячейках, терпения дождаться сбоя не хватило... Если есть желание, запостите свой код для проверки под STK500 и AT90S2313 я его потестирую и потом выложу дамп еепрома.
|
|
|
|
|
Aug 27 2008, 04:37
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(singlskv @ Aug 26 2008, 23:31)  Если есть желание, запостите свой код для проверки под STK500 и AT90S2313 я его потестирую и потом выложу дамп еепрома. Поставил на ночь крутиться на m16 до первого сбоя (программка приблизительно такая же как приводил выше, инкрементируется байт и пишется в последнюю ячейку eeprom'a) Сейчас снял результаты: 77 -- ожидаемое значение 7F -- реальное значение 0x24240 - цикл итого свалилось на 148032 цикле. перезапустил тест крутиться дальше. Вечером отпишусь еще, и выложу код теста. О, уже упало, даже ждать вечера не пришлось: AD -- ожидаемое значение ED -- реальное значение 0x990A - цикл (39178) После этого упало уже на 6160-м цикле 20 - ожидаемое 62 - прочитанное А вы говорите миллионы...
|
|
|
|
|
Aug 29 2008, 09:31
|

Знающий
   
Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065

|
Цитата(defunct) А вы говорите миллионы... Ничего не понимаю... Может это мне так везет. :05: Почти час "мучал скотину" -- накрутил чуть более миллиона циклов. Проблем не было! условия испытания: -- комнатная температура (на столе), -- STK-500, -- ATMEGA48-20PU, дата изготовления 0623, снизу на брюхе три строки 6F6183 35573С 1-PЗ0623 e3 -- комп. В проге задействован пара светодиодов. Один преключается при каждой перезаписи, другой переключается через какждые 100 циклов перезаписи. Так же через каждые 100 циклов через UART отправляю в комп строку, где указываю текущий номер цикла. На каждом цикле прога записывает младший байт номера цикла в ЕЕПРОМ по адресу 0х00. Выход из цикла по ошибке записи. При этом в комп уйдет строка с номером цикла, а так же это номер будет записан в ЕЕПРОМ по адресам 0х01-0х04. Код написан CV (исходник "приартачен"). Код проги не является примером, для подражания или обучения.
|
|
|
|
|
Aug 29 2008, 09:39
|
Частый гость
 
Группа: Новичок
Сообщений: 83
Регистрация: 25-08-08
Пользователь №: 39 801

|
Цитата(zhevak @ Aug 29 2008, 13:31)  Почти час "мучал скотину" -- накрутил чуть более миллиона циклов. Проблем не было! Запись длится где-то 8,5мСек. Чтобы сделать миллион записей потребуется 2,36 часа
|
|
|
|
Сообщений в этой теме
chajnik Запись на EEPROM Aug 25 2008, 17:01 sKWO по питанию МК диод шоттки + конденсатор достаточно... Aug 25 2008, 17:20   sKWO Ну тогда остаётся посоветовать писать переменную в... Aug 25 2008, 18:27      Боинг749 Цитата(defunct @ Aug 26 2008, 05:14) Где?... Aug 26 2008, 18:23       defunct Цитата(Боинг749 @ Aug 26 2008, 21:23) Вот... Aug 26 2008, 18:48        Боинг749 Цитата(defunct @ Aug 26 2008, 22:48) Веро... Aug 26 2008, 18:59        Боинг749 Прервал тест, чтобы доработать прогу тестирования ... Aug 29 2008, 16:51         Боинг749 Докладываю. Сейчас 22-52. Счётчик больших циклов п... Aug 29 2008, 19:01          Боинг749 Прошло больше 10 дней после того как я произвёл 1 ... Sep 8 2008, 19:58         defunct Цитата(Боинг749 @ Aug 29 2008, 19:51) Но ... Oct 10 2008, 14:24          Николай Иванович Приходько Цитата(defunct @ Oct 10 2008, 18:24) C че... Oct 10 2008, 16:00          singlskv Цитата(defunct @ Oct 10 2008, 18:24) C че... Oct 10 2008, 16:22           defunct Цитата(singlskv @ Oct 10 2008, 19:22) Есл... Oct 13 2008, 16:57            Maik-vs Цитата(defunct @ Oct 13 2008, 20:57) да +... Oct 14 2008, 07:02             defunct Цитата(Maik-vs @ Oct 14 2008, 10:02)... Oct 15 2008, 14:30              singlskv Цитата(defunct @ Oct 15 2008, 18:30) Обра... Oct 15 2008, 20:00       Боинг749 Цитата(singlskv @ Aug 26 2008, 23:51) def... Aug 26 2008, 19:59        sKWO Цитата(Боинг749 @ Aug 26 2008, 22:59) Ну ... Aug 26 2008, 20:19         Боинг749 Цитата(sKWO @ Aug 27 2008, 00:19) АВР тип... Aug 26 2008, 20:27        zhevak ну, блин, понеслась...
У chajnik, задавшего вопро... Aug 26 2008, 20:25          Боинг749 Цитата(defunct @ Aug 27 2008, 08:37) Пост... Aug 27 2008, 06:49           Боинг749 Цитата(Боинг749 @ Aug 27 2008, 10:49) Уго... Aug 29 2008, 15:02            singlskv Цитата(Боинг749 @ Aug 29 2008, 13:39) Зап... Aug 29 2008, 09:53            zhevak Цитата(Боинг749 @ Aug 29 2008, 15:39) Зап... Aug 29 2008, 10:45             Боинг749 Цитата(zhevak @ Aug 29 2008, 14:45) Нет, ... Aug 29 2008, 10:52           defunct Цитата(zhevak @ Aug 29 2008, 12:31) Ничег... Aug 29 2008, 10:50            zhevak Цитата(defunct @ Aug 29 2008, 16:50) може... Aug 29 2008, 10:59             defunct Цитата(zhevak @ Aug 29 2008, 13:59) 2. Чт... Aug 29 2008, 11:09              zhevak Цитата(defunct @ Aug 29 2008, 17:09) eepr... Aug 29 2008, 11:31               defunct Цитата(zhevak @ Aug 29 2008, 14:31) Да и ... Aug 29 2008, 11:42                zhevak Цитата(defunct @ Aug 29 2008, 17:42) К за... Aug 29 2008, 11:56               Maik-vs Цитата(zhevak @ Aug 29 2008, 15:31) Да вр... Aug 29 2008, 12:08                zhevak ЦитатаК записи претензий нет. Я высказал только не... Aug 29 2008, 12:15                 Maik-vs Цитата(zhevak @ Aug 29 2008, 16:15) Я зап... Aug 29 2008, 12:51                  zhevak Цитата(Maik-vs @ Aug 29 2008, 18:51)... Aug 29 2008, 13:08                   Maik-vs Цитата(zhevak @ Aug 29 2008, 17:08) Ведь,... Aug 29 2008, 13:19   zltigo Цитата(zhevak @ Aug 25 2008, 20:17) Так ч... Aug 25 2008, 20:50 chajnik Просто написать Кодeeprom unsigned int indication;... Aug 26 2008, 11:48 ARB Изучаем ДШ!
Примерно, так:
void eeprom_write... Aug 26 2008, 12:41 chajnik CVAVR на эти слова сильно ругается,по всякому проб... Aug 26 2008, 17:19 zhevak Цитата(chajnik @ Aug 26 2008, 23:19) CVAV... Aug 26 2008, 17:57 Qwertty Насчет более быстрого изнашивания младшего бита - ... Aug 29 2008, 15:08 ARB Решил проверить на 16 меге - в ячейку записывались... Sep 9 2008, 12:43 zhevak Цитата(ARB @ Sep 9 2008, 18:43) Решил про... Sep 9 2008, 13:03 ARB МК тот же, ячейки конечно же были разные.
Сразу п... Sep 10 2008, 10:24 zhevak Цитата(ARB @ Sep 10 2008, 16:24) МК тот ж... Sep 10 2008, 10:31 Maik-vs Цитата(ARB @ Sep 10 2008, 14:24) МК тот ж... Sep 18 2008, 06:53  chajnik Это опять я С записью на eeprom -оказалось проще ... Sep 23 2008, 18:43   Цыкетчик Цитата(chajnik @ Sep 23 2008, 22:43) Это ... Sep 23 2008, 20:30   defunct Цитата(chajnik @ Sep 23 2008, 21:43) -при... Sep 24 2008, 13:37 ARB Хорошо, позже отпишусь ;-) Sep 10 2008, 10:43 Juk1976 Доброго времени суток всем.
Я например прописываю ... Sep 17 2008, 08:05 chajnik Но тему создал я,конкретно с вопросом про запись н... Sep 24 2008, 02:22 Цыкетчик Цитата(chajnik @ Sep 24 2008, 06:22) Но т... Sep 24 2008, 08:07 ARB Как обещал, делюсь результатами (и так как chajnik... Oct 10 2008, 11:16
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|