Работаем с энергонезависимой памятью микроконтроллера EEPROM.
Как-то на форуме наш пользовательsp-fly,задал вопрособ использовании внутренний памяти EEPROM.
EEPROM — (англ. Electrically Erasable Programmable Read-Only Memory, электрически стираемое перепрограммируемое ПЗУ, ЭСППЗУ). Память такого типа может стираться и заполняться данными несколько десятков тысяч раз. Используется в твердотельных накопителях. Одной из разновидностей EEPROM является флеш-память (англ. Flash Memory).
В микроконтроллерах AVR, в разных разный размер EEPROM’a. Например в:
tinyAVR:512 б;
megaAVR:4кб;
XMEGA AVR: 4 кб.
Компания Atmel гарантирует100 000 циклов перезиписи ЕЕPROM, и 10 000 циклов перезаписи Flash памяти (пам'ять в которойхраниться прошивка).
Принцып роботы нашего устройства, таков :у нас в EEPROM’е будут храниться 2 переменных, первая RUNбудет отвечать за количиство запуска устройства, вторая СNT за показания счетчика. Программа будет работать только 20 включений, потом она не запуститься а выдает спецыальное сообщение, я думаю это будет полезно для создания собственны демо прошивок :)
В программе работа с переменной хрянящуюся в ЕЕPROM’е осуществляеться также как робота с простой переменной.
eeprom int run=1; // создание переменной run в EEPROM памяти МК //храниться число запусков устройства eeprom int cnt=0; // создание переменной run в EEPROM памяти МК //храниться число счетчика
void main(void) { bit prg=0; // переменная для работе с меню.
run=run+1; // прибавляем к переменной хранящейся в EEPROM единицу для потсчета количиства запуска устройства while (1) { lcd_clear(); // очистка ЛСД lcd_gotoxy(0,0); // установка курсора на 0,0 if (PINC.1==1) // Выбор режима показание счетчика (данные нажатия на кнопку и количиство запусков устройства/ инфо сайта) { prg++; // так как у нас всего 2 действия мы используем битовую переменную delay_ms(250); // задержка }
if (prg==0) // Data from the counter { lcd_putsf("Cnt="); lcd_putchar(cnt/10+0x30); lcd_putchar(cnt%10+0x30); lcd_putsf(" "); lcd_putsf("DevRun="); lcd_putchar(run/10+0x30); lcd_putchar(run%10+0x30); }
if (prg==1) // info lcd_putsf("www.my-avr.at.ua");
if (PINC.0==1) // кнопка ресет обнуляет число нажатий на кнопку но не счетчик включений { cnt=0; delay_ms(250); }
if (PINC.2==1) // кнопка счетчика { cnt=cnt+1; // прибавляем единицу к состоянию счетчика delay_ms(200); // задержка для избежания дребезга }
if (cnt>99) // если переменная счетчика > 99, то обнуляем счетчик. cnt=0;
eeprom int run=1; // создание переменной run в EEPROM памяти МК //храниться число запусков устройства eeprom int cnt=0; // создание переменной run в EEPROM памяти МК //храниться число счетчика
этот участок программы запускаеться при каждом запуске мк, и при каждом старте будет присваивать переменной run 1, а переменной cnt 0, и счетчик ничего считать не будет. Или я чтото не так понял?
Спасибо за статью! Только не совсем понял, после 20 запусков переменная run обнулится, а при 21 запуске разве не сработает ли строка run=run+1; тогда все по новой начнется...