AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
13.03.2019, 10:22
|
|
Частый гость
Регистрация: 11.03.2019
Сообщений: 26
Сказал спасибо: 6
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Вопрос atmega 128.
Здравствуйте, пытаюсь сделать счетчик импульсов от 0 до 999. считает все ок. но вот вопрос с памятью. необходимо это число запоминать и при включении продолжать счёт. в даташите в примере
"void EEPROM_write(unsigned int uiAddress, unsigned char ucData)" , это ограничечивает максимальное значение 256, но в даташите максимальное значение в ячейке 4096 что более чем подходит, так вот. нужно ли разбивать число или можно использовать другие переменные не char?
|
|
|
|
13.03.2019, 11:35
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,378
Сказал спасибо: 1,948
Сказали Спасибо 1,327 раз(а) в 578 сообщении(ях)
|
Re: Вопрос atmega 128.
Сообщение от Yarikkasl
|
ограничечивает максимальное значение 256, но в даташите максимальное значение в ячейке 4096
|
Непонятно что вы имели в виду про макс значение 4096.
Память - что ОЗУ, что епром - имеет байтовую организацию. И считаете вы - тоже в байтах. Инкремент двухбайтового - это прибавление 1 к младшему и прибавление нуля с переносом к старшему...
Это так... в качестве ликбеза.
Я веду к тому, что записывать в епром надо так же - по байтам. Старший и младший..
Код:
|
EEPROM_write(addr, counter & oxFF)
EEPROM_write(addr+1, counter ›› 8) |
Если использовать компилятор IAR, и того проще - объявить int в eeprom, остальное дело компилятора.
Ну и не забывать что ресурс перезаписи епрома все же ограничен. И время записи в епром на порядки больше чем работа с ОЗУ.
__________________
[ жизнь приятна и красива, если выпить литр пива ]
Последний раз редактировалось nml; 13.03.2019 в 11:38.
|
|
|
|
13.03.2019, 12:51
|
|
Частый гость
Регистрация: 11.03.2019
Сообщений: 26
Сказал спасибо: 6
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Вопрос atmega 128.
Спасибо! Примерно понял. Так как регистр EEDR 8 битный то мне необходимо число разбивать, а для продления ресурса ПЗУ запись можно осуществить если значения отличаются. Код пишу в amtelstudio
|
|
|
|
13.03.2019, 13:10
|
|
Гражданин KAZUS.RU
Регистрация: 17.06.2008
Адрес: Украина
Сообщений: 675
Сказал спасибо: 360
Сказали Спасибо 753 раз(а) в 358 сообщении(ях)
|
Re: Вопрос atmega 128.
В тулчейнах в Atmel Studio (заголовочный файл eeprom.h) имеются готовые функции и/или макросы вида:
PHP код:
|
uint8_t eeprom_read_byte (const uint8_t *__p); uint16_t eeprom_read_word (const uint16_t *__p); uint32_t eeprom_read_dword (const uint32_t *__p); void eeprom_read_block (void *__dst, const void *__src, size_t __n);
|
Также имеются конструкции для eeprom_write_xxx и eeprom_update_xxx
|
|
|
Сказали "Спасибо" j-Roger
|
|
|
13.03.2019, 13:34
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,246
Сказал спасибо: 11,165
Сказали Спасибо 3,854 раз(а) в 2,925 сообщении(ях)
|
Re: Вопрос atmega 128.
Yarikkasl, для решения вопроса с ресурсом памяти - есть внешние часы реального времени и внешняя последовательная память (*24Cxx*)
В часах есть статический NVRAM.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
|
13.03.2019, 14:23
|
|
Частый гость
Регистрация: 11.03.2019
Сообщений: 26
Сказал спасибо: 6
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Вопрос atmega 128.
Спасибо, но думаю для началаначало нужно записывать и считывать научиться.
|
|
|
|
13.03.2019, 17:47
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,246
Сказал спасибо: 11,165
Сказали Спасибо 3,854 раз(а) в 2,925 сообщении(ях)
|
Re: Вопрос atmega 128.
Yarikkasl, читать и писать во внешнюю память тоже нужно учится, и это явно более востребовано. Писать во внутреннюю память такое явно не стоит, только для написания своего загрузчика использовать.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
|
13.03.2019, 17:51
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,378
Сказал спасибо: 1,948
Сказали Спасибо 1,327 раз(а) в 578 сообщении(ях)
|
Re: Вопрос atmega 128.
Сообщение от mike-y-k
|
Писать во внутреннюю память такое явно не стоит, только для написания своего загрузчика использовать.
|
Так речь не о флеше шла, а о епроме.
Его ресурса более чем хватит, если конечно не заставить в цикле писать
__________________
[ жизнь приятна и красива, если выпить литр пива ]
|
|
|
|
13.03.2019, 21:56
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,106
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
|
Re: Вопрос atmega 128.
Ресурс EEPROM гарантирует 100000 перезаписей.
У вас в 128-й меге его 4 килобайта.
Для того, чтобы получить ресурс в 4090*100000 перезаписей можно сделать так.
Нулевой байт EEPROM использовать не будем. После обращения к EEPROM полезно устанавливать его адресный регистр в 0000. Если произойдёт случайная запись ( при просадке/помехе по питанию, особенно когда отключен BOD), то запишется в нулевой байт.
В байтах 1 и 2 расположен eptr указатель на адрес используемой ячейки EEPROM.
В байтах 3 и 4 располагается ewctr счётчик перезаписей, а в байтах 5 и 6 значение вашего счётчика counter=0..999
После прошивки указатель eptr = 3, EEPROM[5..8]=00. При включении питания читаем указатель eptr = EEPROM[1,2], ваш счётчик: counter= EEPROM[eptr+2, eptr+3] и счётчик перезаписей ewctr=EPROM[eptr, eptr+1].
При каждой перезаписи counter наращиваем счётчик ewctr и записываем их оба в EEPROM[eptr...eptr+3].
Если ewctr==65535 eptr+=1; ewctr=0; дополнительно записываем eptr в EEPROM[1,2]. Да, теперь наши два счётчика записываются с перекрытием прежнего места, со сдвигом на один байт. Посчитайте, сколько раз будет перезаписана каждая ячейка EEPROM, с учётом того, что одинаковое значение не перезаписывается и младший байт размещён в младшем адресе памяти.
Последний раз редактировалось makakus; 13.03.2019 в 22:05.
|
|
|
Эти 2 пользователя(ей) сказали Спасибо makakus за это сообщение:
|
|
|
14.03.2019, 00:58
|
|
Вид на жительство
Регистрация: 10.04.2010
Сообщений: 301
Сказал спасибо: 25
Сказали Спасибо 136 раз(а) в 79 сообщении(ях)
|
Re: Вопрос atmega 128.
Сообщение от Yarikkasl
|
Спасибо! Примерно понял. Так как регистр EEDR 8 битный то мне необходимо число разбивать, а для продления ресурса ПЗУ запись можно осуществить если значения отличаются. Код пишу в amtelstudio
|
Это что за задача, в которой постоянно нужно писать именно в EEPROM более 100000 раз???
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 17:49.
|
|