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