Прошу оказать содействия в части написания программы на языке Си, в среде 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
но, ничего это мне не дало.
Вот и прошу совета, может я что-то и упустил из виду. Сам уже не знаю, в какую сторону копать. Грешу ещё на МК, но он у меня впаян, поэтому и решил спросить совета, прежде чем выпаивать.
Извиняюсь, что много букв получилось. Спасибо!



