Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Работа с EEPROM в WinAVR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Marian
В CodeVision объявляется переменная в EEPROM, с инициализацией:

Код

eeprom unsigned char precision    = 128;


читать с EEPROM :

Код

unsigned char tempPrecision;
  
tempPrecision = precision;


запись в EEPROM :
Код

unsigned char tempPrecision;

tempPrecision = 234;
precision =tempPrecision;


Как перенести в WinAVR ?
TarasG
Код
#include <avr/eeprom.h>

unsigned char value;
eeprom_busy_wait();
eeprom_write_byte((unsigned char *) 0x02, value);
value = eeprom_read_byte((unsigned char *) 0x02);

Где 0x02 - адрес, по которому будет произведено чтение/запись, в данном случае взят случайно. Функция eeprom_busy_wait() нужна для ожидания готовности EEPROM.
smk
По примеру из даташита я делал так (для Tiny24):

unsigned char EEPROM_read_8 (unsigned char Address)
{
while (EECR & (1<<EEPE));
EEARL= Address;
EECR |= (1<<EERE);
return EEDR;
}

void EEPROM_write_8(unsigned char Address, unsigned char Data)
{
while (EECR & (1<<EEPE));
EECR = (0<<EEPM1) | (0>>EEPM0);
EEARL= Address;
EEDR = Data;
EECR |= (1<<EEMPE);
EECR |= (1<<EEPE);
}


unsigned int EEPROM_read_16 (unsigned char AddressH, unsigned char AddressL )
{
unsigned int Data_eep_16;
Data_eep_16=EEPROM_read_8(AddressH);
Data_eep_16=(Data_eep_16<<8);
Data_eep_16=Data_eep_16+EEPROM_read_8(AddressL);
return Data_eep_16;
}

void EEPROM_write_16 (unsigned char AddressH, unsigned char AddressL, unsigned int Data)
{
unsigned int Data_eep_8;
Data_eep_8=(Data>>8);
EEPROM_write_8(AddressH, Data_eep_8);
Data_eep_8=(char) Data;
EEPROM_write_8(AddressL, Data_eep_8);
}

Для других просто поменяйте имена регистра и битов:
(EECR; EEPE; EEARL; EERE; EEDR; EEPE; EEPM1; EEPM0; EEMPE;)
Marian
Спасибо за помощь.
TarasG
Цитата(smk @ Mar 30 2008, 09:44) *
По примеру из даташита я делал так (для Tiny24):

unsigned char EEPROM_read_8 (unsigned char Address)
{
while (EECR & (1<<EEPE));
EEARL= Address;
EECR |= (1<<EERE);
return EEDR;
}

void EEPROM_write_8(unsigned char Address, unsigned char Data)
{
while (EECR & (1<<EEPE));
EECR = (0<<EEPM1) | (0>>EEPM0);
EEARL= Address;
EEDR = Data;
EECR |= (1<<EEMPE);
EECR |= (1<<EEPE);
}
unsigned int EEPROM_read_16 (unsigned char AddressH, unsigned char AddressL )
{
unsigned int Data_eep_16;
Data_eep_16=EEPROM_read_8(AddressH);
Data_eep_16=(Data_eep_16<<8);
Data_eep_16=Data_eep_16+EEPROM_read_8(AddressL);
return Data_eep_16;
}

void EEPROM_write_16 (unsigned char AddressH, unsigned char AddressL, unsigned int Data)
{
unsigned int Data_eep_8;
Data_eep_8=(Data>>8);
EEPROM_write_8(AddressH, Data_eep_8);
Data_eep_8=(char) Data;
EEPROM_write_8(AddressL, Data_eep_8);
}

Для других просто поменяйте имена регистра и битов:
(EECR; EEPE; EEARL; EERE; EEDR; EEPE; EEPM1; EEPM0; EEMPE;)

Зачем же так сложно? 07.gif
smk
Цитата
Зачем же так сложно?

По примеру из даташит. предложите проще и так чтоб точно работало и не оптимизировалсь что не надо.
aesok
Цитата(smk @ Mar 30 2008, 10:44) *
По примеру из даташита я делал так (для Tiny24):


Предложеная вами функция "EEPROM_write_8" опасна в применении. Если между строками "EECR |= (1<<EEMPE);" и "EECR |= (1<<EEPE);" произойдет прерывание то запись в EEPROM не будет выполнена. Бит "EEPE" должен быть установлен в единицу не позже чем через 4 такта, после установки бита "EEMPE".

Анатолий.
Дон Амброзио
Удалено
smk
Цитата
Предложеная вами функция "EEPROM_write_8" опасна в применении. Если между строками "EECR |= (1<<EEMPE);" и "EECR |= (1<<EEPE);" произойдет прерывание то запись в EEPROM не будет выполнена. Бит "EEPE" должен быть установлен в единицу не позже чем через 4 такта, после установки бита "EEMPE".


Да, это правда, но только мы все люди умые, читаем даташит м запрещаем прерывания ДО использования и разрешаем после.
Как показывает практика 4 такта всегда выполняется, но проверять не вредно. Пока работает уверенно в десятках девайсов.
_Pasha
Цитата(smk @ Mar 30 2008, 15:30) *
Да, это правда, но только мы все люди умые, читаем даташит м запрещаем прерывания ДО использования и разрешаем после.


А если мы параноидально умные smile.gif, то пользуемся

Код
#include <util/atomic.h>
........
........
ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
{
  EECR |= (1<<EEMPE);
  EECR |= (1<<EEPE);
}


дабы не разрешать прерывания там, где они запрещены.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.