Помогите выловить ошибку.
- Войдите на сайт для отправки комментариев
Пт, 23/09/2016 - 07:20
Господа и снова приветствую. С месяц, а то и два, назад писал скетч. Недели с три он перекрасно работал, но потом по глупости спалил мк. Поменял/ Заливаю заново тот же скетч и упираюсь в ошибку.
#define INTERVAL2 4000UL ... static unsigned long previousMillis2 = 0; static byte flag2 = 0; // смена даты/день if (millis() - previousMillis2 > INTERVAL2) { previousMillis2 = millis(); if (flag2 == 0) flag2 = 1; else flag2 = 0; } Serial.print(flag2);
В теории flag2 должен принимать значения 0 или 1 раз в 4 секунды. На практике только 0. Если считывать значение flag2 после строки previousMillis2 = millis();, то получаю 128. Откуда такое значение не понимаю, в коде больше нет упоменаний flag2. Все глаза сломал.
Неполный код - это плохо.
Для примера, посмотрите код в стартовом топике вот здесь. Представьте, что я дал бы Вам setup, без awfulShitCode. Много бы Вы там ошибое нашли?
строки 164 - 177
скобки посмотри
http://arduino.ru/Reference/Else
Добавьте, пожалуйста печать переменной flag перед строкой 137 (с переводом строки) и печать чего угодно (хоть "-----" перед строкой 229. Скопипастите, пожалуйста печать в сериал мониторе. Хочется посмотреть
скобки посмотри
http://arduino.ru/Reference/Else
Попробоал так
Не помогло.
Добавьте, пожалуйста печать переменной flag перед строкой 137 (с переводом строки) и печать чего угодно (хоть "-----" перед строкой 229. Скопипастите, пожалуйста печать в сериал мониторе. Хочется посмотреть
Грубо говоря получилось так:
3
------3
------3
------3
------3
И до бесконечности.
gergi, нет, что-то не сходится. Получается. что Ваша печать (строка 177) не отрабатывала? Не может быть. Или Вы убрали её? Зачем. Возвращайте обратно. КРоме того, добавьте ещё печатей - вместо строк 166-177 вставьте вот так
Думаю, по тпакой печати и сима разюерётесь в проблеме, но если нет - давайте сюда что выдаст. ТОлько тогда уж и актуальную версию текста, чтобы лече было смотреть, а то изменений много.
Каюсь, 177 строка была убрана когда проделывал Ваши манипуляции из 5 поста.
Сейчас выдает следующее:
Вдруг поможет. Писал скетч на старой arduino IDE/ Сейчас заливаю с последней версии.
Так дайте актуальную версию текста скетча. а то много поменялось, а я хочу просто по тексту идти и сравнивать с печатью.
все в первом сообщении. 177 строчка нужна была для контроля, на функционал программы не влияет.
Не могу понять откуда flag2 получает значение 128. Хрен с ним, отредактировал код под это значение:
Частично заработало. Но! Не работает интервал указзанный в строке №13 #define INTERVAL2 4000UL. В теории: значение flag2 должно менятся через каждые 4 секунды (INTERVAL2 4000UL). На практике меняется раз 5 за 1секунду.
нет, так нельзя. Если поведение программы непонятно, надо искать причину. Иначе Вы только замаскируете проблему, а не решите.
Я готов Вам помочь и вместе дожать, но давайте Вы будете показывать мне всё (например, откуда Вы взяли 128? Мне Вы это не показали!) и будете делать. что я говорю, чтобы я не просил у Вас свежую версию скетча по пять раз.
Давайте сюда свежую версию скетча (с 0, а не со 128) и её печать.
Евгений, скетч не меняется. Про не понятное значение flag2 "128" я описал в самом первом посте. Для чистоты проб давайте возьмем скетч из 2го поста.
Нет, мне нужен скетч с теми печатами, что Вы вставили, понимаете. Я просто хочу пальцем вести по коду и смотреть, что печатается. Т.е. мне нужен скетч со всеми печатями и собственно что он печатает.
Только знаете, что Вы ставляли печати из моего поста №8. Поправьте тот кусок таким образом:
И после этого, жду от Вас полного скетча и копии того, что он печатает.
Ага, при первом проходе у Вас flag2 в порядке. Но уже при втором он стал 128, что невозможно, т.к. Вы нигде ему такого не присваиваете.
Вывод - Вы где-то "распахиваете" память. Это ни в коем случае нельзя маскировать, как Вы пытались, потому что глюки от таких дел могут вылазить любые и в любых местах. Это надо обязательно локализовать и исправить.
Думаю, что проблема в строке 214. Но, на всякий случай. чтобы нам с Вами не неделю тут ковыряться, давайте поставим контрольные печати почаще и выловим этот момент, с Божьей помощью.
Итак, сейчас Вы делаете вот такую строку:
И вставляете её обязательно перед и после строки 214. Также, на всякий случай поставьте после строк 221 и 230. Если не лень, то понаставьте и больше в этом районе, хоть через строчку.
Только обязательно при кажой вставке меняйте номер (там вместо #1 пишите #2, #3, и т.д.) чтобы потом, разбирая печать, мы понимали из какого именно места это было напечатано.
Думаю, мы так поймаем где портится память.
Мне можно дать не весь скетч, а только кусок от нынешней строки 163 и до конца, ну и обязательно печать целиком.
На скорую руку закоментировал строку №214. Всё заработало как надо. Вы были правы.
Единственное не пойму с какой радости вдруг такой косяк. Скетч был рабочим на 100%, отработал 3 недели без косяков.
Распашка памяти вещь абсолютно непредсказуемая. Может быть всё. что угодно. Может и год работать. Вы не смотрели пример, которыя я давал в первом посте? Там ведь можно мозг вынести - явно написано одно, а печатается другое. Тоже распашка памяти.
Косяк-то Ваш понятен. Кстати, у Вас ещё один точно такой же в строке 202
Не подскажете где почитать про данный косяк и способ решения?
P.S. Изменил значение в строке №37 на:
Программа зароботала полностью как и раньше!
Евгений, спасибо за помощь.
gergi,
есть правило в программировании - никогда не работать вслепую. Я не зря просил Вас делать печати. Теперь позвольте дать Вам совет. Те строки с функцией strcpy_P по идее должны копировать данные из програмной памяти в оперативную. так? Так вот, вставьте сразу после этих строк печать buffer - просто, чтобы убедиться. что копируется именно то, что нужно.