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

 
 
5 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Запись на 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
sKWO
сообщение Aug 25 2008, 17:20
Сообщение #2


Местный
***

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



по питанию МК диод шоттки + конденсатор достаточной ёмкости (470мкф).
подключить компаратор к диоду с обеих сторон, и исспользуя от него в прерывании по исчезновению питания отключаете периферию + режим слип и сохраняете переменные в энергонезависимую память


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


Участник
*

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


Местный
***

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


Знающий
****

Группа: Свой
Сообщений: 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
sKWO
сообщение Aug 25 2008, 18:27
Сообщение #6


Местный
***

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



Ну тогда остаётся посоветовать писать переменную в еепром не с нулевого адресса, а к примеру с десятого, тоже рекомендация атмел, а как это сделать по ссылке выше есть.
удачи.
И посмотрите тут, выводы сделайте сами http://electronix.ru/forum/index.php?showtopic=27560&hl=

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


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


кекс
******

Группа: Свой
Сообщений: 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
zltigo
сообщение Aug 25 2008, 20:50
Сообщение #8


Гуру
******

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



Цитата(zhevak @ Aug 25 2008, 20:17) *
Так что самый лучший способ -- писать значение в ЕЕПРОМ сразу после нажатия. Быстро, дешево, результативно.

Не менее просто, но несколько разумнее, писать через несколько секунд после того, как клиент престанет жать на кнопочки.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Боинг749
сообщение Aug 25 2008, 22:03
Сообщение #9


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

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


кекс
******

Группа: Свой
Сообщений: 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
chajnik
сообщение Aug 26 2008, 11:48
Сообщение #11


Участник
*

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



Просто написать
Код
eeprom unsigned int indication;
-но это ничего не дает 07.gif
Прошу конкретно обьяснить,в какое место какое слово написать.

Сообщение отредактировал chajnik - Aug 26 2008, 11:54
Go to the top of the page
 
+Quote Post
ARB
сообщение Aug 26 2008, 12:41
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 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);
Go to the top of the page
 
+Quote Post
chajnik
сообщение Aug 26 2008, 17:19
Сообщение #13


Участник
*

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



CVAVR на эти слова сильно ругается,по всякому пробовал,короче ,никакого продвижения.
Go to the top of the page
 
+Quote Post
zhevak
сообщение Aug 26 2008, 17:57
Сообщение #14


Знающий
****

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


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


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

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

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

 


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


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