как бобедить искажение данных в EEPROM?
- Войдите на сайт для отправки комментариев
Немного дополнил стандартный пример работы с IR библиотекой.
Программа принимает и декодирует сигналы ик пультов, сохраняет в оперативную память и по нажатию кнопки отправляет эту команду через ик диод.
Я хочу сделать так чтоб принятая команда сохранялась в EEPROM и была доступна после перезагрузки ардуины.
Сейчас то что у меня получилось читает данные из памяти, в мониторе порта печатает правильные данные, но отправляемая команда уже искажена и не распознается устройством назначения.
Если принять ик команду с пульта она записывается в переменную CodeValue и в указаную ячейку eeprom. В таком случае команда распознается. После перезагрузки ардуины команда чичитается из указаной ячейки в переменную CodeValue и уже не распознается.
С переменной CodeType делается все тоже самое, но с ней проблем нет.
В чем может быть моя ошибка?
Скетч сейчас выложу в следующем сообщении.
Вы запутались в адресах. Вы пишете в одни адрес, а читаете из других.
Посмотрите на строки 64-65.
1. Зачем это делать в глобальном пространстве?
2. Зачем такие хитрожопости с параметрами. Вы потом это place везде используете, Вы точно уверены, что знаете чему она в итоге равна?
Ну и кроме того, совсем непоянтно зачем такие сложные навороты в функциях стр. 280-317. На вскидку, там вроде нормально, но зачем столько наворпчавть там, где это делается в одну строку? Ошибок насобирать?
Убирте, хитрожпости, будье проще и всё получится.
А как без перемеменной place загонять адреса в алгоритм сохранения и чтения?
Да и в мониторе порта после чтения печатается значение эдентичное принятому с пульта. Может оно видоизменяется в процесе записи/ чтения?
Ответьте на вопрос (себе, мне не надо) что делает переменная place вот в этих конструкциях?
А про печать, так Вы же бред какой-то печатаете.
Ну, смотрите, Вы прочитали что-то там и поместили в переменную result (стока 306). А печатаете зачем-то переменную codetype. Зачем? Чуть позже, после выхода из функции, codetype получит тоже значение, что сейчас в result, но это быдет после выхода. Вы же печатаете её внутри функции.
Переменнач place нужна для зопоминания следующей кнопки в другие адреса. Я это убрал из кода, чтоб не нагружать чтением того кто откликнется.
Да и не описывать же заново процедуру чтения и записи для каждого адреса. Адрес проще хранить в переменной, которая меняется в зависимоти от того что именно мы хотим сохранить. Если знаете способ проще подскажите.
Блин, Вы вопрос слышите? Что она делает конкретно в тех двух строках, которы я привёл. Вы можете ответить?
Ну, а про печать Вы всё поняли, да? Вы уж что прчитали, то и печатайте. Или Вы не понимаете, что прочитали? Код сами писали?
Сам писал. Про печать понял. В этих двух строка в эту переменную помещается адрес по которому хранится тип кода, а затем адрес в котором хранится значение кода.
Ну, слава Богу.
А теперь смотрим на две функции в строках 280-317
Ответьте на вопрос, для чего у них параметр address, если внутри он никак не используется?
Остались мусором .проблема в них?
Нет, проблема в чрезмерном, ненужном усложнении программы. Строки 280-317 можно заменить на 2 (прописью "Две") строки. Все строки, начинающиеся с "place =" можно и нужно выбросить. Программа сократится вдводе и, главное, упросттится и Вы перестанете в ней путаться.
Подскажите мне эти две строки пожалуйста. Буду примного благодарен
Как видите, никакая- place там не используется, поэтому смело её выбрасывайте и пользуйтесь параметрами.
А как менять значение параметра adress?
Просто передавать значение.
saveToEeproma(0);
или
int kaka = 4;
saveToEeproma(kaka)
Спасибо. Сейчас испытаю.
я бесконечно вам благодарен. у меня все получилось.
maximooos,можно сюда окончательный ,исправленНый код,пожалуйста?
UPD by Yarik.Yar, 26.12.2016, 17:25 - Ещё бы капсом написали...Не используйте жирный шрифт без надобности и следите за грамматикой, господа.
да пожалуйста.
но проблема все таки осталась.
в мониторе порта после перезагрузки ардуины печатаются правильные значения, но телек на них не реагирует.
пишет Sent NEC 20DF40BF
int
codeType = NEC;
unsigned
long
codeValue =
551502015; что в десятиричной системе значит то же самое
все. разобрался. нужно сохранять еще и длину кода.
строка 45
вот рабочий код
та версия кода, что я выкладывал в начале тоже работает, если добавить в ней сохранение/чтение codeLen