роботы робототехника микроконтроллеры


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

> Без описания
ferio Post Id


Рядовой


Сообщений всего: 2
Дата рег-ции: Янв. 2009  



Здравствуйте!
Подскажите, как можно сделать следующий алгоритм на Си, МК - Almel.
МК работает в связке с "градусником" и запоминает в EEPROM каждый час значение температуры. Как сделать, чтобы последовательно сохранялись все значения пока не заполнится память.
 
 Top
Белый Волк Супермодератор Post Id



Супермодератор


Сообщений всего: 648
Дата рег-ции: Февр. 2007  



Код записи байта "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, будьте внимательны.

(Отредактировано автором: 20 Января, 2009 - 17:22:27)

 
 Top
ferio Post Id


Рядовой


Сообщений всего: 2
Дата рег-ции: Янв. 2009  



Благодарю за помощь. Работает.
 
 Top
Страниц (1): [1]
« Программирование микроконтроллеров »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 





Powered by Exclusive Bulletin Board
ExBB FM 1.0 RC1 Smiles by Fool from Foolstown
  Яндекс.Метрика   Рейтинг@Mail.ru