|
|
  |
Запись на 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, 18:27
|

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

|
Ну тогда остаётся посоветовать писать переменную в еепром не с нулевого адресса, а к примеру с десятого, тоже рекомендация атмел, а как это сделать по ссылке выше есть. удачи. И посмотрите тут, выводы сделайте сами http://electronix.ru/forum/index.php?showtopic=27560&hl=
Сообщение отредактировал sKWO - Aug 25 2008, 18:41
--------------------
нельзя недооценивать предсказуемость глупости
|
|
|
|
|
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, 20:50
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(zhevak @ Aug 25 2008, 20:17)  Так что самый лучший способ -- писать значение в ЕЕПРОМ сразу после нажатия. Быстро, дешево, результативно. Не менее просто, но несколько разумнее, писать через несколько секунд после того, как клиент престанет жать на кнопочки.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
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, 11:48
|
Участник

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

|
Просто написать Код eeprom unsigned int indication; -но это ничего не дает  Прошу конкретно обьяснить,в какое место какое слово написать.
Сообщение отредактировал chajnik - Aug 26 2008, 11:54
|
|
|
|
|
Aug 26 2008, 12:41
|
Участник

Группа: Участник
Сообщений: 18
Регистрация: 5-06-08
Пользователь №: 38 076

|
Изучаем ДШ!
Примерно, так:
void eeprom_write( uint16_t address, uint8_t data ) { while( EECR & ( 1 << EEWE ) ); EEAR = address; EEDR = data; EECR |= ( 1 << EEMWE ); EECR |= ( 1 << EEWE ); }
uint8_t eeprom_read( uint16_t address ) { while( EECR & ( 1 << EEWE ) ); EEAR = address; EECR |= ( 1 << EERE ); return EEDR; }
В начале main поставить tik = eeprom_read(0x00); В recoding - eeprom_write(0x00, tik);
|
|
|
|
|
Aug 26 2008, 17:19
|
Участник

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

|
CVAVR на эти слова сильно ругается,по всякому пробовал,короче ,никакого продвижения.
|
|
|
|
|
Aug 26 2008, 17:57
|

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

|
Цитата(chajnik @ Aug 26 2008, 23:19)  CVAVR на эти слова сильно ругается,по всякому пробовал,короче ,никакого продвижения. Боюсь показаться не оригинальными, но попробуйте сделайть так: Код // Глобальные переменные eeprom unsigned char eeVar; // Резервируем место для переменной в EEPROMe ... void main(void) { ... eeVar = 0x12; // сохраняем значение ... x = a + b * eeVar; // Используем сохраненное значение при вычислении } если нужна начальная инициализация переменной при заливке программы в МК, то можете сделать так Код // Глобальные переменные eeprom unsigned char eeVar = 0x34; // Резервируем место для переменной в EEPROMe ...
--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
|
|
|
|
|
Aug 26 2008, 18:23
|
Частый гость
 
Группа: Новичок
Сообщений: 83
Регистрация: 25-08-08
Пользователь №: 39 801

|
Цитата(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 минут ячейку заелозит и увидите реальное число. Дык человек проверил... И написал, что 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
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|