Проблема с TFT

Последнюю неделю пытаюсь найти глюк.
ЕСть код который должен выводить на экран время с данными и в это-же время надо некоторые данные вводить…Сделал меню ,сделал форму ввода, сделал мигающий курсор.
Проблема возникла когда курсор начал мигать…
Решив , что где-то конфликт обрезал весь код: менюшки , датчики , вывод данных. глюк не ушел…
код , который работает с глюком…

Спойлер



#include <Adafruit_GFX.h>
#include <MCUFRIEND_kbv.h>
#include <Wire.h>
#include <Fonts/FreeSansOblique12pt7b.h>
#include <Fonts/FreeSans9pt7b.h>
#include <Fonts/FreeSerif9pt7b.h>
#include <Fonts/FreeSansBoldOblique12pt7b.h>
#include <Fonts/FreeSerifBoldItalic12pt7b.h>

#define TIME_DELAY 150   
#define TIME_CURSOR_DELAY  1333 // задержка  мигания курсора

enum flags {
	_zero,
	_edit_mas,
	_input_mas,
	_proces,
	_yes,
	_no,
	_cancel,
	_start,
	_stop,
	_select_sort,
	_select_button,
	_select_prof,
	_select_end,
	_show_cursor,
	_cursor_yes,
	_cursor_no,
};

struct flag {
	int8_t m6675 = 0;
	volatile uint8_t sec = 0;
	volatile uint8_t go = 0;
	volatile uint8_t tag = 0;  //флаг работы основной
	volatile uint8_t tagtag = 0;  //флаг работы кнопки селест
	volatile uint8_t flash_cursor = 0;
	volatile int8_t error_6675 = 0;
	uint8_t diag = 0;
}flg;

struct myxyxy {
	uint8_t mas_x = 0;
	uint16_t tft_x = 0;
	uint16_t tft_y = 0;
}myXY;

char TBuf[4];
volatile uint8_t minut = 0;
volatile uint8_t minuto = 0;
volatile uint8_t seco = -1;
volatile uint8_t sec = 0;
volatile uint8_t secos = -1;
volatile uint8_t secs = 0;

int8_t N_page = 0;  // номер страницы на экране

unsigned long MyTiming_cursor = 0;

MCUFRIEND_kbv tft;

void setup() {
	Serial.begin(19200);
	tft.begin(9600);
	tft.reset();
	tft.begin(tft.readID());
	tft.setRotation(1);
	tft.fillScreen(0x000000);

	TCCR5A = (1 << WGM11);
	TCCR5B = (1 << CS12) | (1 << WGM13) | (1 << WGM12);  //делить частоту CPU на 256
	ICR5 = 62499;                                        // (16000000MHz /div256) -1 = 1 раз в секунду
	TIMSK5 = (1 << TOIE1);

	minuto--;
	seco--;
	myXY.tft_y = 60;
	flg.tag = _zero;
	flg.tagtag = _show_cursor;
	flg.flash_cursor = _yes;
	MyTiming_cursor = millis();
	start_car();
}

void loop() {
	if (flg.sec != _zero) enable_sec();  // вывод данных каждые 10 сек  (обрезал до вывода только времени)
	show_cursor(0); //мигание курсора
}


void enable_sec(void) {

	flg.sec = _zero;
	uint8_t mintmp = minut;
	uint8_t sectmp = sec;
	if ((myXY.tft_y > 280)) {
		N_page++;
		myXY.tft_y = 60;
		tft.fillRect(5, 0, 240, 400, 0);
	}

	tft.setFont(&FreeSansBoldOblique12pt7b);
	tft.setTextSize(1);
	tft.setCursor(myXY.tft_x, myXY.tft_y);
	tft.print(IS(mintmp, 1));
	tft.print(IS(sectmp, 2));
	myXY.tft_y = myXY.tft_y + 20;
}


ISR(TIMER5_OVF_vect) {
	if (flg.go == _start) {
		sec++;  //инкремент переменной каждую секунду
		if (sec > 59) {
			sec = 0;
			minut++;
		}

		if ((int(sec) % 10) == 0) {
			//infaData.secst = sec;
			flg.sec = _start;
		}
	}
}

void start_car() {
	flg.go = _start;
	flg.tag = _proces;
	N_page = 0;
};

void show_cursor(uint8_t nx) {
	tft.setFont(&FreeSansBoldOblique12pt7b);
	//if (flg.sec != _start) {
	if (flg.flash_cursor == _yes) {
		if ((millis() - MyTiming_cursor) > TIME_CURSOR_DELAY) {
			MyTiming_cursor = millis();
			tft.setCursor(290 + (nx * 10), 240);
			tft.setTextSize(2);
			tft.setTextColor(TFT_BLACK);
			tft.print("-");
			flg.flash_cursor = _no;
		}
	}
	else
	{
		if (flg.flash_cursor == _no) {
			if ((millis() - MyTiming_cursor) > TIME_CURSOR_DELAY) {
				MyTiming_cursor = millis();
				tft.setCursor(290 + (nx * 10), 240);
				tft.setTextSize(2);
				tft.setTextColor(TFT_LIGHTGREY);
				tft.print("-");
				flg.flash_cursor = _yes;

			}
		}
	}
}

String IS(int xIS, int sIS) {

	if (sIS == 0) {
		TBuf[0] = '0' + xIS / 100;
		TBuf[1] = '0' + (xIS % 100) / 10;
		TBuf[2] = '0' + xIS % 10;
	}
	else {
		TBuf[0] = '0' + (xIS / 10);
		TBuf[1] = '0' + xIS % 10;

		if (sIS == 1) TBuf[2] = ':';
		if (sIS == 2) TBuf[2] = ' ';
		if (sIS == 3) TBuf[2] = ',';
	}
	return TBuf;
}






Код должен давать следующую картину. строчки времени появляются каждые 10 секунда ,
начиная с момента запуска таймера.Одновременно мигает курсор.

Спойлер

Должен , но работает вот так :person_facepalming:
( строчки времени появляются по разному иногда после прошествия 2 минут , иногда сперва есть а потом в течении минуты нет потом опять есть каждые 10 сек…
зависимость не уловил)

Спойлер


или так

Стоит закомментировать функцию 88 show cursor все работает как надо…
Уже вроде все попробовал…
ПЫтался замедлить мигание курсора до раз в 2 сек -не помогло ,
пытался не обрабатывать курсор пока не отработает функция вывода данных на каждой 10 сек… enable_sec() - не помогло,
пытался перед началом обработки функции enable_sec() вставить delay(300) , решив , что сильно быстро может данные выводятся - не помогло.

Выяснил , что можно закомментировать не всю функцию show cursor , а только
строки

//tft.setCursor(290 + (nx * 10), 240);
tft.setTextColor(TFT_BLACK);
//tft.print("-");

//tft.setCursor(290 + (nx * 10), 240);
tft.setTextColor(TFT_LIGHTGREY);
//tft.print("-");

и тогда код начинает нормально работать…(точнее можно даже только сет.курсор и печать - строка с цветом никак не влияет)
какая связь не улавливаю…

в целях проверки между строками 106 и 107 вставлял
Serial.println(mintmp); Serial.println(sectmp);
минуты и секунды выводятся без пропусков ,каждые 10 сек(а на экране в это время- болт)…

получается конкретно на дисплей не выводит , а вчем глюк в упор не вижу…
МОжет , кто , что подскажет…Спасибо

Не в синхроне вывод просто (мне кажется).

Может надо все таки перед 106 строкой задавать цвет ? Или после вывода курсора возвращать цвет ? Стирание курсора переводит цвет в BLACK и так оставляет …

136 - 159 это просто очередной шедевр - из-за разницы цвета в одной строке полностью повторять два блока … ТС в своём репертуаре !

1 лайк

блин, странно я вроде перед печатью задавал цвет перед 106 строкой - может случайно стер вовремя експерементов… а так да как вариант может все время попадать на черный цвет.
Спасибо попробую…

Это говорит о том что вывод происходит либо не туда либо не тем цветом

Вот , что не туда мысль сразу была , а про цвет … в самом начале комментировал у вывода курсора цвет , глюк не исчезал … но после этого я координально изменил вывод , возможно тогда другой глюк был … спасибо вернусь с работы попробую.

Когда не смог найти глюк, максимально разделил , чтобы найти где… так ,что избыточность только на время поиска … , а так флаг являлся цветом (флаг другой был)

Спойлер
enum flags {
	_yes = -1,
	_no,
	_zero,
	_edit_mas,
	_input_mas,
	_proces,
	_cancel,
	_start,
	_stop,
	_select_sort,
	_select_button,
	_select_prof,
	_select_end,
	_show_cursor,
	_cursor_yes,
	_cursor_no,
};

void show_cursor(uint8_t nx) {

	if ((millis() - MyTiming_cursor) > TIME_CURSOR_DELAY) {
		MyTiming_cursor = millis();
		tft.setFont(&FreeSansBoldOblique12pt7b);
		tft.setCursor(290 + (nx * 10), 240);
		tft.setTextSize(2);
		tft.setTextColor(flg.flash_cursor);
		tft.print("-");
		if (flg.flash_cursor == _no) flg.flash_cursor = _yes; else flg.flash_cursor = _no;
	}

}

вот так… меньше не смог ужать…:slight_smile:

:man_facepalming: вот я слепой , уперся в координаты, а по факту он просто черным рисовал… Спасибо большое…

Еще смог немного ужать примерно на 6 ASM команд…
Видимо теперь это потолок…( по крайне мере с моими знаниями);
:rofl:

Спойлер
int color_cursor=0;

void show_cursor(uint8_t nx) {

	if ((millis() - MyTiming_cursor) > TIME_CURSOR_DELAY) {
		MyTiming_cursor = millis();
		tft.setFont(&FreeSansBoldOblique12pt7b);
		tft.setCursor(290 + (nx * 10), 240);
		tft.setTextSize(2);
		tft.setTextColor(color_cursor);
		tft.print("-");
		color_cursor=~color_cursor;
		}

}