Форум myROBOT.ru » Роботы и робототехника » Делимся опытом » Нужна помощь по С и программированию МК

Страниц (3): [1] 2 3 »
 

1. Def1988 - 14 Июня, 2009 - 15:42:03 - перейти к сообщению
Народ
у МК есть независемая память
я пользуюсь программой WinAVR
можно ли с помощью нее записать данные в независемую память и как это сделать
и потом как к ней обращаться
и можно ли использовать много мерные массивы???
2. Белый Волк - 14 Июня, 2009 - 17:04:25 - перейти к сообщению
Def1988
В datasheet для Вашего контроллера есть пример кода на C для записи в энергонезависимую память и для чтения из неё.
Да, использование многомерных массивов возможно.
3. Def1988 - 14 Июня, 2009 - 20:38:08 - перейти к сообщению
а если не сложно кинте несколько ссылок или название учебников где это можно найти
а то нечего умного найти не могу
4. Белый Волк - 15 Июня, 2009 - 05:32:15 - перейти к сообщению
Def1988
Какой микроконтроллер Вы используете?
5. Def1988 - 15 Июня, 2009 - 10:43:42 - перейти к сообщению
ATmega 8
6. Белый Волк - 15 Июня, 2009 - 15:03:26 - перейти к сообщению
Для ATmega8
Функция записи в EEPROM:

CODE:

void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
/* Wait for completion of previous write */
while(EECR & (1<<EEWE));
/* Set up address and data registers */
EEAR = uiAddress;
EEDR = ucData;
/* Write logical one to EEMWE */
EECR |= (1<<EEMWE);
/* Start eeprom write by setting EEWE */
EECR |= (1<<EEWE);
}


Функция чтения данных из EEPROM:
CODE:

unsigned char EEPROM_read(unsigned int uiAddress)
{
/* Wait for completion of previous write */
while(EECR & (1<<EEWE));
/* Set up address register */
EEAR = uiAddress;
/* Start eeprom read by writing EERE */
EECR |= (1<<EERE);
/* Return data from data register */
return EEDR;
}
7. Def1988 - 15 Июня, 2009 - 15:14:42 - перейти к сообщению
СПС большое
8. 1_ulyanovsk - 12 Марта, 2010 - 21:33:09 - перейти к сообщению
Действительно ли надо EEPROM при каждой записи стирать? Потому что когда я читаю данные из ячейки памяти 0x1E для mega8535 у меня показывает что туда записано 255 вместо записываемой цифры 3 (код не привожу).
Действительно ли надо EEPROM при каждой записи стирать?
9. nest - 13 Марта, 2010 - 03:05:03 - перейти к сообщению
1_ulyanovsk пишет:
Действительно ли надо EEPROM при каждой записи стирать?
нет.
Если у вас что то не записывается в eeprom, то что то вы сделали не так.
10. 1_ulyanovsk - 13 Марта, 2010 - 06:47:10 - перейти к сообщению
Я использую функции записи и чтения в еепром прямо как есть из датиша. В датише на 8535 написано что под адреса еепром отводится память от 0х1Е до 0х3Е. Когда я записываю в адрес 0х1Е тройку 3 то следующим шагом (программа читает еепром и выводит это число) я ожидаю увидеть ту же тройку а выскакивает 255 то есть все единицы, и так на всех адресах от 0х1Е до 0х3Е.. (и даже других адресах )))))))) Вот и подумал что раз там все единицы надо очищать.
11. nest - 13 Марта, 2010 - 14:18:09 - перейти к сообщению
не надо очищать.
либо у вас туда не пишется, либо оттуда не читается.
Ищите ошибку.
12. 1_ulyanovsk - 14 Марта, 2010 - 17:00:51 - перейти к сообщению
nest пишет:
не надо очищать.
либо у вас туда не пишется, либо оттуда не читается.
Ищите ошибку.


Вот нашел и работает :
Для WinAVR язык Си++ там тупо функция eeprom_write_byte(АДРЕС, ДАННЫЕ);
Вставил строчку и он без объяснения причин все сделал как надо, даже предварительно эту функцию объявлять не надо. Не знаете где в WinAVR хранятся описания функций и в частности eeprom_write_byte..? хотелосьбы знать как она работает.

И уж не знаю как тут относятся к рекламе чужих ресурсов поэтому позволю себе цитировать ARV. Вдруг еще кому поможет

eeprom_read_xxxx(uint8_t *adr) - считывает из EEPROM переменную, расположенную по адресу adr. вместо xxxx пишите byte, word или dword соответственно для чтения переменной размером в байт, 2 байта или 4 байта.

аналогично для записи имеются функции eeprom_write_xxxx(uint8_t *adr, ....) - вместо многоточия тип соответствующей переменной.
13. redcat - 14 Марта, 2010 - 17:29:47 - перейти к сообщению
1_ulyanovsk Отлично! Думаю пригодится.
Так-же от себя добавлю -
функция для чтения содержимого ФЛЕШ памяти
pgm_read_byte(addr); возвращает содержимое ячейки флеш памяти по адресу addr
14. mogikanin - 13 Февраля, 2011 - 10:41:02 - перейти к сообщению
Аналогичная проблема с записью/чтением EEPROM ATmega16(32). Прочитал этот раздел, попробовал все рекомендации - не получилось. Нельзя ли для чайника поподробнее?
У меня отлично работала программа на Ассемблере. Обстоятельства заставили переложить эту работающую программу на СИ. Все модули получились, а EEPROM упёрся - не поддаётся. Отладчик в Ассемблере пишет, что всё пишется/читается и железо тоже работает. Отладчик СИ выдаёт данные "FF" и железо тоже не работает. И в Ассемблере, и в СИ я использовал стандартные процедуры(функции). Например, void EEPROM_write(unsigned int uiAddress, unsigned char ucData). Пробовал и pgm_read_byte(addr); - её компилятор вообще не берёт. Может я не все модули "#include или #define"?
Всё-таки странно: для всех функций было достаточно "#include <avr/io.h>" и компилятор вытащил всё, что ему надо, а EEPROM - не работает. Использую WinAVR и AVRStudio4.
15. nest - 13 Февраля, 2011 - 11:46:19 - перейти к сообщению
mogikanin, дизасемблируйте прошивку и посмотрите, всё ли там верно работает.