Проблема с выводом информации на ЖК МТ-16S2Н-8

Сергей Данилов
Offline
Зарегистрирован: 19.09.2019
[code]
 
[/code]
Сергей Данилов
Offline
Зарегистрирован: 19.09.2019

Здравствуйте.Вот код.А проблема в том что програма не дожидаясь выполнения условия почему-то начинает выводить числа на дисплей  и в последовательный порт в размере      integer при этом у меня меняется напряжение скачет от 0 до 5 вольт на выводе прерывания МК.Провод от монетника я отсоединил реакция та же программа виснет при  постоянно разных суммах.Проследить зависимости не получается и ошибок в коде не вижу.Сижу туплю. Причем после удаления кода для ЖК МК и понетник дружат прекрасно и в порт выводится корректная сумма импульсов    

sadman41
Offline
Зарегистрирован: 19.10.2016

Код вставлен неправильно, как минимум.

Сергей Данилов
Offline
Зарегистрирован: 19.09.2019
[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]

 

Сергей Данилов
Offline
Зарегистрирован: 19.09.2019

Простите

-NMi-
Offline
Зарегистрирован: 20.08.2018

Сергей Данилов пишет:

  // обнуляем количество рублей
 
  // выводим текущий баланс
 

Уотт энто миня пабиспакоила, причёмвсирйоз, поясни, чо да как ???

Сергей Данилов
Offline
Зарегистрирован: 19.09.2019

После подачи питания на МК.Обнуляю и начинаю счет.Как бы после включения все заного

sadman41
Offline
Зарегистрирован: 19.10.2016

Тут вижу одну проблему явную и одну - не очень. Первая - нет атомарного чтения counter (см. ATOMIC_BLOCK) , вторая - скорее всего нет подтяжки на пине, его и болтает туда-сюда.

Ну, и использование Serial.println() в обработчике прерывания - не лучшая идея.

b707
Offline
Зарегистрирован: 26.05.2017

странный код.

Во-первых,  Сериал в прерывании использовать стоит только в том случае, если четко понимаете, что делать. Это явно не про вас. Для новичков существует правило - "Сериал в прерывании не работает"

Во-вторых, совершенно неясно, зачем при каждом входе в loop заново иннициализировать дисплей

Сергей Данилов
Offline
Зарегистрирован: 19.09.2019

Получается пин у меня подтянут к +5 вольт резистором 5.6 килоом

Сергей Данилов
Offline
Зарегистрирован: 19.09.2019

Код с амперки скопипстил и чутка видоизменил засунул библиотеку и код для ЖК

sadman41
Offline
Зарегистрирован: 19.10.2016

Слишком много копипасты. В лупе достаточно одного позиционирования и, затем, вывода каунтера.

DIVGENY
Offline
Зарегистрирован: 23.08.2016

 пробуй убрать \ закомментировать строки относящиеся к дисплею. выводи в сериал... делал поделку на энкодере, который работал на том же прерывании с обычным дисплеем 1602 - все работало.потом решил поставить i2C начались похожие проблемы. не дружит библиотека с прерываниями наверно.

сопротивление подтяжки ставь 1 к. там открытый коллектор и короткий импульс. все должно отработать быстро с максимально не затянутыми фронтами.

Сергей Данилов
Offline
Зарегистрирован: 19.09.2019

То есть библиотека wire конфликтует с прерываниями.так как отключаю код программы же и в сериал выводитятся приличные значения

sadman41
Offline
Зарегистрирован: 19.10.2016

Слишком смелое заявление при таком исходнике...

b707
Offline
Зарегистрирован: 26.05.2017

Сергей Данилов пишет:
То есть библиотека wire конфликтует с прерываниями.так как отключаю код программы же и в сериал выводитятся приличные значения
'

Это не "библиотека конфликтует", а одна часть вашего бестолкового кода с другой. Учитесь программировать

Сергей Данилов
Offline
Зарегистрирован: 19.09.2019

Спасибо за подсказку.буду анализировать.

Сергей Данилов
Offline
Зарегистрирован: 19.09.2019

Условный переход в лупе мне нужно запихнуть в atomic block restorate?Одно я понял что мне нужно сохранить состояние программы что бы она случайно не прерывалась

SLKH
Offline
Зарегистрирован: 17.08.2015

Цитата:
у меня меняется напряжение скачет от 0 до 5 вольт на выводе прерывания МК

Провод от монетника я отсоединил реакция та же

пин у меня подтянут к +5 вольт резистором 5.6 килоом

Сдается мне, что при подобных безобразиях на входе прерывания обсуждать код - занятие совершенно бессмысленное.