реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Работа с EEPROM в WinAVR
Marian
сообщение Mar 29 2008, 13:38
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 148
Регистрация: 23-02-07
Пользователь №: 25 618



В CodeVision объявляется переменная в EEPROM, с инициализацией:

Код

eeprom unsigned char precision    = 128;


читать с EEPROM :

Код

unsigned char tempPrecision;
  
tempPrecision = precision;


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

unsigned char tempPrecision;

tempPrecision = 234;
precision =tempPrecision;


Как перенести в WinAVR ?
Go to the top of the page
 
+Quote Post
TarasG
сообщение Mar 29 2008, 13:58
Сообщение #2


Участник
*

Группа: Новичок
Сообщений: 72
Регистрация: 25-02-08
Пользователь №: 35 378



Код
#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.

Сообщение отредактировал TarasG - Mar 29 2008, 14:03
Go to the top of the page
 
+Quote Post
smk
сообщение Mar 30 2008, 07:44
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



По примеру из даташита я делал так (для 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;)


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
Marian
сообщение Mar 30 2008, 08:29
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 148
Регистрация: 23-02-07
Пользователь №: 25 618



Спасибо за помощь.
Go to the top of the page
 
+Quote Post
TarasG
сообщение Mar 30 2008, 09:12
Сообщение #5


Участник
*

Группа: Новичок
Сообщений: 72
Регистрация: 25-02-08
Пользователь №: 35 378



Цитата(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
Go to the top of the page
 
+Quote Post
smk
сообщение Mar 30 2008, 09:16
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Цитата
Зачем же так сложно?

По примеру из даташит. предложите проще и так чтоб точно работало и не оптимизировалсь что не надо.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
aesok
сообщение Mar 30 2008, 10:15
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(smk @ Mar 30 2008, 10:44) *
По примеру из даташита я делал так (для Tiny24):


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

Анатолий.
Go to the top of the page
 
+Quote Post
Дон Амброзио
сообщение Mar 30 2008, 12:24
Сообщение #8


Местный
***

Группа: Участник*
Сообщений: 323
Регистрация: 11-02-08
Пользователь №: 34 947



Удалено

Сообщение отредактировал Дон Амброзио - Mar 30 2008, 12:36


--------------------
После устранения бага в программе она стала работать....хуже
Go to the top of the page
 
+Quote Post
smk
сообщение Mar 30 2008, 12:30
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



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


Да, это правда, но только мы все люди умые, читаем даташит м запрещаем прерывания ДО использования и разрешаем после.
Как показывает практика 4 такта всегда выполняется, но проверять не вредно. Пока работает уверенно в десятках девайсов.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 30 2008, 16:06
Сообщение #10


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



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


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

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


дабы не разрешать прерывания там, где они запрещены.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 15th July 2025 - 03:08
Рейтинг@Mail.ru


Страница сгенерированна за 0.02371 секунд с 7
ELECTRONIX ©2004-2016