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

 
 
> Запись на EEPROM
chajnik
сообщение Aug 25 2008, 17:01
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
chajnik
сообщение Aug 25 2008, 17:42
Сообщение #2


Участник
*

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



Ну это совсем сложно,а вот отсюда http://electronix.ru/forum/index.php?showtopic=51328 -это-как сюда вставить?
long a=123456;
eeprom long b;
b=a;
Go to the top of the page
 
+Quote Post
sKWO
сообщение Aug 25 2008, 18:01
Сообщение #3


Местный
***

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



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

Сообщение отредактировал sKWO - Aug 25 2008, 18:13


--------------------
нельзя недооценивать предсказуемость глупости
Go to the top of the page
 
+Quote Post
zhevak
сообщение Aug 25 2008, 18:17
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 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


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
defunct
сообщение Aug 25 2008, 20:34
Сообщение #5


кекс
******

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



Цитата(zhevak @ Aug 25 2008, 21:17) *
Кроме того. Названная цифра 100000 --это та цифра, за которую Атмел отвечает своим лицом. Реально же это может превышать раз в 10. Здесь где-то на форуме кто-то целый год мучал память. И что? -- Не убил!!!

Да нет, как раз мучали подругому. Не целый год, а очень быстро и целенаправленно убивали ячейки постоянной записью в них.
получилось в районе 107-115k записей.
Т.е. на 5-10% сверх заявленных 100k можно расчитывать, а уж никак не в 10 раз.

Цитата
Так что самый лучший способ -- писать значение в ЕЕПРОМ сразу после нажатия. Быстро, дешево, результативно.

С этим можно согласиться.

Цитата
Ну тогда остаётся посоветовать писать переменную в еепром не с нулевого адресса, а к примеру с десятого, тоже рекомендация атмел, а как это сделать по ссылке выше есть.

Эта рекомедация уже устаревшая. Она относилась к AT90 серии.
Go to the top of the page
 
+Quote Post
Боинг749
сообщение Aug 25 2008, 22:03
Сообщение #6


Частый гость
**

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



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

Вы не правы. Насколько мне помнится, речь кажется шла о 5,5млн записей.
Go to the top of the page
 
+Quote Post
defunct
сообщение Aug 26 2008, 01:14
Сообщение #7


кекс
******

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



Цитата(Боинг749 @ Aug 26 2008, 01:03) *
Вы не правы. Насколько мне помнится, речь кажется шла о 5,5млн записей.

Где? smile.gif В ДШ (если вы их читаете) есть цифра 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 минут ячейку заелозит и увидите реальное число.
Go to the top of the page
 
+Quote Post
Боинг749
сообщение Aug 26 2008, 18:23
Сообщение #8


Частый гость
**

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



Цитата(defunct @ Aug 26 2008, 05:14) *
Где? smile.gif В ДШ (если вы их читаете) есть цифра 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 минут ячейку заелозит и увидите реальное число.


Дык человек проверил... И написал, что Atmel просто осторожничает и перестраховывается...Тем более что Вы имели ввиду не datasheet а опыты этого чела..
Вот текст ответа этого чела(нашёл в инете):
"EEPROM - циклы чтения - перезаписи
Я прогонял кристаллы Classic (2313,8515,8535 всего 8 м/с)
на количество циклов перезаписи
методика:
1 пишу 0x55
2 проверяю 0x55
3 пишу 0xAA
4 проверяю 0xAA
5 периодически вывожу результаты на ЖКИ
т.е. долговременная сохранность записанного байта не проводилось
РЕЗУЛЬТАТ:
первый сбой 3,5 миллионов записей,
ячейку невозможно прописать через 4,6 миллионов записей.
Современные кристаллы не хуже, я в своих программах
использую щадящий режим записи EEPROM (с предпроверкой - если в ячейке такое же значение, то не пишем),
контролирую записанное значение в EEPROM.
После чтения и записи устанавливаю 0x00 адрес, который не использую (гарантия от произвольной записи при сбое).
При проектировании устройства я закладывал 3млн. записей,
ни секунды об этом не жалею - сбоев не было.
100.000 циклов перезаписи - Атмел очень осторожничает,
реально ресурс как у 24С08.
Удачи!
"

Сообщение отредактировал Боинг749 - Aug 26 2008, 18:25
Go to the top of the page
 
+Quote Post
defunct
сообщение Aug 26 2008, 18:48
Сообщение #9


кекс
******

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



Цитата(Боинг749 @ Aug 26 2008, 21:23) *
Вот текст ответа этого чела(нашёл в инете):

Вероятно, у этого человека тест неправильно был построен.

IgorKossak приводил несколько другую цифру, и она кореллирует с тем, что написано в ДШ.
Сам я тоже проверял, мои цифры выше.
Всяко лучше самому измерить ресурс чем доверять сомнительным источникам, тем более когда речь идет о разнице в 50 раз.
Go to the top of the page
 
+Quote Post
Боинг749
сообщение Aug 29 2008, 16:51
Сообщение #10


Частый гость
**

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



Прервал тест, чтобы доработать прогу тестирования в плане сохранения ожидавшегося значения. Т.е. я пишу в EEPROM по адресу 0 содержимое счётчика R25, а затем считываю содержимое ячейки 0 в R24. Так вот, раньше у меня не было предусмотрено сохранение R25 в случае обнаружения ошибки записи. Теперь же в случае ошибки я записываю R25, на котором остановился тест, в 7-ю ячейку EEPROM.

Расскажу вкратце как я тестирую. У меня есть малый цикл, когда R25 меняется от0 до 255. И большой когда инкрементируется 16-ти разрядный счётчик больших циклов.
После того, как R25 "пробежит" от о до 255 я инкрементирую счётчик больших циклов. Этот 3 копии счётчика больших циклов храню в EEPROM.

Раньше R25, на котором "споткнулся" тест, я не сохранял. Но после слов одного из участников, что при таком тесте более вероятно что первым "накроется медным тазом" самый младший бит, решил проверить эту теорию. Для чего переделал прогу и ПЕРЕзапустил тест.

Да, фусе-бит EESAVE, чтобы содержимое EEPROM не терялось при перепрошивке программы, у меня уже был запрограммирован ранее.

Далее, тест рестартует только после выключения/включения питания. Для чего в программе анализирую бит PORF.


И так.. Глянул сейчас на счётчик больших циклов. Он равен $096A. Значит было произведено $096A х 256 = 616000 записей... И полёт пока нормальный.. Светодиод по-прежнему мигает каждые 2 сек.

(написал это где-то час назад... Светодиод пока мигает lol.gif Ну не хочет никак убивацц ячейка )
Go to the top of the page
 
+Quote Post
defunct
сообщение Oct 10 2008, 14:24
Сообщение #11


кекс
******

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



Цитата(Боинг749 @ Aug 29 2008, 19:51) *
Но после слов одного из участников, что при таком тесте более вероятно что первым "накроется медным тазом" самый младший бит, решил проверить эту теорию.

C чего автор этой теории это взял?
Это невереная теория изначально.
Счетчик линейный, соответвенно 0 записывается во все биты ячейки eeprom одинаковое количество раз.

Записью единицы можно принебреч. "1" устанавливается при стирании.
Go to the top of the page
 
+Quote Post
Николай Иванович...
сообщение Oct 10 2008, 16:00
Сообщение #12


Частый гость
**

Группа: Новичок
Сообщений: 139
Регистрация: 26-09-08
Пользователь №: 40 510



Цитата(defunct @ Oct 10 2008, 18:24) *
C чего автор этой теории это взял?
Это невереная теория изначально.
Счетчик линейный, соответвенно 0 записывается во все биты ячейки eeprom одинаковое количество раз.

Рассмотрим простенький примерчик

0000
0001
0010
0011
0100
0101
0110
0111
......


Не заметили никакой закономерности?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- chajnik   Запись на EEPROM   Aug 25 2008, 17:01
- - sKWO   по питанию МК диод шоттки + конденсатор достаточно...   Aug 25 2008, 17:20
|- - sKWO   Ну тогда остаётся посоветовать писать переменную в...   Aug 25 2008, 18:27
|||- - Боинг749   Цитата(defunct @ Aug 26 2008, 22:48) Веро...   Aug 26 2008, 18:59
|||- - Боинг749   Докладываю. Сейчас 22-52. Счётчик больших циклов п...   Aug 29 2008, 19:01
||||- - Боинг749   Прошло больше 10 дней после того как я произвёл 1 ...   Sep 8 2008, 19:58
|||- - 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
||- - singlskv   Цитата(defunct @ Aug 26 2008, 05:14) Где?...   Aug 26 2008, 19:51
||- - Боинг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
||- - defunct   Цитата(singlskv @ Aug 26 2008, 22:51) В к...   Aug 26 2008, 20:08
||- - zhevak   ну, блин, понеслась... У chajnik, задавшего вопро...   Aug 26 2008, 20:25
||- - singlskv   Цитата(defunct @ Aug 27 2008, 00:08) Да п...   Aug 26 2008, 20:31
||- - defunct   Цитата(singlskv @ Aug 26 2008, 23:31) Есл...   Aug 27 2008, 04:37
||- - Боинг749   Цитата(defunct @ Aug 27 2008, 08:37) Пост...   Aug 27 2008, 06:49
|||- - Боинг749   Цитата(Боинг749 @ Aug 27 2008, 10:49) Уго...   Aug 29 2008, 15:02
||- - zhevak   Цитата(defunct)А вы говорите миллионы... Ничего н...   Aug 29 2008, 09:31
||- - Боинг749   Цитата(zhevak @ Aug 29 2008, 13:31) Почти...   Aug 29 2008, 09:39
|||- - 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


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

 


RSS Текстовая версия Сейчас: 27th June 2025 - 17:21
Рейтинг@Mail.ru


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