Работа с EEPROM на Си в АВР Студио

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
alexval2006
Прорезались зубы
Сообщения: 225
Зарегистрирован: Сб мар 10, 2007 20:05:39
Откуда: валуйки
Контактная информация:

Работа с EEPROM на Си в АВР Студио

Сообщение alexval2006 »

Добрый вечер всем.
Интересует такой вопрос Работа с EEPROM на Си в АВР Студио как я знаю для Си в авр студио использована AVR GCC научите как записать байт в ячейку EEPROM и как его оттуда прочитать был бы очень признателен.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Работа с EEPROM на Си в АВР Студио

Сообщение ARV »

для работы с 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 компилятор будет распределять между переменными самостоятельно, и вам не надо будет даже про них знать:

Код: Выделить всё

#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);
}
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
OBIVAN
Встал на лапы
Сообщения: 84
Зарегистрирован: Вт ноя 25, 2008 18:56:41

Re: Работа с EEPROM на Си в АВР Студио

Сообщение OBIVAN »

#include <avr/eeprom.h>

eeprom_write_byte ((uint8_t*)0x01,bufC);

bufC=eeprom_read_byte((uint8_t*)0x01);
Немного не успел :)
alexval2006
Прорезались зубы
Сообщения: 225
Зарегистрирован: Сб мар 10, 2007 20:05:39
Откуда: валуйки
Контактная информация:

Re: Работа с EEPROM на Си в АВР Студио

Сообщение alexval2006 »

ARV большое спасибо я уже нашёл ваш пост в теме WIN AVR походу у авр GCC и WIN AVR синтаксис одинаков попробовал получилось а вот как в другие ячейки писать не понял а тут вы объяснили про переменные теперь дошло.
И всем откликнувшимся я тоже благодарен за участие. :)
Аватара пользователя
O-LED
Мудрый кот
Сообщения: 1800
Зарегистрирован: Вт окт 05, 2010 01:08:57
Контактная информация:

Re: Работа с EEPROM на Си в АВР Студио

Сообщение O-LED »

А можно ли сделать так, чтоб Си программист ощущал себя Си программистом?? Т.е. объявляем переменную например - EEMEM int var1 и дальше работаем с ней как с обычной переменной как нам вздумается?
KIT
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Работа с EEPROM на Си в АВР Студио

Сообщение ARV »

alexval2006 писал(а):походу у авр GCC и WIN AVR синтаксис одинаков
это одно и то же: WinAVR и AVR-GCC.
WinAVR - это комплект инструментария разработчика (toolchain), специально заточенный на AVR и работу в Windows.

O-LED, так сделано в IAR и CVAVR, однако я уже в другой теме высказывал свое мнение по этому поводу: сокрытие особенностей доступа к EEPROM может привести к печальным последствиям.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
O-LED
Мудрый кот
Сообщения: 1800
Зарегистрирован: Вт окт 05, 2010 01:08:57
Контактная информация:

Re: Работа с EEPROM на Си в АВР Студио

Сообщение O-LED »

ARV
O-LED, так сделано в IAR и CVAVR, однако я уже в другой теме высказывал свое мнение по этому поводу: сокрытие особенностей доступа к EEPROM может привести к печальным последствиям.
Я помню этот разговор..... Конечно надо следить для чего и как используешь еепром.
Скажите, а если используешь не встроенный еепром, а отдельную микросхему типа AT24Сххх, можно ли объявить переменную, расположить её в памяти AT24Сххх и обращаться к ней(и с ней) как к обычной переменной.(естественно помня про 1млн циклов у AT24Сххх)???
KIT
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Работа с EEPROM на Си в АВР Студио

Сообщение ARV »

O-LED писал(а):Скажите, а если используешь не встроенный еепром, а отдельную микросхему типа AT24Сххх, можно ли объявить переменную, расположить её в памяти AT24Сххх и обращаться к ней(и с ней) как к обычной переменной.(естественно помня про 1млн циклов у AT24Сххх)???
этого нельзя ни в одном компиляторе. однако, подход WinAVR - работа через функции - позволит перейти на внешнюю EEPROM буквально заменой в коде только одной-двух функций, не нарушая весь прочий код, в то время как "прозрачный" код IAR или CVAVR потребует полного перелопачивания.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Dikoy
Встал на лапы
Сообщения: 90
Зарегистрирован: Сб июл 18, 2009 21:38:43

Re: Работа с EEPROM на Си в АВР Студио

Сообщение Dikoy »

А как записать/считать произвольную ячейку массива, объявленного в епром?
Например имею:
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){
      // тут делаем свои черные дела
   }
}
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
Dikoy
Встал на лапы
Сообщения: 90
Зарегистрирован: Сб июл 18, 2009 21:38:43

Re: Работа с EEPROM на Си в АВР Студио

Сообщение Dikoy »

А не долговато это, брать адрес ячейки, которая и так уже вычислена по индексу?..
Может лучше утолкать массивы (их несколько) в структуру, чтобы компилятор гарантировано разместил их линейно в памяти, и так и брать ячейки по указателю с инкрементом +4?..
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Работа с EEPROM на Си в АВР Студио

Сообщение Мастер Ломастер »

Dikoy писал(а):А не долговато это, брать адрес ячейки, которая и так уже вычислена по индексу?..
Может лучше утолкать массивы (их несколько) в структуру, чтобы компилятор гарантировано разместил их линейно в памяти, и так и брать ячейки по указателю с инкрементом +4?..

не беспокойтесь, компилятор сделает все максимально быстро, если вы включите оптимизацию :) а вот с указателем фокусничать не советую
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
demson
IT KT
Сообщения: 1309
Зарегистрирован: Пн авг 25, 2008 08:49:33
Контактная информация:

Re: Работа с EEPROM на Си в АВР Студио

Сообщение demson »

Непосредственно работа с регистрами

Код: Выделить всё

// 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.
Аватара пользователя
Dikoy
Встал на лапы
Сообщения: 90
Зарегистрирован: Сб июл 18, 2009 21:38:43

Re: Работа с EEPROM на Си в АВР Студио

Сообщение Dikoy »

Везде на входе адрес...
А если надо записать константу? Некое предопределённое, например, дефайном, число?
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Работа с EEPROM на Си в АВР Студио

Сообщение Jack_A »

Dikoy писал(а):Везде на входе адрес...
А если надо записать константу? Некое предопределённое, например, дефайном, число?


Имеется в виду - адрес EEPROM. А в data пихай что хошь - хоть константу, хоть переменную.
Аватара пользователя
Dikoy
Встал на лапы
Сообщения: 90
Зарегистрирован: Сб июл 18, 2009 21:38:43

Re: Работа с EEPROM на Си в АВР Студио

Сообщение Dikoy »

Блин, это вынос мозга какой-то...
А как инкрементировать элемент массива в епром?
Неужели проще нельзя, чем так:
eeprom_write_dword(&eecounters[point],++eeprom_read_dword(&eecounters[point]) );
Аватара пользователя
Dikoy
Встал на лапы
Сообщения: 90
Зарегистрирован: Сб июл 18, 2009 21:38:43

Re: Работа с EEPROM на Си в АВР Студио

Сообщение Dikoy »

Вопрос номер следующий.
А этими функциями в принципе можно записывать в епром знаковые переменные?
Вот есть у меня массивы:
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 на Си в АВР Студио

Сообщение Мастер Ломастер »

Dikoy писал(а):И что с этим делать?
eeprom_write_dword((void*)&StepperOne[5],0x33333333);
542 eeprom_write_dword((void*)&StepperTwo[5],0x44444444);
543 eeprom_write_word(&eecounters[5],(eeprom_read_word(&eecounters[5]))++ ); а здесь ++ недопустимо делать, т.к. результат функции - это не переменная
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
Dikoy
Встал на лапы
Сообщения: 90
Зарегистрирован: Сб июл 18, 2009 21:38:43

Re: Работа с EEPROM на Си в АВР Студио

Сообщение Dikoy »

--а здесь ++ недопустимо делать, т.к. результат функции - это не переменная
Мдя, не 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?
а куда оно денется? конечно сможет
битва с дураками проиграна, победители торжествуют. слава победителям!
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»