Работа с EEPROM на Си в АВР Студио
-
alexval2006
- Прорезались зубы
- Сообщения: 225
- Зарегистрирован: Сб мар 10, 2007 20:05:39
- Откуда: валуйки
- Контактная информация:
Работа с EEPROM на Си в АВР Студио
Добрый вечер всем.
Интересует такой вопрос Работа с EEPROM на Си в АВР Студио как я знаю для Си в авр студио использована AVR GCC научите как записать байт в ячейку EEPROM и как его оттуда прочитать был бы очень признателен.
Интересует такой вопрос Работа с EEPROM на Си в АВР Студио как я знаю для Си в авр студио использована AVR GCC научите как записать байт в ячейку EEPROM и как его оттуда прочитать был бы очень признателен.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Работа с EEPROM на Си в АВР Студио
для работы с EEPROM надо подключить к проекту модуль <avr/eeprom.h> и пользоваться функциями eeprom_read_XXX() и eeprom_write_XXX(), где вместо XXX использовать byte, word, dword или block соответственно для чтениязаписи байта, двухбайтного int, 4 байтного long или структуры произвольного размера.
очень рекомендую вместо eeprom_write_XXX() использовать eeprom_update_XXX(), которая перед тем, как записать, проверит, что там уже в EEPROM содержится, и не станет записывать, если данные уже точно такие же - это существенно повышает ресурс жизни EEPROM.
так же рекомендую в своих проектах работать не с ячейками, а с переменными, определенными в секции памяти EEPROM, тогда адреса EEPROM компилятор будет распределять между переменными самостоятельно, и вам не надо будет даже про них знать:
очень рекомендую вместо eeprom_write_XXX() использовать eeprom_update_XXX(), которая перед тем, как записать, проверит, что там уже в EEPROM содержится, и не станет записывать, если данные уже точно такие же - это существенно повышает ресурс жизни EEPROM.
так же рекомендую в своих проектах работать не с ячейками, а с переменными, определенными в секции памяти EEPROM, тогда адреса EEPROM компилятор будет распределять между переменными самостоятельно, и вам не надо будет даже про них знать:
Код: Выделить всё
#include <avr/io.h>
#include <avr/eeprom.h>
#include <stdio.h>
#include <stdlib.h>
EEMEM int var1 = 123;
EEMEM char estr[] = "Demo";
int main(void){
char str[20];
if((int)eeprom_read_word(&var1) != 123){
eeprom_update_block(estr,"Demon",6); // если в EEPROM было записано "Demo", то тут допишется только последняя 'e' и ноль
}
eeprom_read_block(str, estr, 20);
printf("%s",str);
}если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Работа с EEPROM на Си в АВР Студио
#include <avr/eeprom.h>
eeprom_write_byte ((uint8_t*)0x01,bufC);
bufC=eeprom_read_byte((uint8_t*)0x01);
Немного не успел
eeprom_write_byte ((uint8_t*)0x01,bufC);
bufC=eeprom_read_byte((uint8_t*)0x01);
Немного не успел
-
alexval2006
- Прорезались зубы
- Сообщения: 225
- Зарегистрирован: Сб мар 10, 2007 20:05:39
- Откуда: валуйки
- Контактная информация:
Re: Работа с EEPROM на Си в АВР Студио
ARV большое спасибо я уже нашёл ваш пост в теме WIN AVR походу у авр GCC и WIN AVR синтаксис одинаков попробовал получилось а вот как в другие ячейки писать не понял а тут вы объяснили про переменные теперь дошло.
И всем откликнувшимся я тоже благодарен за участие.
И всем откликнувшимся я тоже благодарен за участие.
Re: Работа с EEPROM на Си в АВР Студио
А можно ли сделать так, чтоб Си программист ощущал себя Си программистом?? Т.е. объявляем переменную например - EEMEM int var1 и дальше работаем с ней как с обычной переменной как нам вздумается?
KIT
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Работа с EEPROM на Си в АВР Студио
это одно и то же: WinAVR и AVR-GCC.alexval2006 писал(а):походу у авр GCC и WIN AVR синтаксис одинаков
WinAVR - это комплект инструментария разработчика (toolchain), специально заточенный на AVR и работу в Windows.
O-LED, так сделано в IAR и CVAVR, однако я уже в другой теме высказывал свое мнение по этому поводу: сокрытие особенностей доступа к EEPROM может привести к печальным последствиям.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Работа с EEPROM на Си в АВР Студио
ARV
Скажите, а если используешь не встроенный еепром, а отдельную микросхему типа AT24Сххх, можно ли объявить переменную, расположить её в памяти AT24Сххх и обращаться к ней(и с ней) как к обычной переменной.(естественно помня про 1млн циклов у AT24Сххх)???
Я помню этот разговор..... Конечно надо следить для чего и как используешь еепром.O-LED, так сделано в IAR и CVAVR, однако я уже в другой теме высказывал свое мнение по этому поводу: сокрытие особенностей доступа к EEPROM может привести к печальным последствиям.
Скажите, а если используешь не встроенный еепром, а отдельную микросхему типа AT24Сххх, можно ли объявить переменную, расположить её в памяти AT24Сххх и обращаться к ней(и с ней) как к обычной переменной.(естественно помня про 1млн циклов у AT24Сххх)???
KIT
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Работа с EEPROM на Си в АВР Студио
этого нельзя ни в одном компиляторе. однако, подход WinAVR - работа через функции - позволит перейти на внешнюю EEPROM буквально заменой в коде только одной-двух функций, не нарушая весь прочий код, в то время как "прозрачный" код IAR или CVAVR потребует полного перелопачивания.O-LED писал(а):Скажите, а если используешь не встроенный еепром, а отдельную микросхему типа AT24Сххх, можно ли объявить переменную, расположить её в памяти AT24Сххх и обращаться к ней(и с ней) как к обычной переменной.(естественно помня про 1млн циклов у AT24Сххх)???
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Работа с EEPROM на Си в АВР Студио
А как записать/считать произвольную ячейку массива, объявленного в епром?
Например имею:
uint32_t EEMEM StOne[20];
Нужно найти в массиве первый элемент не равный 0xFFFFFFFF и записать туда новое значение. То есть я изначально не знаю в какую ячейку буду писать, и при поиске надо вычитывать и проверять ячейки по счётчику.
В CV всё понятно как делать. А в WinAVR?
Например имею:
uint32_t EEMEM StOne[20];
Нужно найти в массиве первый элемент не равный 0xFFFFFFFF и записать туда новое значение. То есть я изначально не знаю в какую ячейку буду писать, и при поиске надо вычитывать и проверять ячейки по счётчику.
В CV всё понятно как делать. А в WinAVR?
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: Работа с EEPROM на Си в АВР Студио
Dikoy писал(а):А как записать/считать произвольную ячейку массива, объявленного в епром?
Например имею:
uint32_t EEMEM StOne[20];
Нужно найти в массиве первый элемент не равный 0xFFFFFFFF и записать туда новое значение. То есть я изначально не знаю в какую ячейку буду писать, и при поиске надо вычитывать и проверять ячейки по счётчику.
В CV всё понятно как делать. А в WinAVR?
Код: Выделить всё
for(uint8_t i=0; i < TOTAL; i++){
if((int32_t)eeprom_read_dword(&StOne[i]) != -1){
// тут делаем свои черные дела
}
}битва с дураками проиграна, победители торжествуют. слава победителям!
Re: Работа с EEPROM на Си в АВР Студио
А не долговато это, брать адрес ячейки, которая и так уже вычислена по индексу?..
Может лучше утолкать массивы (их несколько) в структуру, чтобы компилятор гарантировано разместил их линейно в памяти, и так и брать ячейки по указателю с инкрементом +4?..
Может лучше утолкать массивы (их несколько) в структуру, чтобы компилятор гарантировано разместил их линейно в памяти, и так и брать ячейки по указателю с инкрементом +4?..
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: Работа с EEPROM на Си в АВР Студио
Dikoy писал(а):А не долговато это, брать адрес ячейки, которая и так уже вычислена по индексу?..
Может лучше утолкать массивы (их несколько) в структуру, чтобы компилятор гарантировано разместил их линейно в памяти, и так и брать ячейки по указателю с инкрементом +4?..
не беспокойтесь, компилятор сделает все максимально быстро, если вы включите оптимизацию
битва с дураками проиграна, победители торжествуют. слава победителям!
Re: Работа с EEPROM на Си в АВР Студио
Непосредственно работа с регистрами
Код: Выделить всё
// EEPROM Data Read Function - чтение байта из EEPROM по заданному адресу
unsigned char readEEPROM (unsigned int addr)
{
unsigned char data = 0;
while (EECR.1 != 0);
EEAR = addr;
EECR.0 = 1;
EECR.0 = 0;
data = EEDR;
return data;
}
// EEPROM Data Write Function - запись байта data в EEPROM по заданному адресу
void writeEEPROM (unsigned int addr, unsigned char data)
{
while (EECR.1 != 0);//eewe
EEAR = addr;
EEDR = data;
EECR.2 = 1; //eemwe
EECR.1 = 1;
}
// EEPROM Data Copy Function - копирование данных из ячейки в ячейку
void copyEEPROM (unsigned int saddr, unsigned char taddr)
{
writeEEPROM (taddr, readEEPROM (saddr));
}
// EEPROM 2-byte Data Write Function - запись двухбайтового числа в 2 последовательные ячейки с адресом первой addr
void _2bwriteEEPROM (unsigned int addr, unsigned int data)
{
writeEEPROM (addr, (unsigned char)(data / 256));
writeEEPROM (addr + 1, (unsigned char)(data % 256));
}
// EEPROM 2-byte Data Read Function - чтение двухбайтового числа из 2 последовательных ячеек с адресом первой addr
unsigned int _2breadEEPROM (unsigned int addr)
{
unsigned int data = 0;
data = 256 * readEEPROM(addr) + readEEPROM(addr + 1);
return data;
}
в спорах рождается ИСТИНА [AND] flud.
Re: Работа с EEPROM на Си в АВР Студио
Везде на входе адрес...
А если надо записать константу? Некое предопределённое, например, дефайном, число?
А если надо записать константу? Некое предопределённое, например, дефайном, число?
Re: Работа с EEPROM на Си в АВР Студио
Dikoy писал(а):Везде на входе адрес...
А если надо записать константу? Некое предопределённое, например, дефайном, число?
Имеется в виду - адрес EEPROM. А в data пихай что хошь - хоть константу, хоть переменную.
Re: Работа с EEPROM на Си в АВР Студио
Блин, это вынос мозга какой-то...
А как инкрементировать элемент массива в епром?
Неужели проще нельзя, чем так:
eeprom_write_dword(&eecounters[point],++eeprom_read_dword(&eecounters[point]) );
А как инкрементировать элемент массива в епром?
Неужели проще нельзя, чем так:
eeprom_write_dword(&eecounters[point],++eeprom_read_dword(&eecounters[point]) );
Re: Работа с EEPROM на Си в АВР Студио
Вопрос номер следующий.
А этими функциями в принципе можно записывать в епром знаковые переменные?
Вот есть у меня массивы:
uint16_t EEMEM eecounters[MASSIZE];
int32_t EEMEM StepperOne[MASSIZE];
int32_t EEMEM StepperTwo[MASSIZE];
Пробую разные варианты:
541 eeprom_write_dword(&(uint32_t*)StepperOne[5],0x33333333);
542 eeprom_write_dword(&StepperTwo[5],0x44444444);
543 eeprom_write_word(&eecounters[5],(eeprom_read_word(&eecounters[5]))++ );
Имею:
main.cpp: In function 'void __vector_1()':
main.cpp:541: error: lvalue required as unary '&' operand
main.cpp:542: error: invalid conversion from 'int32_t*' to 'uint32_t*'
main.cpp:542: error: initializing argument 1 of 'void __eewr_dword_m8(uint32_t*, uint32_t)'
main.cpp:543: error: lvalue required as increment operand
make: *** [release/obj/main.o] Error 1
И что с этим делать?... С преобразованиями типов я уже все танцы истанцевал, то одно ему не нравится то другое.
И как потом корректно считать знаковую переменную, если функции объявлены как беззнаковые: uint16_t eeprom_read_word (const uint16_t *addr) ?
А этими функциями в принципе можно записывать в епром знаковые переменные?
Вот есть у меня массивы:
uint16_t EEMEM eecounters[MASSIZE];
int32_t EEMEM StepperOne[MASSIZE];
int32_t EEMEM StepperTwo[MASSIZE];
Пробую разные варианты:
541 eeprom_write_dword(&(uint32_t*)StepperOne[5],0x33333333);
542 eeprom_write_dword(&StepperTwo[5],0x44444444);
543 eeprom_write_word(&eecounters[5],(eeprom_read_word(&eecounters[5]))++ );
Имею:
main.cpp: In function 'void __vector_1()':
main.cpp:541: error: lvalue required as unary '&' operand
main.cpp:542: error: invalid conversion from 'int32_t*' to 'uint32_t*'
main.cpp:542: error: initializing argument 1 of 'void __eewr_dword_m8(uint32_t*, uint32_t)'
main.cpp:543: error: lvalue required as increment operand
make: *** [release/obj/main.o] Error 1
И что с этим делать?... С преобразованиями типов я уже все танцы истанцевал, то одно ему не нравится то другое.
И как потом корректно считать знаковую переменную, если функции объявлены как беззнаковые: uint16_t eeprom_read_word (const uint16_t *addr) ?
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: Работа с EEPROM на Си в АВР Студио
eeprom_write_dword((void*)&StepperOne[5],0x33333333);Dikoy писал(а):И что с этим делать?
542 eeprom_write_dword((void*)&StepperTwo[5],0x44444444);
543 eeprom_write_word(&eecounters[5],(eeprom_read_word(&eecounters[5]))++ ); а здесь ++ недопустимо делать, т.к. результат функции - это не переменная
битва с дураками проиграна, победители торжествуют. слава победителям!
Re: Работа с EEPROM на Си в АВР Студио
--а здесь ++ недопустимо делать, т.к. результат функции - это не переменная
Мдя, не IAR...
Так что, переменную буфер заводить?..
eeprom_read_word(&eecounters[5]) сможет корректно считать знаковую переменную в буфер типа int_32?..
Мдя, не IAR...
Так что, переменную буфер заводить?..
eeprom_read_word(&eecounters[5]) сможет корректно считать знаковую переменную в буфер типа int_32?..
-
Мастер Ломастер
- Поставщик валерьянки для Кота
- Сообщения: 1995
- Зарегистрирован: Ср май 11, 2011 21:37:45
- Откуда: Цветочный город
- Контактная информация:
Re: Работа с EEPROM на Си в АВР Студио
и слава богуDikoy писал(а):Мдя, не IAR...
а куда оно денется? конечно сможетDikoy писал(а):eeprom_read_word(&eecounters[5]) сможет корректно считать знаковую переменную в буфер типа int_32?
битва с дураками проиграна, победители торжествуют. слава победителям!