Прерывание по таймеру и тач скрин
- Войдите на сайт для отправки комментариев
Пнд, 04/04/2016 - 22:25
есть такой код, в нем почему то тач не работает, как будто зацикливается в прерывании и все остальное не реагирует, хотя 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; }