Прерывание по таймеру и тач скрин
- Войдите на сайт для отправки комментариев
Пнд, 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;
}