Форум myROBOT.ru » Шаг за шагом » Программирование микроконтроллеров » Как сделать последовательную запись в EEPROM?

Страниц (1): [1]
 

1. ferio - 20 Января, 2009 - 14:12:23 - перейти к сообщению
Здравствуйте!
Подскажите, как можно сделать следующий алгоритм на Си, МК - Almel.
МК работает в связке с "градусником" и запоминает в EEPROM каждый час значение температуры. Как сделать, чтобы последовательно сохранялись все значения пока не заполнится память.
2. Белый Волк - 20 Января, 2009 - 17:17:54 - перейти к сообщению
Код записи байта "data" в EEPROM по адресу "address" для ATmega16.
CODE:

void EEPROM_write(unsigned int address, unsigned char data)
{
while (EECR & _BV(EEWE)); //
EEAR = address; //
EEDR = data; //
EECR |= _BV(EEMWE); //
EECR |= _BV(EEWE); //
}


Если Вы используете timer/counter2 как часы реального времени (Real
Time Counter (RTC); по этой фразе в DataSheet можно найти необходимую информацию о подобном использовании), установите деление тактовой частоты на 1024. Тогда, при использовании часового кварцевого резонатора, одна секунда будет соответствовать 32 тактам timer/counter2 ((32768 Гц) / (1024) = 32), 30 минут: 32 * 1600 = 51200. Используйте прерывание по совпадению регистра Output Compare Register (OCR2) для выполнения необходимых операций и записи байта температуры в EEPROM. Переменная address_temp должна быть глобальной. В процедуре обработки прерывания, после вызова EEPROM_write, необходимо увеличить её значение на единицу (в случае, если значение температуры умещается в 1 байт):
CODE:

//эти переменные должны быть глобальными
#define maxEEPROM 1023; //максимальный адрес в EEPROM
unsigned char counter = 0;
unsigned int address = 0;

//основная процедура
//действия
//конец основной процедуры

//процедура обработки прерывания по совпадению содержимого OCR2 = 51200 с TCNT2

OCR2 += 51200; //следующее прерывание через 30 минут
counter++; //количество получасовых промежутков

//действия по получению информации о температуре, например, в переменную temp

if ((counter == 2) && (address <= maxEEPROM)) //прошёл час и указатель адреса не дошёл до конца памяти микроконтроллера
{
EEPROM_write(address_temp, temp);
counter = 0;
address_temp++;
}
if (address > maxEEPROM)
{
//действия, если закончилась память для сохранения значений температуры
}

//конец процедуры обработки прерывания OCR2 == TCNT2

Код не проверялся на работоспособность, за исключением процедуры EEPROM_write, будьте внимательны.
3. ferio - 22 Января, 2009 - 07:40:29 - перейти к сообщению
Благодарю за помощь. Работает.