Не работает Ардуино ПРО МИНИ + 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(' '); } }