Setting timer1 hangs my arduino

Hello,
Recently I purchased an esp 8266 wifi module, and I wanted to build a simple electronic board using the display of an old phone.
I already wrote an essential library to command my display using I2C, now I wanted to add a few code, and the esp module, to make appear something on the display using my pc.
My goal is write a loop code, where serial input from esp module is kept in a buffer, and every 4 seconds put this buffer on the display.
In order to do so, I wanted to use timer1 and ISR to set a flag which inside the main loop is tested and when true, the code which writes on the display is executed.
It happens however, when I setup the timer1 that my setup function hangs…
I put some debugs using led on pin13 in order to locate where it hangs, and it seems that the code hangs when I setup the timer1.
here’s my code:

#define INIT                "AT+RST"
#define CONNECT             "AT+CWJAP=\"wifi-trusted\",\"SUPERSECRET\""
#define MUX                 "AT+CIPMUX=1"
#define LISTEN              "AT+CIPSERVER=1,65500"
//                           0123456789ABCDEF
#define WELCOME             "WiFiDisplay INIT"
#define RESTART             "Restarting......"
#define DEBUG_I2C           "I2C...........OK"
#define DEBUG_DISPLAY       "LM167511......OK"
#define DEBUG_EPS_F         "EPS8266...Hanged"
#define DEBUG_EPS_S         "EPS8266.......OK"
#define DEBUG_CONNECTION_OK "WiFi..........OK"
#define DEBUG_CONNECTION_KO "WiFi.....Hanged."
#define DEBUG_INIT_DONE     "Complete."
#define DEBUG_DOT           "."
#define TVALUE              3035
#define BUFFER_SIZE         128

#include <LM167511.h>

byte i;
bool print;
bool do_stuffs;
char buffer[BUFFER_SIZE];
char *data;
char ch;
LM167511 Display=LM167511();

void setup()
{
  byte c_y=0;
  pinMode(13,OUTPUT);
  digitalWrite(13, HIGH);
  Display.init();
  Display.clear();
  Display.gotoxy(0,c_y);c_y++;
  Display.print(WELCOME);
  delay(500);
  Display.gotoxy(0,c_y);c_y++;
  Display.print(DEBUG_I2C);
  delay(500);
  Display.gotoxy(0,c_y);c_y++;
  Display.print(DEBUG_DISPLAY);
  delay(500);
  Serial.begin(115200);
  Serial.setTimeout(5000);
  delay(1000);
  Serial.println(INIT);
  delay(2000);

  if(Serial.find("Jan")) {
                            Display.gotoxy(0,c_y);c_y++;
                            Display.print(DEBUG_EPS_S);
                            delay(500);
                           }
                      else {
                            Display.gotoxy(0,c_y);c_y++;
                            Display.print(DEBUG_EPS_F);
                            Display.gotoxy(0,c_y);c_y++;
                            Display.print(RESTART);
                            delay(2500);
                            restart();
                           }
  boolean connected=false;
  Display.gotoxy(0,c_y);c_y++;
  for(int i=0;i<5;i++) {
                        Display.print(DEBUG_DOT);
                        if(connectWiFi()) {
                                           connected = true;
                                           Display.gotoxy(0,c_y);c_y++;
                                           Display.print(DEBUG_CONNECTION_OK);
                                           delay(500);
                                           break;
                                          }
                       }
  if (!connected){
                  Display.gotoxy(0,c_y);c_y++;
                  Display.print(DEBUG_CONNECTION_KO);
                  delay(2500);
                  Display.print(RESTART);
                  restart();
                 }
  Display.gotoxy(0,c_y);c_y++;
  Display.print(DEBUG_INIT_DONE);
  delay(2500);
  Display.print(DEBUG_DOT);
  print=false;
  do_stuffs=false;
  Display.print(DEBUG_DOT);
  noInterrupts();    //if I put "digitalWrite(13, HIGH);" from here on I wont see the led turn off
  TCCR1A = 0;// set entire TCCR1A register to 0
  TCCR1B = 0;// same for TCCR1B
  TIMSK1 = (1 << TOIE1);
  TCCR1B |= (1 << CS12) | (1 << CS10);
  interrupts();
  Display.print(DEBUG_DOT);
}
ISR(Timer1_OVF_vect)
{
 digitalWrite(13, LOW);
 do_stuffs=true;
}
void loop()
{
  Display.clear();
  i=0;
  while (1)
  {
    if(do_stuffs) {
                   do_stuffs=false;
                   if (print) {
                               Display.init(); 
                               Display.clear(); 
                               Display.gotoxy(0,0);
                               Display.print(data);
                              }
                   print=false;
                  }
    while (Serial.available() > 0) {
                                   ch=Serial.read();
                                   if (ch!='\n') {
                                                  buffer[i]=ch;
                                                  i++;
                                                 }
                                            else {
                                                  buffer[i]=0;
                                                  i=0;
                                                  if (strstr(buffer, "+IPD") != NULL) data=strstr(buffer, ":")+1;
                                                  print=true;
                                                 }
                                  }

  }
}

boolean connectWiFi()
{
 Serial.println(CONNECT);
 delay(2500);
 if(Serial.find("OK"))
   {
    Serial.println(MUX);
    delay(2500);
    if(Serial.find("OK"))
      {
       Serial.println(LISTEN);
       delay(2500);
       if(Serial.find("OK"))
         {
          return true;
         }else{return false;}
      }else{return false;}
   }else{return false;}
}

void restart()
{
  asm volatile ("   jmp 0");
}

and this is the library for the display I wrote not so long ago: alessandro.carminati: I2C driver for Sharp LM167511 lcd display

Could somebody help me to understand why my setup hangs?
My doubt is that setting up timer1 mess up something int the wire library I’m using fo i2c.

ISR(Timer1_OVF_vect)
{
 digitalWrite(13, LOW);
 do_stuffs=true;
}

That is wrongly capitalized. It should be: TIMER1_OVF_vect

If you don't get it right the Arduino resets* when the interrupt occurs.

  • Actually, it jumps to the reset vector, which isn't quite the same thing.
void restart()
{
  asm volatile ("   jmp 0");
}

This is not really recommended. This is not the same as doing a reset.