Не работает Ардуино ПРО МИНИ + GPS UBLOX 7m если использовать прерывания
- Войдите на сайт для отправки комментариев
Пнд, 02/01/2017 - 21:44
суть такая, надо что бы в зависимости от скорости генерировались импульсы для спидометров, что бы использовать русский спидометр на машине
когда просто подключаю 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(' ');
}
}