Примеры с сайта AVR+ Electronics - Использование внутренней EEPROM.

Автор: Internet. Опубліковано в Початківцям з CV AVR

Зміст статті

Использование внутренней EEPROM.

Иногда нужно сохранить данные, да так, чтобы после выключения питания можно было их восстановить. Большинство это данные о последних настройках, последних событиях и т. п. Для этого нам подойдёт энергонезависимая память. Почти все микроконтроллеры AVR имеют ёё у себя на борту. О размере EEPROM можно прочитать в даташите на конкретный МК. В большинстве случаев у EEPROM есть 10000 перезаписей, хотя точную цифру можно посмотреть в том же даташите на конкретный МК. А теперь рассмотрим небольшой пример работы с EEPROM в компиляторе Code Vision AVR. Для объявления переменной eeprom

 в CodeVision мы пишем так eeprom unsigned char start; этой строкой мы объявили переменную в области еепром. Для чтения значений обращаемся как с обычной переменной, а чтобы записать новое значение в переменную еепром пишем так start=12; этой строкой мы передали новое значение в еепром и теперь в переменной еепром записано число 12. Я решил, чтобы показать наглядно работу с EEPROM написать программу мигалки, которая перестаёт работать после n-ного количества включений, так сказать demo версия.

Вот схема:


В исходниках всё понятно, да к тому же код простейший. Скачать проект и файлы к нему можно здесь eeprom.zip (исходный код, прошивка,  proteus).

Code
/*****************************************************
Автор: Krik99
Project : test eeprom                            
Chip type           : ATtiny13
Clock frequency     : 9,600000 MHz
Memory model        : Tiny
External SRAM size  : 0
Data Stack size     : 16
*****************************************************/
#include <tiny13.h>
#include <delay.h>
eeprom unsigned char start;  //переменная в eeprom
void main(void)
{
unsigned char a; 
start=start+1;          //при каждом вкл. записываем +1 в eeprom
// Port B initialization
PORTB=0x00;
DDRB=0x1F;
while (start<5){            //проверяем сколько было запусков если<5 тогда 
          for(a=0;a<32;a++){       //собственно сама мигалка
              PORTB=a;
              delay_ms(100);
          }
      };
}