Прерывание по таймеру и тач скрин

Нет ответов
Lemur
Offline
Зарегистрирован: 11.01.2016

есть такой код, в нем почему то тач не работает, как будто зацикливается в прерывании и все остальное не реагирует, хотя timpuls увеличивается и на экране пишется, но все остальное не реагирует ни на какие действия

printTextbyChar(String(oldtimpuls), String(timpuls), 60, 170, 2, 'x');

printTextbyChar - функция вывода текста посимвольно затирая место под ними

помогите найти в чем проблема, так то не особо разбираюсь в прерываниях

затея такая, что бы не зависимо, от действия в Loop при вызове прерывания по таймеру, счетчик timpuls увеличивался, быстрее медленнее в зависимости от VelosityImpuls которая увеличивается или уменьшается кнопками натач скрине VmV = 3600000/(curspeed * IMPULS); VelosityImpuls = VmV;


int updateInterval = 1000; // время между обновлениями
unsigned long VelocityLastUpdate; // последнее обновление
unsigned long LedLastUpdate; // последнее обновление
#define IMPULS 2 //количество импульсов на метр пути
unsigned long oldVelosityImpuls = 600000, VelosityImpuls = 600000; //количество импульсов в зависимости от скорости в секунду
 
void Update(unsigned long currentMicros)
 {
  if((currentMicros - VelocityLastUpdate) > VelosityImpuls) // пришло время обновляться
  {
    VelocityLastUpdate = currentMicros;
    timpuls += 1;
  }

}


void setup()
{

  VelocityLastUpdate = micros();
  LedLastUpdate = micros();


//прошлый интервал нажатия кнопок
 LastTouchPressTime = millis();

  tft.reset();
  tft.begin(0x9341); // SDFP5408
  tft.setRotation(0); // Need for the Mega, please changed for your choice or rotation initial

   // Timer0 уже используется millis() - прерываемся где-то
   // посередине и вызываем ниже функцию "Compare A"
   OCR0A = 0xAF;
   TIMSK0 |= _BV(OCIE0A);  

//рисуем первый экран c кнопками
   PrintScreen1();
}

// Прерывание вызывается 
SIGNAL(TIMER0_COMPA_vect) 
{
  Update(micros());
}

#define  INTERVAL  47619UL
#define  INTERVAL1S 10UL

void loop()
{  
  unsigned long CurTimer = millis();
  unsigned long VmV;

//управление тач скрин, считываем координаты 
  TSPoint p = GetPoint();

  if (p.z > 50){

     p.x = mapXValue(p);
     p.y = mapYValue(p);
      
     // кнопка уменьшает счетчик
      
     if((p.x<37)&&(p.x>14)&&(p.y<291)&&(p.y>269) ){
       curspeed = curspeed - 1;
        if(curspeed<2) curspeed = 2;
        LastTouchPressTime = CurTimer;
      
     }


    //кнопка ускоряет счетчик

     if((p.x<87)&&(p.x >64)&&(p.y<291)&&(p.y>269) ){
        curspeed = curspeed + 1;
        if(curspeed>180) curspeed = 180;
        LastTouchPressTime = CurTimer;
      
     }


// кнопка включает/выключает диод на какое то время

     if((p.x<137)&&(p.x >114)&&(p.y<291)&&(p.y>269)){
        if(LedON == 1){ 
          LedON = 0;
          tft.fillCircle(125, 280, 23, GREEN);
          tft.setTextSize(2);
          tft.setCursor(110,275);
          tft.println("Off");
        }
        else {
          LedON = 1;
          tft.fillCircle(125, 280, 23, GREEN);
          tft.setTextSize(2);
          tft.setCursor(115,275);
          tft.println("On");
        }
        LastTouchPressTime = CurTimer;
     }
  }
  
        //полчучаем со спутников скорость в метрах секунду и пересчитываем в переменную VelosityImpuls
        //для использовании в прерывании для генерации импульсов
        //сначала делаем расчет, что бы потом его запомнить и использовать в подсчетах
        VmV = 3600000/(curspeed * IMPULS);
        VelosityImpuls = VmV;
        oldspeed = curspeed;
        wasUpdate = 0;
         printTextbyChar(String(oldtimpuls), String(timpuls), 60, 170, 2, 'x');
         oldtimpuls = timpuls;
       printTextbyChar(String(oldVelosityImpuls), String(VelosityImpuls), 60, 190, 2, 'x');
       oldVelosityImpuls = oldVelosityImpuls;

}


void PrintScreen1(){

  tft.setTextSize(2);
  tft.setCursor(0,170);
  tft.println("Imp = "); 
  tft.setCursor(0,190);
  tft.println("T = "); 
  tft.setCursor(0,210);
  tft.print("T adress = "); // printAddress(insideThermometer);
  
//рисуем кнопки кружки
  tft.fillCircle(25, 280, 23, RED);
  tft.fillCircle(75, 280, 23, BLUE);

  if(LedON == 1){ 
    LedON = 0;
    tft.fillCircle(125, 280, 23, GREEN);
    tft.setTextSize(2);
    tft.setTextColor(WHITE);
    tft.setCursor(110,275);
    tft.println("Off");
  } else {
    LedON = 1;
    tft.fillCircle(125, 280, 23, GREEN);
    tft.setTextSize(2);
    tft.setTextColor(WHITE);
    tft.setCursor(115,275);
    tft.println("On");
  }
  
    tft.setTextColor(WHITE);
  
}

//получить координаты нажатия
TSPoint GetPoint(){
  TSPoint p;
  p= ts.getPoint(); 
  pinMode(XM, OUTPUT); //Pins configures again for TFT control
  pinMode(YP, OUTPUT);
  return p;
}