Error al escribir dato en tft

Hola a todos, adjunto mi sketch, es una abrevacion de lo que quiero hacer, y esta es la parte que falla.
Es un contador de rpm, conectado al usb y mirando el monitor serial funciona durante horas sin problemas, al querer escribir el mismo dato en la tft, todo se cuelga, a veces a los 2 minutos, otras al instante..
Es un arduino mega generico
con una tft shield mcufriend 9327.

#include <Arduino.h>
#include <SPI.h>            
#include <Adafruit_GFX.h>    
#include <TouchScreen.h>
#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft;

// Define some TFT readable colour codes to human readable names
#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

const int XP=6,
          XM=A2,
          YP=A1,
          YM=7; //240x400 ID=0x9327

const int TS_LEFT=941,TS_RT=187,TS_TOP=966,TS_BOT=178;

TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); // Creates the touchscreen object
#define LCD_CS A3 // Chip Select goes to Analog 3
#define LCD_CD A2 // Command/Data goes to Analog 2
#define LCD_WR A1 // LCD Write goes to Analog 1
#define LCD_RD A0 // LCD Read goes to Analog 0
#define LCD_RESET A4
#define MINPRESSURE 10
#define MAXPRESSURE 1000
#define PALETTEDEPTH   0     // do not support Palette modes
volatile int RPMcontados = 0; //Configuro volatil los RPM contados para que no se pierdan de una interrupcion a otra
const int Sensor = 18; //Declaro variable del pin del Sensor
const int Salida = 30; //Declaro variable del pin del Salida
int RPM = 0; //Declaro que la variable RPM esta a 0 en cada bucle

bool EstadoSalida = LOW;
bool EstadoSensor;
bool Lectura;

unsigned long tiempo = 0; //Declaro que la variable tiempo esta a 0 en cada bucle
unsigned long EmpezarRetraso;
unsigned long RetrasoEncendido;
unsigned long EmpezarApagado;
unsigned long RetrasoApagado; 

void setup() {

    Serial.begin(9600); //Abro comunicacion con la consola
    pinMode(Sensor, INPUT); //Declaro el Sensor como una entrada
    pinMode(Salida, OUTPUT); //Declaro el Salida como una salida
    attachInterrupt(digitalPinToInterrupt(Sensor), RPM_motor, FALLING); //Activo la interrupcion
     tft.reset();
  uint16_t identifier = tft.readID();
  tft.begin(identifier);
  tft.setRotation(0);
  tft.fillScreen(BLACK);
  tft.drawRoundRect(0, 0, 240, 400, 8, YELLOW);     //Page border
  tft.fillRoundRect(0, 0, 240, 35, 8, RED);
  tft.drawRoundRect(0, 0, 240, 35, 8, YELLOW);
  tft.setTextSize(2);
  tft.setCursor(50, 12);
  tft.setTextColor(WHITE);
  tft.print("DIAGN ELECTR");
  tft.setTextSize(2);
  tft.setTextColor(WHITE,BLACK);

}

void loop() {

    Lectura = digitalRead(Sensor); //Declaro que la Lectura es leida digitalmente en el pin del Sensor
    
    if (RPM >= 1000) {
    RetrasoEncendido    = 6;
    RetrasoApagado      = 4;
    }
    
    if (RPM >= 2000) {
    RetrasoEncendido    = 3;
    RetrasoApagado      = 2;
    }

    if (RPM >= 4000) {
    RetrasoEncendido    = 1;
    RetrasoApagado      = 1;
    }

    if (millis() - tiempo == 1000) 
    { 
    detachInterrupt(digitalPinToInterrupt(Sensor)); //Desactivo la interrupcion mientras calcula
    RPM = RPMcontados * 60; //Para una interrupcion por vuelta lo multiplico por 60 para saber las RPM
   
   //////   al activar se congela sketch  //////////
   
   // tft.setCursor(50, 200);
   // tft.print(RPM);
    
    Serial.print("RPM =\t"); //Escribe las RPM en cosola
    Serial.println(RPM); //Escribe las RPM en consola
    RPMcontados = 0; // Reseteo el contador de revoluciones
    tiempo = millis(); // Actualizo el tiempo
    attachInterrupt(digitalPinToInterrupt(Sensor), RPM_motor, FALLING); //Activo la interrupcion
    }
    
    if (Lectura && !EstadoSensor) 
    {
    EstadoSalida = !EstadoSalida;
    if (EstadoSalida == HIGH)
    { 
    EmpezarRetraso = millis() + RetrasoEncendido; 
    }
    }
    EstadoSensor = Lectura;     // ...actualiza el Estado del Sensor a la Lectura
}

void RPM_motor() {

    RPMcontados++; //Se suma 1 RPM cada vez que pasa por aqui

}

al comentar la parte que dice tft.print(RPM) el sketch anda bien, sino hace lo antes comentado.. me esta volviendo loco
gracias y saludos

Existe una remota posibilidad de que el problema lo tengas en la comparación:

    if (millis() - tiempo == 1000)

Yo pondría:

    if (millis() - tiempo >= 1000)

Es posible que en algún momento, por lo que sea, se tarde más de un milisegundo entre una comparación y otra. Si justo la vez anterior habían pasado 999 milisegundos y en la actual son 1001 milisegundos, ya no se cumple la condición. Tan solo transcurrido unos cuantos días, cuando se desborde el contador, podría volver a cumplirse. Con el >= se cumple la condición aunque se pasen varios milisegundos.

Puede ser que ocurra muy de cuando en cuando, y de casualidad no te pase cuando lo estás probando sin la pantalla. Pero supongo que cuando tienes puesto la pantalla lo dejas más tiempo funcionando y es entonces cuando te da el problema.

Ahi hice el cambio tal como vos me recomendas, hace una hora que esta corriendo y aun sigue bien, ahora me queda seguir viendo como hacer que corra en una pagina que llamo desde un menu tactil, mañana escribo

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.