|
|
  |
Работа с EEPROM в WinAVR |
|
|
|
Mar 29 2008, 13:38
|

Частый гость
 
Группа: Участник
Сообщений: 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 ?
|
|
|
|
|
Mar 29 2008, 13:58
|

Участник

Группа: Новичок
Сообщений: 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
|
|
|
|
|
Mar 30 2008, 09:12
|

Участник

Группа: Новичок
Сообщений: 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;) Зачем же так сложно?
|
|
|
|
|
Mar 30 2008, 10:15
|
Знающий
   
Группа: Участник
Сообщений: 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". Анатолий.
|
|
|
|
|
Mar 30 2008, 12:30
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Цитата Предложеная вами функция "EEPROM_write_8" опасна в применении. Если между строками "EECR |= (1<<EEMPE);" и "EECR |= (1<<EEPE);" произойдет прерывание то запись в EEPROM не будет выполнена. Бит "EEPE" должен быть установлен в единицу не позже чем через 4 такта, после установки бита "EEMPE". Да, это правда, но только мы все люди умые, читаем даташит м запрещаем прерывания ДО использования и разрешаем после. Как показывает практика 4 такта всегда выполняется, но проверять не вредно. Пока работает уверенно в десятках девайсов.
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Mar 30 2008, 16:06
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(smk @ Mar 30 2008, 15:30)  Да, это правда, но только мы все люди умые, читаем даташит м запрещаем прерывания ДО использования и разрешаем после. А если мы параноидально умные  , то пользуемся Код #include <util/atomic.h> ........ ........ ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { EECR |= (1<<EEMPE); EECR |= (1<<EEPE); } дабы не разрешать прерывания там, где они запрещены.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|