Например TDA7294

Форум РадиоКот • Просмотр темы - Проблемы с EEPROM AtMega16
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт апр 16, 2024 16:05:54

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Проблемы с EEPROM AtMega16
СообщениеДобавлено: Сб авг 12, 2017 21:42:04 
Родился

Зарегистрирован: Пт мар 27, 2015 19:14:47
Сообщений: 5
Рейтинг сообщения: 0
Здравствуйте уважаемые форумчане!
Прошу оказать содействия в части написания программы на языке Си, в среде AVR-Studio для AtMega16-PU, работающий на частоте 16 мГц в корпусе DIP-40.
Вкратце суть проблемы: имеется компьютерный блок питания переделанный под ИРН. Устанавливается нужное напряжение или ток энкодером. При нажатии на кнопку энкодера, выставленное напряжение фиксируется программным отключением опроса энкодера, тем самым исключается возможность случайно сбить выставленное напряжение или ток. Всё отлажено, всё работает, душа радуется. А что бы каждый раз не крутить ручку энкодера после подачи напряжения на ИРН, я решил сохранять текущее значение регистра OCR0, отвечающего за работу ШИМ, в EEPROM. В теории должно было быть так: нужно мне 12 Вольт, я выставляю, нажимаю кнопку фиксации напряжения, работа энкодера блокируется, а значение регистра OCR0 заносится в ПЗУ. Поработал, отключил питание, покурил, снова включаю ИРН и после инициализации программы и теста семисегментного индикатора, читаю из ПЗУ значение переменной и отправляю её в OCR0. В итоге у меня на выходе те же 12 В. И ничего крутить не надо.
На практике же не хочет он у меня ни записывать, как я понял, ни читать. Читает только один раз после прошивки, когда происходит сброс после программирования, причём значение переменной равно 0xFF, на основании чего я и делаю вывод, что туда ничего и не записывалось. Если же просто передёрнуть питание, то стартовое значение OCR0 равно 0, как будто у меня в программе и нет этих строк.
При запуске в симуляторе AVR-Studio всё работает как часы, в железе нет! Пример написания функций чтения и записи EEPROM взят из книги А. В. Евстифеева «Микроконтроллеры семейств Tiny и Mega фирмы ATMEL».
Ещё бы хотел заметить, что это моё не первое обращение к EEPROM. Делал я музыкальный звонок на AtMega16 + SD-card на 16 мелодий, там номер проигранного файла увеличивается на единицу и сохраняется в ПЗУ. При последующем включении, номер воспроизводимого файла читается из ПЗУ и так по кругу. Причём кроме:
#include "eeprom.h"
и двух строк
trek = eeprom_read_byte(0);//читаем содержимое переменной из ЕЕПРОМ
и
eeprom_write_byte(0, trek); // записываем новые данные в EEPROM
больше в программе ничего нет связанного с ПЗУ.
Код естественно не мой, сборный с просторов инета, немало я с ним тоже повозился, адаптируя, но всё работает уже как года два.
Тот же подход я применил и к текущей задаче, но выходит такой вот облом. Пошёл к Евстифееву, написал две функции один в один по его примерам:
//=========
//Функция чтения байта из EEPROM
//=========
void EEPROM_read(unsigned char Adres)
{
EEAR=Adres;// загрузить адрес используемой ячейки
EECR |=(1<<EERE);// установить бит разрешающий чтение
EncData= EEDR;// прочитать данные из ячейки
}
//=========
//Функция записи байта в EEPROM
//=========
void EEPROM_write(unsigned char Adres, unsigned char EncData)
{
EEAR=Adres;// загрузить адрес используемой ячейки
EEDR=EncData;//загрузить сохраняемые данные
EECR |=(1<<EEMWE);// установить бит разрешающий запись
EECR |=(1<<EEWE);// записать данные в ячейку
}
обращаюсь к ним из программы:
EEPROM_read(Adres);//читаем содержимое переменной из ЕЕПРОМ
и
EEPROM_write(Adres,EncData); // записываем текущее значение EncData в EEPROM
но, ничего это мне не дало.
Вот и прошу совета, может я что-то и упустил из виду. Сам уже не знаю, в какую сторону копать. Грешу ещё на МК, но он у меня впаян, поэтому и решил спросить совета, прежде чем выпаивать.
Извиняюсь, что много букв получилось. Спасибо!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблемы с EEPROM AtMega16
СообщениеДобавлено: Сб авг 12, 2017 22:42:01 
Друг Кота

Зарегистрирован: Вт мар 13, 2012 12:16:13
Сообщений: 6865
Откуда: .ru
Рейтинг сообщения: 0
а ещё в даташите перед записью (чтением) байта в EEPROM рекомендуют сначала проверять окончание предыдущей записи в EEPROM...

while(EECR & 0b00000010); // Ожидаем окончание предыдущей записи // По окончании записи бит EEWE сбрасывается аппаратно.

кто его знает.. как часто вызываются функции...

void EEPROM_write ...
void EEPROM_read ...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблемы с EEPROM AtMega16
СообщениеДобавлено: Вс авг 13, 2017 07:05:41 
Собутыльник Кота
Аватар пользователя

Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04
Сообщений: 2690
Откуда: г. Чайковский
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Sebor писал(а):
EECR |=(1<<EEMWE);// установить бит разрешающий запись
EECR |=(1<<EEWE);// записать данные в ячейку
Данная последовательность должна быть выполнена не более чем за 4 такта. При выключенной оптимизации скомпилируется скорее всего в большее. Кроме того надо выключить прерывания. Есть библиотечная функция, посмотрите ее.

_________________
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Проблемы с EEPROM AtMega16
СообщениеДобавлено: Вс авг 13, 2017 16:41:29 
Друг Кота
Аватар пользователя

Карма: 46
Рейтинг сообщений: 2030
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Сообщений: 6618
Откуда: Сердце Пармы
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
хз, в кодевижне просто объявил переменную в еепроме и обращайся с ней как с обычной.
пс знаю, что не самая лучшая программа (в плане качества результата) но мне не в космос на ней летать — у меня на этот случай ассемблер. :)

_________________
Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...


Вернуться наверх
 
Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Проблемы с EEPROM AtMega16
СообщениеДобавлено: Вс авг 13, 2017 21:10:18 
Родился

Зарегистрирован: Пт мар 27, 2015 19:14:47
Сообщений: 5
Рейтинг сообщения: 0
а ещё в даташите перед записью (чтением) байта в EEPROM рекомендуют сначала проверять окончание предыдущей записи в EEPROM...

while(EECR & 0b00000010); // Ожидаем окончание предыдущей записи // По окончании записи бит EEWE сбрасывается аппаратно.

кто его знает.. как часто вызываются функции...

void EEPROM_write ...
void EEPROM_read ...


Я обратил на это внимание, но думал, что отправляю всего один байт и только по нажатию кнопки. Так что бы не топтаться там ожидая, решил пропустить этот момент.
Дописал эти строки - результат нулевой.

Добавлено after 10 minutes 11 seconds:
Sebor писал(а):
EECR |=(1<<EEMWE);// установить бит разрешающий запись
EECR |=(1<<EEWE);// записать данные в ячейку
Данная последовательность должна быть выполнена не более чем за 4 такта. При выключенной оптимизации скомпилируется скорее всего в большее. Кроме того надо выключить прерывания. Есть библиотечная функция, посмотрите ее.


Честно сказать, никогда не обращал внимания на оптимизацию, т. к. не считаю себя таким уж программистом, да и не приходилось впихивать невпихуемое :)) . Как оказалось оптимизация на максимуме и просмотр кода в пошаговом режиме в дизассемблере показал, что так оно и есть. Про прерывания знаю и не забыл отключить перед вызовом функции с последующим включением.

Добавлено after 1 hour 39 minutes 58 seconds:
Всем привет! Вопрос решён, в том плане, что всё работает, как и было задумано. Осталось только вкурить-почему? Функция чтения из ПЗУ у меня вызывалась из подпрограммы тестирования индикатора
//=========
//Функция проверки индикатора
//=========
void TestSeg(void)
{
HighData=0x00;//включить все сегменты ст разряда
MidiData=0x00;//включить все сегменты ср разряда
LitlData=0x00;//включить все сегменты мл разряда
if(TimTest>=5000){
Dis_Fun &=~(1<<3);// отключить тест индикатора
Dis_Tim &=~(1<<2);// отключить таймер тестового режима
Dis_Tim |=(1<<0);//вкл таймер на работу энкодера
TimTest=0;
cli();
EEPROM_read(Adres);//читаем содержимое переменной из ЕЕПРОМ
EncData=EEDR;//
OCR0=EncData;// отпрвить в регистр ШИМ
sei();
}
}
На мой взгляд, вроде ничего криминального, но чтение как бы игнорировалось. Я попробовал перенести строки обращения к ПЗУ в самое начало программы, по окончании инициализации, перед тем как разрешить прерывания перед главным циклом программы. И всё как бы встало на свои места,
с каким напряжением блок выключил, с таким он и включился. В тонкостях попробую разобраться, если хватит сала в голове. Всем спасибо!


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Проблемы с EEPROM AtMega16
СообщениеДобавлено: Ср ноя 15, 2017 13:50:15 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 20
Рейтинг сообщений: 648
Зарегистрирован: Пт май 31, 2013 17:14:38
Сообщений: 2081
Откуда: Украина, Винница
Рейтинг сообщения: 0
хз, в кодевижне просто объявил переменную в еепроме и обращайся с ней как с обычной.
пс знаю, что не самая лучшая программа (в плане качества результата) но мне не в космос на ней летать — у меня на этот случай ассемблер. :)

В ИАРе так же в плане переменных, а качество компилятора получше.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблемы с EEPROM AtMega16
СообщениеДобавлено: Ср ноя 15, 2017 16:28:44 
Мудрый кот

Карма: 20
Рейтинг сообщений: 145
Зарегистрирован: Вс дек 25, 2016 08:34:54
Сообщений: 1849
Рейтинг сообщения: 0
Чтение
Спойлер
Код:
unsigned char EEPROM_read(unsigned int uiAddress)
{
/* Wait for completion of previous write */
while(EECR & (1<<EEPE));
/* Set up address register */
EEAR = uiAddress;
/* Start eeprom read by writing EERE */
EECR |= (1<<EERE);
/* Return data from Data Register */
return EEDR;
}
Запись
Спойлер
Код:
void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
/* Wait for completion of previous write */
while(EECR & (1<<EEPE));
/* Set up address and Data Registers */
EEAR = uiAddress;
EEDR = ucData;
/* Write logical one to EEMPE */
EECR |= (1<<EEMPE);
/* Start eeprom write by setting EEPE */
EECR |= (1<<EEPE);
}
Обратите внимание
Спойлер
Код:
/* Wait for completion of previous write */
while(EECR & (1<<EEPE));
и на
Код:
unsigned int uiAddress


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Проблемы с EEPROM AtMega16
СообщениеДобавлено: Ср ноя 15, 2017 21:11:29 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
Z_h_e писал(а):
Есть библиотечная функция, посмотрите ее
безоговорочно правильный совет!

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 24


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y