Помогите со скетчем для ардуино

yeee
Offline
Зарегистрирован: 17.08.2019
#include <Wire.h>
#include <DS3231.h>
#include <TFT.h>
#include <SPI.h>

#define cs 10
#define dc 9//(A0 на текстолите)
#define rst 8
#define Ox A6
#define Oy A7
#define button 3

TFT TFTscreen = TFT(cs, dc, rst);
DS3231 clock;
RTCDateTime dt;

void setup()
{ 
  pinMode(3, INPUT_PULLUP);
  TFTscreen.begin();
  attachInterrupt(1, menu, FALLING);  
  clock.begin(); //при сетапе выходит блок меню (самый нижний), от этого нужно избавиться
}

void loop()
{  
  TFTscreen.background(0, 0, 0);
  dt = clock.getDateTime();
  TFTscreen.stroke(255,255,255);
  TFTscreen.setTextSize(5);
  TFTscreen.text(clock.dateFormat("H:i", dt),7,10);
  TFTscreen.setTextSize(2);
  TFTscreen.stroke(242, 133, 7);
  TFTscreen.text(clock.dateFormat("d.m.Y", dt),20,110);
  delay(30000);  
}

void menu()
{
  TFTscreen.background(0,0,0);  
  TFTscreen.stroke(255,255,255);  
  TFTscreen.setTextSize(2);
  TFTscreen.text("Alarm",10,10);
  TFTscreen.text("Date",110,10);
  TFTscreen.text("Time",110,27);
  TFTscreen.text("Exit",60,100);
}

И да, почему это происходит???
(Nano 328p, ST7735)

yeee
Offline
Зарегистрирован: 17.08.2019

И еще, как заставить мк при вызове функции menu сидеть на ней и ждать следующих действий? (типа если кнопка снова нажата то обратно в loop а если что-то другое, например уровень наклона джойстика по какой-либо оси, то переход в другое меню)

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Ну, во-перых прерывание по изменению пина рекомендуется назначать так:

attachInterrupt(digitalPinToInterrupt(pin), ISR, mode);

Во-вторых в прерывании не надо обращаться к библиотекам. В большинстве случае это приводит к полной или частичной неработаоспобноси. В прерывании лучше устанавливать флаг, а потом в loop() на него реагировать.

А происходит это потому, что срабатывает прерывание. Как у вас кнопка подключена?

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

yeee пишет:

И да, почему это происходит???

Мля, что происходит?

Почему здесь появляются вопрошающие с секретными вопросами, типа тебя?

Да, хрен вас знает, откуда вы берётесь!

yeee пишет:

Помогите со скетчем для ардуино

Завтра поможем, как раз пятница!

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

еще один решил, что "многозадачность" делается через прерывания...

На что только не идут лентяя. лишь бы не изучать миллис...

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Без схемы трудно понять "что происходит", но похоже, что кнопка подключена неправильно.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

b707 пишет:

еще один решил, что "многозадачность" делается через прерывания...

Во всех "больших" ОС типа BSD, Linux, Windows многозадачность делается как раз через прерывания.

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Дак у них есть поддержка со стороны проца, с его таблицами LDT, сегментами TSS и прочей хней.  У малышей такова щастья нет. 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

DetSimen пишет:

Дак у них есть поддержка со стороны проца, с его таблицами LDT, сегментами TSS и прочей хней.  У малышей такова щастья нет. 

У FreeRTOS, которая и на АВР-ах может запускаться, тоже на прерываниях многозадачность устроена. Да и твой таймер лист на них же. 

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

asam пишет:

Да и твой таймер лист на них же. 

И не поспоришь ведь. :) 

yeee
Offline
Зарегистрирован: 17.08.2019

Извиняюсь, 

yeee
Offline
Зарегистрирован: 17.08.2019

Ворота пишет:

yeee пишет:

И да, почему это происходит???

Мля, что происходит?

Почему здесь появляются вопрошающие с секретными вопросами, типа тебя?

Да, хрен вас знает, откуда вы берётесь!

Тьфу ты! Точно!) (там в комментарии в коде написана проблема, от которой я хочу избавиться) Когда код выполняется, перед включением дисплея пробегает та самая менюшка, где написано "Выход, Дата время, Будильник". Просто не совсем понятно почему при начале работы скетча выходит самая последняя функция, хотя вроде как этого не должно быть

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Сдаётся мне, что на кнопке выход SEL подтянут резистором к земле, поэтому прерывание и срабатывает. Посмотрите на модуле кнопки, что там к этому выходу вкорячено?

yeee
Offline
Зарегистрирован: 17.08.2019

DIYMan пишет:

Сдаётся мне, что на кнопке выход SEL подтянут резистором к земле, поэтому прерывание и срабатывает. Посмотрите на модуле кнопки, что там к этому выходу вкорячено?

Да ничего вроде, от SEL идет к 3-му пину на нано

yeee
Offline
Зарегистрирован: 17.08.2019

asam пишет:

Ну, во-перых прерывание по изменению пина рекомендуется назначать так:

attachInterrupt(digitalPinToInterrupt(pin), ISR, mode);

Во-вторых в прерывании не надо обращаться к библиотекам. В большинстве случае это приводит к полной или частичной неработаоспобноси. В прерывании лучше устанавливать флаг, а потом в loop() на него реагировать.

А происходит это потому, что срабатывает прерывание. Как у вас кнопка подключена?

Компилятор выделяет этот участок 

digitalPinToInterrupt

и не хочет с ним никак взаимодействовать 

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

зачем вам вообще прерывание для работы с меню?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

yeee пишет:

DIYMan пишет:

Сдаётся мне, что на кнопке выход SEL подтянут резистором к земле, поэтому прерывание и срабатывает. Посмотрите на модуле кнопки, что там к этому выходу вкорячено?

Да ничего вроде, от SEL идет к 3-му пину на нано

НА ПЛАТЕ кнопки смотрите по дорожкам. Ещё раз: СКОРЕЕ ВСЕГО, выход SEL АППАРАТНО притянут к земле резистором, и слабенькая встроенная подтяжка к питанию, которая INPUT_PULLUP - мимо кассы. Проверить - просто: подключите кнопку к питанию - и посмотрите уровень на SEL при ненажатой кнопке.

yeee
Offline
Зарегистрирован: 17.08.2019

DIYMan пишет:

yeee пишет:

DIYMan пишет:

Сдаётся мне, что на кнопке выход SEL подтянут резистором к земле, поэтому прерывание и срабатывает. Посмотрите на модуле кнопки, что там к этому выходу вкорячено?

Да ничего вроде, от SEL идет к 3-му пину на нано

НА ПЛАТЕ кнопки смотрите по дорожкам. Ещё раз: СКОРЕЕ ВСЕГО, выход SEL АППАРАТНО притянут к земле резистором, и слабенькая встроенная подтяжка к питанию, которая INPUT_PULLUP - мимо кассы. Проверить - просто: подключите кнопку к питанию - и посмотрите уровень на SEL при ненажатой кнопке.

да на плате, на плате. Никуда не идет, просто под металлический экран, дальше ничего нет, не знаю

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

yeee пишет:

да на плате, на плате. Никуда не идет, просто под металлический экран, дальше ничего нет, не знаю

Ок, третий заход: взять мультиметр, подать питание на плату кнопки, и померять уровень на выходе SEL - это ОЧЕНь СЛОЖНО? Если между GND и SEL при поданном на плату кнопки питании будет 0В - поздравляю, у вас выход притянут к земле, поэтому при старте срабатывает прерывание, поэтому и такое поведение.

Проверить также можно, поменяв в коде INPUT_PULLUP на INPUT, а FALLING на RISING.

yeee
Offline
Зарегистрирован: 17.08.2019

DIYMan пишет:

yeee пишет:

да на плате, на плате. Никуда не идет, просто под металлический экран, дальше ничего нет, не знаю

Ок, третий заход: взять мультиметр, подать питание на плату кнопки, и померять уровень на выходе SEL - это ОЧЕНь СЛОЖНО? Если между GND и SEL при поданном на плату кнопки питании будет 0В - поздравляю, у вас выход притянут к земле, поэтому при старте срабатывает прерывание, поэтому и такое поведение.

Проверить также можно, поменяв в коде INPUT_PULLUP на INPUT, а FALLING на RISING.

Ладно, тут мой жесткий косяк. Я сразу проверил, 4.20v, поэтому и написал, что ничего нет

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

yeee пишет:

Ладно, тут мой жесткий косяк. Я сразу проверил, 4.20v, поэтому и написал, что ничего нет

Ок, а что будет, ели физически отключить выход SEL от пина 3 ардуины?

yeee
Offline
Зарегистрирован: 17.08.2019

DIYMan пишет:

yeee пишет:

Ладно, тут мой жесткий косяк. Я сразу проверил, 4.20v, поэтому и написал, что ничего нет

Ок, а что будет, ели физически отключить выход SEL от пина 3 ардуины?

нуль

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

yeee пишет:

DIYMan пишет:

yeee пишет:

Ладно, тут мой жесткий косяк. Я сразу проверил, 4.20v, поэтому и написал, что ничего нет

Ок, а что будет, ели физически отключить выход SEL от пина 3 ардуины?

нуль

Что - нуль? Функция menu не отрабатывает? Прям клещами вытягиваю из вас инфу, как будто это мне надо проблему решить.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

нет, там 0 вольт, INPUT_PULLUP жеж )))

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

ua6em пишет:

нет, там 0 вольт, INPUT_PULLUP жеж )))

Да я примерно так и догадался, что мерялось при подключенном контакте к пину 3. Но начальника транспортного цеха послушать таки хотелось бы :))

yeee
Offline
Зарегистрирован: 17.08.2019

DIYMan пишет:

yeee пишет:

DIYMan пишет:

yeee пишет:

Ладно, тут мой жесткий косяк. Я сразу проверил, 4.20v, поэтому и написал, что ничего нет

Ок, а что будет, ели физически отключить выход SEL от пина 3 ардуины?

нуль

Что - нуль? Функция menu не отрабатывает? Прям клещами вытягиваю из вас инфу, как будто это мне надо проблему решить.

Ну я хз, тогда поконкретнее, я все еще о напряжении. Ноль вольт, меню перед началом работы все равно выскакивает, я уже пробовал различные вариации. И с джойстиком, и без, и менял местами вызовы, ставил перед ними delay, все бестолку.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

а должно быть +5 вольт, куда всадил 3 пин, признавайся )))

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

yeee пишет:

Ну я хз, тогда поконкретнее, я все еще о напряжении. Ноль вольт,

Если при отключенном от пина 3 выводе SEL и подаче питания на плату кнопки, между выводом SEL и выводом GND платы кнопки - напряжение 0В, то это значит, что этот вывод подтянут к земле. Отсюда и сработка прерывания при старте. Проблема решена.

yeee
Offline
Зарегистрирован: 17.08.2019

DIYMan пишет:

yeee пишет:

Ну я хз, тогда поконкретнее, я все еще о напряжении. Ноль вольт,

Если при отключенном от пина 3 выводе SEL и подаче питания на плату кнопки, между выводом SEL и выводом GND платы кнопки - напряжение 0В, то это значит, что этот вывод подтянут к земле. Отсюда и сработка прерывания при старте. Проблема решена.

Огромное спасибо! (посылаю энергетические волны светлой ауры в вашу сторону)