Здравствуйте.Вот код.А проблема в том что програма не дожидаясь выполнения условия почему-то начинает выводить числа на дисплей и в последовательный порт в размере integer при этом у меня меняется напряжение скачет от 0 до 5 вольт на выводе прерывания МК.Провод от монетника я отсоединил реакция та же программа виснет при постоянно разных суммах.Проследить зависимости не получается и ошибок в коде не вижу.Сижу туплю. Причем после удаления кода для ЖК МК и понетник дружат прекрасно и в порт выводится корректная сумма импульсов
Тут вижу одну проблему явную и одну - не очень. Первая - нет атомарного чтения counter (см. ATOMIC_BLOCK) , вторая - скорее всего нет подтяжки на пине, его и болтает туда-сюда.
Ну, и использование Serial.println() в обработчике прерывания - не лучшая идея.
Во-первых, Сериал в прерывании использовать стоит только в том случае, если четко понимаете, что делать. Это явно не про вас. Для новичков существует правило - "Сериал в прерывании не работает"
Во-вторых, совершенно неясно, зачем при каждом входе в loop заново иннициализировать дисплей
пробуй убрать \ закомментировать строки относящиеся к дисплею. выводи в сериал... делал поделку на энкодере, который работал на том же прерывании с обычным дисплеем 1602 - все работало.потом решил поставить i2C начались похожие проблемы. не дружит библиотека с прерываниями наверно.
сопротивление подтяжки ставь 1 к. там открытый коллектор и короткий импульс. все должно отработать быстро с максимально не затянутыми фронтами.
Условный переход в лупе мне нужно запихнуть в atomic block restorate?Одно я понял что мне нужно сохранить состояние программы что бы она случайно не прерывалась
Здравствуйте.Вот код.А проблема в том что програма не дожидаясь выполнения условия почему-то начинает выводить числа на дисплей и в последовательный порт в размере integer при этом у меня меняется напряжение скачет от 0 до 5 вольт на выводе прерывания МК.Провод от монетника я отсоединил реакция та же программа виснет при постоянно разных суммах.Проследить зависимости не получается и ошибок в коде не вижу.Сижу туплю. Причем после удаления кода для ЖК МК и понетник дружат прекрасно и в порт выводится корректная сумма импульсов
Код вставлен неправильно, как минимум.
[code] #include <Wire.h> #include <LiquidCrystal_I2C.h> // создаем объект-экран, передаём используемый адрес // и разрешение экрана: LiquidCrystal_I2C lcd(0x38, 16, 2); volatile int counter; void setup() { // обнуляем количество рублей counter = 0; // открываем монитор Serial-порта Serial.begin(9600); // подписываемся на прерывание на 0 канале (2 пин Arduino Uno) // при смене значения с низкого уровня на высокий // с вызовом функции incCounter attachInterrupt(0, incCounter, RISING); lcd.init(); // включаем подсветку lcd.backlight(); // устанавливаем курсор в колонку 0, строку 0 lcd.setCursor(0, 0); // печатаем первую строку lcd.print("\xE0""o\xB2""po \xA8""o\xB6""a\xBB""o\xB3""a\xBF\xC4"); // устанавливаем курсор в колонку 0, строку 1 lcd.setCursor(0, 1); // печатаем вторую строку lcd.print("BHEC\xA5""TE \xE0""E\xA8""O\xA4\xA5""T"); } void loop() { if(counter>2) { lcd.init(); // включаем подсветку lcd.backlight(); lcd.setCursor(0, 0); lcd.print("Hello world"); // устанавливаем курсор в колонку 0, строку 1 // на самом деле это вторая строка, т.к. нумерация начинается с нуля lcd.setCursor(0, 1); // печатаем вторую строку lcd.print(counter); delay(200); } } // обработчик прерывания void incCounter() { counter++; // выводим текущий баланс Serial.println(counter); } [/code]Простите
Уотт энто миня пабиспакоила, причёмвсирйоз, поясни, чо да как ???
После подачи питания на МК.Обнуляю и начинаю счет.Как бы после включения все заного
Тут вижу одну проблему явную и одну - не очень. Первая - нет атомарного чтения counter (см. ATOMIC_BLOCK) , вторая - скорее всего нет подтяжки на пине, его и болтает туда-сюда.
Ну, и использование Serial.println() в обработчике прерывания - не лучшая идея.
странный код.
Во-первых, Сериал в прерывании использовать стоит только в том случае, если четко понимаете, что делать. Это явно не про вас. Для новичков существует правило - "Сериал в прерывании не работает"
Во-вторых, совершенно неясно, зачем при каждом входе в loop заново иннициализировать дисплей
Получается пин у меня подтянут к +5 вольт резистором 5.6 килоом
Код с амперки скопипстил и чутка видоизменил засунул библиотеку и код для ЖК
Слишком много копипасты. В лупе достаточно одного позиционирования и, затем, вывода каунтера.
пробуй убрать \ закомментировать строки относящиеся к дисплею. выводи в сериал... делал поделку на энкодере, который работал на том же прерывании с обычным дисплеем 1602 - все работало.потом решил поставить i2C начались похожие проблемы. не дружит библиотека с прерываниями наверно.
сопротивление подтяжки ставь 1 к. там открытый коллектор и короткий импульс. все должно отработать быстро с максимально не затянутыми фронтами.
То есть библиотека wire конфликтует с прерываниями.так как отключаю код программы же и в сериал выводитятся приличные значения
Слишком смелое заявление при таком исходнике...
Это не "библиотека конфликтует", а одна часть вашего бестолкового кода с другой. Учитесь программировать
Спасибо за подсказку.буду анализировать.
Условный переход в лупе мне нужно запихнуть в atomic block restorate?Одно я понял что мне нужно сохранить состояние программы что бы она случайно не прерывалась
Провод от монетника я отсоединил реакция та же
пин у меня подтянут к +5 вольт резистором 5.6 килоом
Сдается мне, что при подобных безобразиях на входе прерывания обсуждать код - занятие совершенно бессмысленное.