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

 
 
> Запись на 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
singlskv
сообщение Aug 26 2008, 19:51
Сообщение #8


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(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 минут ячейку заелозит и увидите реальное число.

defunct не все так просто на самом деле...,
100000 это долговременная стабильность при НЕтепличных условиях(по температуре например) и
при питании 2,7(1,8)V, то есть 100000 при любых условиях гарантированны...

В какой-то момент я сам решил проверить работу своего хитрого алгоритма по сохранению
данных в EEPROM, так вот у меня не хватило терпения его проверять...,
в итоге пришлось на симуляторе прогнать все состояния...
При 2-3 миллионах записей на AT90S2313 сбоев не было ни в одной ячейке,
правда условия эксперимента были вполне тепличными.
Так что миллионы записей - вполне реально, НО все рассчеты НУЖНО делать
исходя из 100000...
Go to the top of the page
 
+Quote Post
defunct
сообщение Aug 26 2008, 20:08
Сообщение #9


кекс
******

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



Цитата(singlskv @ Aug 26 2008, 22:51) *
В какой-то момент я сам решил проверить работу своего хитрого алгоритма по сохранению
данных в EEPROM, так вот у меня не хватило терпения его проверять...,

Да причем тут хитрый алгоритм.
Давайте остановимся на нехитром счетчике, как в приведенном примере.
на проверку понадобится всего 10-20 минут, максимум полчаса и одна ячейка eeprom'a любого AVR чипа.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Aug 26 2008, 20:31
Сообщение #10


дятел
*****

Группа: Свой
Сообщений: 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
я его потестирую и потом выложу дамп еепрома.
Go to the top of the page
 
+Quote Post
defunct
сообщение Aug 27 2008, 04:37
Сообщение #11


кекс
******

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

А вы говорите миллионы...
Go to the top of the page
 
+Quote Post
zhevak
сообщение Aug 29 2008, 09:31
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 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 (исходник "приартачен"). Код проги не является примером, для подражания или обучения.
Go to the top of the page
 
+Quote Post
Боинг749
сообщение Aug 29 2008, 09:39
Сообщение #13


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

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



Цитата(zhevak @ Aug 29 2008, 13:31) *
Почти час "мучал скотину" -- накрутил чуть более миллиона циклов. Проблем не было!

Запись длится где-то 8,5мСек. Чтобы сделать миллион записей потребуется 2,36 часа
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, 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


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

 


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


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