Официальный сайт компании Arduino по адресу arduino.cc
Arduino неправильно считает
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Чт, 21/02/2019 - 04:16
Здравствуйте!
Тема в следующем: запилил алгоритм антидребезга, но у него ложные сработки/несработки.
Сделал трассировку переменных с выводом на экран и получил странные результаты:
DP11.drebezg: 1 DP11.counter: 1 && 100 DP11.drebezg: 1 DP11.counter: 2 && 100 DP11.drebezg: 1 DP11.counter: 3 && 101 DP11.drebezg: 1 DP11.counter: 4 && 100 DP11.drebezg: 1 DP11.counter: 5 && 100 DP11.drebezg: 1 DP11.counter: 6 && 100
Последние 3 цифры проверка условий. Третья результат логического умножения двух первых.
Обратите внимание
DP11.counter: 3 && 101
Логическое умножение 1 и 0 не может быть 1!
Код вывода строки такой:
SerialMon.print(" DP11.drebezg: " + String(DP11.drebezg) + " DP11.counter: " + String(DP11.counter) + " && "); SerialMon.print(DP11_current_state); SerialMon.print(!DP11.state); SerialMon.println((DP11_current_state & !DP11.state));
Следующий пример:
DP12.drebezg: 1 DP12.counter: 3 && 100 DP12.drebezg: 1 DP12.counter: 4 && 100 DP12.drebezg: 1 DP12.counter: 5 && 111 DP12.drebezg: 1 DP12.counter: 6 && 100
Строки DP12.counter: 5 && 111 не должно быть! Алгоритм исключает её печать! Ну хоть логическое умножение правильно посчитал.
Кто-нибудь может сказать, как такое происходит?
А где меняется DP11.state? Не в прерывании часом? И, кстати, DP11_current_state & !DP11.state это не логическая операция
Здравствуйте!
Тема в следующем:
Arduino неправильно считает
Здравствуйте!
Тема в следующем:
astray неправильно пишет программу.
Сколько ни старался, но никакого
логического умножения
там не нашёл.
Здравствуйте!
Тема в следующем:
Arduino неправильно считает
Здравствуйте!
Тема в следующем:
astray неправильно пишет программу.
Сколько ни старался, но никакого
логического умножения
там не нашёл.
Извините, я не знал, как вы это называете
А где меняется DP11.state? Не в прерывании часом? И, кстати, DP11_current_state & !DP11.state это не логическая операция
Чтобы сильно не позориться приведу участок кода. Может проясниться что-нибудь:
Недописанный класс обьекта, из которого берутся переменные
Запуск по таймеру
Туловище
И, собственно, сам участок кода, в котором ошибки срабатывания. Как буд-то ячейки памяти меняют свои показания с "0" на "1" в случайный момент времени, из-за этого полезный счетчик
выдает ошибки
Насколько я понимаю - выводится два одних числа, а результат - от действия над другими двумя.
ТС следует различать это & от этого &&. Си есть различия в = и == , + от ++ ну и так далее.
https://docs.microsoft.com/en-us/cpp/cpp/logical-and-operator-amp-amp?view=vs-2017
https://docs.microsoft.com/en-us/cpp/cpp/bitwise-and-operator-amp?view=v...
ТС следует различать это & от этого &&. Си есть различия в = и == , + от ++ ну и так далее.
Мне понятна разница между логическим умножением и логическим И. Но для типа данных boolean результат
и
Будет идентичным, не так ли?
Нашел ошибку в алгоритме - виноват двойной вызов подпрограммы
readS();
в процедуре setup пот таймеру Timer1 и в процедуре loop. Лишнее удалил. Тему можно удалять.
Всем спасибо!!!
Смотрим начальный топик и удивляемся . Ну да , это что на форуме в подкидного дурака играете, а потом из под полы кидаете козырного туза или джокера.