EEPROM
- Войдите на сайт для отправки комментариев
приветствую. вот уже несколько дней подряд парюсь над одним проэктом, суть которого - управление синтезатором 9850. Это радиолюбительский проэкт, кто в теме - тот поймет для чего синтезатор. Проблема возникла тогда, когда решил запрограммировать "Памяти", тобишь выставляешь частоту, нажимаешь на кнопку, к примеру "D", потом выбераешь нужную ячейку на цифровой клавиатуре, оно записывает текущее число в ЕЕПРОМ и дальше по алгоритму. Для моих целей потребовалось сохранение еще одного действующего значения частоты, для того, чтоб потом использовать это значение в расчете частоты с учетом сдвига по частоте, для получения необходимой промежуточной частоты, вобщем не так важно, как то, что эта функция исправно работает, а вот функция простого запоминания с тем же алгоритмом работать не хочет.
Значит память ЕЕПРОМ организована таким образом, что стандартная библиотека позволяет читать/писать ее побайтно. исходя из этого я организовал такую схему работы: для промежуточной частоты у меня используются первые 8 байтов: 0,1,2,3.....7. Код для записи у меня таков:
/////////////////////////// void eeprom_write() { //String eeprom_data; eeprom_data = (String)b; for(int i=start_addres; i<=start_addres+eeprom_data.length(); i++){ EEPROM.write(i, eeprom_data[i]); //Serial.println(i); delay(100); Serial.println(eeprom_data.charAt(i)); } start_addres=0; }
eeprom_data и остальные переменные определены слудющим образом:
int start_addres; int stop_addres; String eeprom_data;
Функция записи вызывается:
if (key== 0x43){ ////////если нажата кнопка "С", тогда..... lcd.clear(); lcd.setCursor(0,0); lcd.print("Set shift freq?"); lcd.setCursor(0,1); lcd.print(" No-* / Yes-#"); lab5: char key = kpd.get_key(); if(key != '\0') { tone(16, 5000, 5); if(key == 0x2A){ /////////если нажал кнопку "звездочка", тогда ничего ///// не происходит lcd.clear(); vfo(); } if(key ==0x23) { ///////если нажал кнопку "решетка", то тогда.... start_addres = 0; / stop_addres = 7; eeprom_clear(); //запись нулей в ячейки EEPROM с адресами от 0 до 7 eeprom_write(); //запись побайтно из переменной b в ячейки от 0 до 7 lcd.clear(); lcd.write("EEPROM alredy set"); lcd.setCursor(0,1); lcd.print(eeprom_data); delay(1000); lcd.clear(); LCD(); goto lab2; } } goto lab5; ////////////////go to the begin of Y/N EEPROM SET }
Напомню - этот участок кода рабтает четко и без нареканий. Проблема возникает тогда, когда я меняю значения
start_addres = 0; stop_addres = 7;
на
start_addres = 8; stop_addres = 15;
оно почему-то просто не хочет записывать то же самое значение переменной "b" в ячейки памяти с адресами от 8 до 15.
получается, что я хочу записывать первую память в промежуток 8-15, вторую в 16-23 и так далее. Код записи как для промежуточной частоты так и для памятей одинаковый, разные лишь значения
start_addres stop_addres
к слову в записи данных учавствует лишь стартовый адрес, в качестве стопового сумма значения стартового и длины строки. стоповый адрес участвует только в пердварительном стирании, ато мало ли.
кто что подскажет?
вот полный код
Из функции menu нет выхода. В ней вызывается vfo, из которой вызывается menu.
Море ненужных goto, особенно 114- строки.
С такой навороченной логикой контроллеру работать сложно .
В прерывания вывод в Serial.
Тут нужно все переписывать, потому что ошибки могут быть какими угодно.
было еще хуже, я дилетант и освоил мегу для того, чтоб сделать именно этот проект. оно все намучено, но работает и никаких тормозо, зависаний нет.
мою проблему с ЕЕПРОМ я хотел решить на стандартном примере, изменив правила перебора адресов - тоже не работает. где-то попадались записи о том, что работа с памятью немного кривая, черт его знает. если не заработает - буду разбираться с i2c eeprom. прибор получился хороший, хотелось бы хоть какой-то сервис. а на 114 строке была реализация входа в меню до того, как пришил i2c клавиатуру. ото полежит пару недель, потом сам сижу и разбираюсь - что я тут напрограммировал.