Не работает Ардуино ПРО МИНИ + GPS UBLOX 7m если использовать прерывания

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

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

когда просто подключаю GPS + Ардуино про мини, то все работает

когда подключаю GPS + Ардуино про мини и использую прерывание по таймеру для генерации нужного количества импульсов на ножке А2 для спидометра - то GPS  не выдает данные, уже даже просто пробовал считывать стандартные примеры в библиотеке - ничего

помогите разобраться, на меге все работает

что использую

arduino pro mini, ublox 6m, диод на ноге А2 для просмотра импульсов

вот код

/*
    reference: Arduino Timer and Interrupt Tutorial
    http://blog.oscarliang.net/arduino-timer-and-interrupt-tutorial/
    
    For our TIMER1 Interrupt:
    Clock Freq = 16MHz
    no prescale, 1
    16MHz - 0.0625us/cycle
   
    To calculator preload value to generate 1ms(1KHz) 
    (65536 - t) x 0.0625us = 1000us
    t = 65536 - 1000/0.0625 = 49536
    
    To calculator preload value to generate 0.5ms(2KHz)
    (65536 - t) x 0.0625us = 500us
    t = 65536 - 500/0.0625 = 57536

*/

const int TCNT1_PRELOAD = 57536;

#include <TinyGPS++.h>
#include <SoftwareSerial.h>

// The TinyGPS++ object
TinyGPSPlus gps;

// The serial connection to the GPS device
SoftwareSerial ss(8, 7);


volatile unsigned int myCounter = 0;
int x;
int inByte = 0;         // incoming serial byte 
String inString = "";    // string to hold input 




//Переменные для работы с импульсами и скоростью
int updateInterval = 1000; // время между обновлениями
volatile unsigned long VelocityLastUpdate; // последнее обновление
unsigned long LedLastUpdate; // последнее обновление
#define IMPULS 4 //количество импульсов на метр пути
volatile unsigned long oldVelosityImpuls = 600000, VelosityImpuls = 600000; //количество импульсов в зависимости от скорости в секунду
int curspeed = 20, oldspeed = 0;



void setup(void) {
      
  //задаем А2 что будет на него вывод
  pinMode(A2, OUTPUT);
  
  // initialize Timer1
  noInterrupts(); // disable all interrupts
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = TCNT1_PRELOAD;
  TCCR1B |= (1 << CS10);   // no prescaler
  TIMSK1 |= (1 << TOIE1); // enable timer overflow interrupt

  Serial.begin(115200);
  ss.begin(115200);
  interrupts(); // enable all interrupts  

  Serial.println("start. enable all interrupts.");

}

volatile char c;

void loop(void) {

  while (ss.available() > 0){
    c = ss.read();
    if (gps.encode(c))
      displayInfo();
  }

  
  unsigned long VmV;
  int a;
  
  a = millis()/1000 - x;
  if(a>0){
    Serial.println(myCounter);
    Serial.print("Speed ");
    Serial.println(curspeed);
    Serial.print("Sec ");
    Serial.println(millis()/1000);

    Serial.print("Sec old ");
    Serial.println(x);
    x = millis()/1000;
    myCounter=0;

  }
  if (Serial.available() > 0) {
    inString = "";
    int inChar;
    while (Serial.available()) {
        inByte = Serial.parseInt();
    }
          Serial.print("String: ");
          Serial.println(inByte);
    curspeed = inByte;
  }
  
  if (curspeed > 0) {
    //пересчитываем скорость в переменную VelosityImpuls
    //для использовании в прерывании для генерации импульсов
    VmV = 3600000 / (curspeed * IMPULS);
    VelosityImpuls = VmV;
    oldspeed = curspeed;
  }
}



ISR(TIMER1_OVF_vect){
  TCNT1 = TCNT1_PRELOAD; // preload timer

  unsigned long currentMicros = micros();
  //если количество импульсов в секунду меньше прошедшего времени, то выдается импульс
  //количество имупльсов равно скорости метров в секунду умноженную на количество импульсов на метр
  //полчучаем со спутников скорость в метрах секунду и пересчитываем в переменную VelosityImpuls
  //VelocityLastUpdate предыдуще время срабатывание миллисекунд
  if (currentMicros < VelocityLastUpdate) VelocityLastUpdate = 1000000 - VelocityLastUpdate;
  if ((currentMicros - VelocityLastUpdate) > VelosityImpuls) // пришло время обновляться
  {
    VelocityLastUpdate = currentMicros;
    digitalWrite(A2, HIGH);
    myCounter++;
  } else {
    digitalWrite(A2, LOW);
  } 
}


void displayInfo()
{
  Serial.print(F("Location: ")); 
  if (gps.location.isValid())
  {
    Serial.print(gps.location.lat(), 6);
    Serial.print(F(","));
    Serial.print(gps.location.lng(), 6);
  }
  else
  {
    Serial.print(F("INVALID"));
  }

  Serial.print(F("  Date/Time: "));
  if (gps.date.isValid())
  {
    Serial.print(gps.date.month());
    Serial.print(F("/"));
    Serial.print(gps.date.day());
    Serial.print(F("/"));
    Serial.print(gps.date.year());
  }
  else
  {
    Serial.print(F("INVALID"));
  }

  Serial.print(F(" "));
  if (gps.time.isValid())
  {
    if (gps.time.hour() < 10) Serial.print(F("0"));
    Serial.print(gps.time.hour());
    Serial.print(F(":"));
    if (gps.time.minute() < 10) Serial.print(F("0"));
    Serial.print(gps.time.minute());
    Serial.print(F(":"));
    if (gps.time.second() < 10) Serial.print(F("0"));
    Serial.print(gps.time.second());
    Serial.print(F("."));
    if (gps.time.centisecond() < 10) Serial.print(F("0"));
    Serial.print(gps.time.centisecond());

Serial.print(F("  Course: "));
  printFloat(gps.course.deg(), gps.course.isValid(), 7, 2);
Serial.print(F("  Speed: "));
  printFloat(gps.speed.kmph(), gps.speed.isValid(), 6, 2); 
      
  }
  else
  {
    Serial.print(F("INVALID"));
  }

  Serial.println();
} 




static void printFloat(float val, bool valid, int len, int prec)
{
  if (!valid)
  {
    while (len-- > 1)
      Serial.print('*');
    Serial.print(' ');
  }
  else
  {
    Serial.print(val, prec);
    int vi = abs((int)val);
    int flen = prec + (val < 0.0 ? 2 : 1); // . and -
    flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
    for (int i=flen; i<len; ++i)
      Serial.print(' ');
  }
}