потеря данных Serial из за прерывания

Нет ответов
Charovnik
Charovnik аватар
Offline
Зарегистрирован: 05.02.2016

Добрый день. Имеется индикатор реализованый на микросхеме 74 164 и двоичном дешифраторе. 

был наброшен код который бы выводил некоторое значение, который вполе себе работает.

далее был подключен джипиэс модуль который тоже вполне себе работает с библиотекой тиниджипиэс

когда все в месте: на индикаторе цифры как и без джипиэс (тут ок) когда включаеш монитор порта (в коде джи пи эс имеется какая то проверка целосности) данные не отображаются но указано что ошибки полнятся

 
Sats HDOP Latitude  Longitude  Fix  Date       Time     Date Alt    Course Speed Card  Distance Course Card  Chars Sentences Checksum
          (deg)     (deg)      Age                      Age  (m)    --- from GPS ----  ---- to London  ----  RX    RX        Fail
-------------------------------------------------------------------------------------------------------------------------------------
**** **** ********* ********** **** ********** ******** **** ****** ****** ***** ***   *******  ****** ***   30    0         0        
**** **** ********* ********** **** ********** ******** **** ****** ****** ***** ***   *******  ****** ***   265   0         2        
**** **** ********* ********** **** ********** ******** **** ****** ****** ***** ***   *******  ****** ***   439   0         5        
**** **** ********* ********** **** ********** ******** **** ****** ****** ***** ***   *******  ****** ***   586   0         7        
**** **** ********* ********** **** ********** ******** **** ****** ****** ***** ***   *******  ****** ***   733   0         8        
**** **** ********* ********** **** ********** ******** **** ****** ****** ***** ***   *******  ****** ***   880   0         9        
**** **** ********* ********** **** ********** ******** **** ****** ****** ***** ***   *******  ****** ***   1027  0         9        
**** **** ********* ********** **** ********** ******** **** ****** ****** ***** ***   *******  ****** ***   1176  0         10       
**** **** ********* ********** **** ********** ******** **** ****** ****** ***** ***   *******  ****** ***   1322  0         12       
**** **** ********* ********** **** ********** ******** **** ****** ****** ***** ***   *******  ****** ***   1468  0         12       
**** **** ********* ********** **** ********** ******** **** ****** ****** ***** ***   *******  ****** ***   1615  0         12 

 

 

 

#include <SoftwareSerial.h>

#include <TinyGPS.h>

/* This sample code demonstrates the normal use of a TinyGPS object.
   It requires the use of SoftwareSerial, and assumes that you have a
   4800-baud serial GPS device hooked up on pins 4(rx) and 3(tx).
*/

TinyGPS gps;ы
SoftwareSerial ss(4, 3);

static void smartdelay(unsigned long ms);
static void print_float(float val, float invalid, int len, int prec);
static void print_int(unsigned long val, unsigned long invalid, int len);
static void print_date(TinyGPS &gps);
static void print_str(const char *str, int len);

void setup()
{
  Serial.begin(115200);
  
  Serial.print("Testing TinyGPS library v. "); Serial.println(TinyGPS::library_version());
  Serial.println("by Mikal Hart");
  Serial.println();
  Serial.println("Sats HDOP Latitude  Longitude  Fix  Date       Time     Date Alt    Course Speed Card  Distance Course Card  Chars Sentences Checksum");
  Serial.println("          (deg)     (deg)      Age                      Age  (m)    --- from GPS ----  ---- to London  ----  RX    RX        Fail");
  Serial.println("-------------------------------------------------------------------------------------------------------------------------------------");

  ss.begin(9600);
}

void loop()
{
  float flat, flon;
  unsigned long age, date, time, chars = 0;
  unsigned short sentences = 0, failed = 0;
  static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;
  
  print_int(gps.satellites(), TinyGPS::GPS_INVALID_SATELLITES, 5);
  print_int(gps.hdop(), TinyGPS::GPS_INVALID_HDOP, 5);
  gps.f_get_position(&flat, &flon, &age);
  print_float(flat, TinyGPS::GPS_INVALID_F_ANGLE, 10, 6);
  print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 11, 6);
  print_int(age, TinyGPS::GPS_INVALID_AGE, 5);
  print_date(gps);
  print_float(gps.f_altitude(), TinyGPS::GPS_INVALID_F_ALTITUDE, 7, 2);
  print_float(gps.f_course(), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);
  print_float(gps.f_speed_kmph(), TinyGPS::GPS_INVALID_F_SPEED, 6, 2);
  print_str(gps.f_course() == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(gps.f_course()), 6);
  print_int(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0xFFFFFFFF : (unsigned long)TinyGPS::distance_between(flat, flon, LONDON_LAT, LONDON_LON) / 1000, 0xFFFFFFFF, 9);
  print_float(flat == TinyGPS::GPS_INVALID_F_ANGLE ? TinyGPS::GPS_INVALID_F_ANGLE : TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);
  print_str(flat == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON)), 6);

  gps.stats(&chars, &sentences, &failed);
  print_int(chars, 0xFFFFFFFF, 6);
  print_int(sentences, 0xFFFFFFFF, 10);
  print_int(failed, 0xFFFFFFFF, 9);
  Serial.println();
  
  smartdelay(1000);
}

static void smartdelay(unsigned long ms)
{
  unsigned long start = millis();
  do 
  {
    while (ss.available())
      gps.encode(ss.read());
  } while (millis() - start < ms);
}

static void print_float(float val, float invalid, int len, int prec)
{
  if (val == invalid)
  {
    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(' ');
  }
  smartdelay(0);
}

static void print_int(unsigned long val, unsigned long invalid, int len)
{
  char sz[32];
  if (val == invalid)
    strcpy(sz, "*******");
  else
    sprintf(sz, "%ld", val);
  sz[len] = 0;
  for (int i=strlen(sz); i<len; ++i)
    sz[i] = ' ';
  if (len > 0) 
    sz[len-1] = ' ';
  Serial.print(sz);
  smartdelay(0);
}

static void print_date(TinyGPS &gps)
{
  int year;
  byte month, day, hour, minute, second, hundredths;
  unsigned long age;
  gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
  if (age == TinyGPS::GPS_INVALID_AGE)
    Serial.print("********** ******** ");
  else
  {
    char sz[32];
    sprintf(sz, "%02d/%02d/%02d %02d:%02d:%02d ",
        month, day, year, hour, minute, second);
    Serial.print(sz);
  }
  print_int(age, TinyGPS::GPS_INVALID_AGE, 5);
  smartdelay(0);
}

static void print_str(const char *str, int len)
{
  int slen = strlen(str);
  for (int i=0; i<len; ++i)
    Serial.print(i<slen ? str[i] : ' ');
  smartdelay(0);
}
#include <avr/interrupt.h>  
int data = 9  ;
int clock = 10;



byte z[]={
B00100001,//0
B10100001,//1
B00110001,//2
B10010001,//3
B00000001,//4
B01000001,//5
B11000001,//6
B10000001,//7
B00010001,//8
B10110001//9
};

byte zz[]={
B00100010,//0
B10100010,//1
B00110010,//2
B10010010,//3
B00000010,//4
B01000010,//5
B11000010,//6
B10000010,//7
B00010010,//8
B10110010//9
};
byte zzz[]={
B00100100,//0
B10100100,//1
B00110100,//2
B10010100,//3
B00000100,//4
B01000100,//5
B11000100,//6
B10000100,//7
B00010100,//8
B10110100//9
};
byte zzzz[]={
B00101000,//0
B10101000,//1
B00111000,//2
B10011000,//3
B00001000,//4
B01001000,//5
B11001000,//6
B10001000,//7
B00011000,//8
B10111000//9
};

int r;
int j;

void setup() {
 pinMode(data,OUTPUT);
 pinMode(clock,OUTPUT);
TIMSK1 |= (1 << TOIE1); // Разрешение прерывания по таймеру1
TCCR1B |= (1 << CS11)|(1 << CS10);  // Предделитель на 64   
//TCCR1B |= (1 << CS12);  // Предделитель на 256   
//sei();
}

ISR( TIMER1_OVF_vect)
{
fg();
}


void fg()
{
  
  j++;
if (j==4){j=0;}
if (j==0){shiftOut(data, clock, MSBFIRST, z[(r/1)%10]);}

if (j==1){shiftOut(data, clock, MSBFIRST, zz[(r/10)%10]);}

if (j==2){shiftOut(data, clock, MSBFIRST, zzz[(r/100)%10]);}

if (j==3){shiftOut(data, clock, MSBFIRST, zzzz[(r/1000)%10]);}
  
  }

void loop() 
{

r=6785;
} 
#include <SoftwareSerial.h>

#include <TinyGPS.h>

#include <avr/interrupt.h>  
int data = 9  ;
int clock = 10;



byte z[]={
B00100001,//0
B10100001,//1
B00110001,//2
B10010001,//3
B00000001,//4
B01000001,//5
B11000001,//6
B10000001,//7
B00010001,//8
B10110001//9
};

byte zz[]={
B00100010,//0
B10100010,//1
B00110010,//2
B10010010,//3
B00000010,//4
B01000010,//5
B11000010,//6
B10000010,//7
B00010010,//8
B10110010//9
};
byte zzz[]={
B00100100,//0
B10100100,//1
B00110100,//2
B10010100,//3
B00000100,//4
B01000100,//5
B11000100,//6
B10000100,//7
B00010100,//8
B10110100//9
};
byte zzzz[]={
B00101000,//0
B10101000,//1
B00111000,//2
B10011000,//3
B00001000,//4
B01001000,//5
B11001000,//6
B10001000,//7
B00011000,//8
B10111000//9
};

int r;
int j;
TinyGPS gps;
SoftwareSerial ss(4, 3);

static void smartdelay(unsigned long ms);
static void print_float(float val, float invalid, int len, int prec);
static void print_int(unsigned long val, unsigned long invalid, int len);
static void print_date(TinyGPS &gps);
static void print_str(const char *str, int len);

void setup()
{
  Serial.begin(115200);
  
  Serial.print("Testing TinyGPS library v. "); Serial.println(TinyGPS::library_version());
  Serial.println("by Mikal Hart");
  Serial.println();
  Serial.println("Sats HDOP Latitude  Longitude  Fix  Date       Time     Date Alt    Course Speed Card  Distance Course Card  Chars Sentences Checksum");
  Serial.println("          (deg)     (deg)      Age                      Age  (m)    --- from GPS ----  ---- to London  ----  RX    RX        Fail");
  Serial.println("-------------------------------------------------------------------------------------------------------------------------------------");

  ss.begin(9600);


 pinMode(data,OUTPUT);
 pinMode(clock,OUTPUT);
TIMSK1 |= (1 << TOIE1); // Разрешение прерывания по таймеру1
TCCR1B |= (1 << CS11)|(1 << CS10);  // Предделитель на 64   
//TCCR1B |= (1 << CS12);  // Предделитель на 256   
sei();
  
}




ISR( TIMER1_OVF_vect)
{
fg();
}


void fg()
{
  
  j++;
if (j==4){j=0;}
if (j==0){shiftOut(data, clock, MSBFIRST, z[(r/1)%10]);}

if (j==1){shiftOut(data, clock, MSBFIRST, zz[(r/10)%10]);}

if (j==2){shiftOut(data, clock, MSBFIRST, zzz[(r/100)%10]);}

if (j==3){shiftOut(data, clock, MSBFIRST, zzzz[(r/1000)%10]);}
  
  }

void loop()
{

  
r=6785;



  float flat, flon;
  unsigned long age, date, time, chars = 0;
  unsigned short sentences = 0, failed = 0;
  static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;
  
  print_int(gps.satellites(), TinyGPS::GPS_INVALID_SATELLITES, 5);
  print_int(gps.hdop(), TinyGPS::GPS_INVALID_HDOP, 5);
  gps.f_get_position(&flat, &flon, &age);
  print_float(flat, TinyGPS::GPS_INVALID_F_ANGLE, 10, 6);
  print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 11, 6);
  print_int(age, TinyGPS::GPS_INVALID_AGE, 5);
  print_date(gps);
  print_float(gps.f_altitude(), TinyGPS::GPS_INVALID_F_ALTITUDE, 7, 2);
  print_float(gps.f_course(), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);
  print_float(gps.f_speed_kmph(), TinyGPS::GPS_INVALID_F_SPEED, 6, 2);
  print_str(gps.f_course() == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(gps.f_course()), 6);
  print_int(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0xFFFFFFFF : (unsigned long)TinyGPS::distance_between(flat, flon, LONDON_LAT, LONDON_LON) / 1000, 0xFFFFFFFF, 9);
  print_float(flat == TinyGPS::GPS_INVALID_F_ANGLE ? TinyGPS::GPS_INVALID_F_ANGLE : TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);
  print_str(flat == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON)), 6);

  gps.stats(&chars, &sentences, &failed);
  print_int(chars, 0xFFFFFFFF, 6);
  print_int(sentences, 0xFFFFFFFF, 10);
  print_int(failed, 0xFFFFFFFF, 9);
  Serial.println();
  
  smartdelay(1000);
}

static void smartdelay(unsigned long ms)
{
  unsigned long start = millis();
  do 
  {
    while (ss.available())
      gps.encode(ss.read());
  } while (millis() - start < ms);
}

static void print_float(float val, float invalid, int len, int prec)
{
  if (val == invalid)
  {
    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(' ');
  }
  smartdelay(0);
}

static void print_int(unsigned long val, unsigned long invalid, int len)
{
  char sz[32];
  if (val == invalid)
    strcpy(sz, "*******");
  else
    sprintf(sz, "%ld", val);
  sz[len] = 0;
  for (int i=strlen(sz); i<len; ++i)
    sz[i] = ' ';
  if (len > 0) 
    sz[len-1] = ' ';
  Serial.print(sz);
  smartdelay(0);
}

static void print_date(TinyGPS &gps)
{
  int year;
  byte month, day, hour, minute, second, hundredths;
  unsigned long age;
  gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
  if (age == TinyGPS::GPS_INVALID_AGE)
    Serial.print("********** ******** ");
  else
  {
    char sz[32];
    sprintf(sz, "%02d/%02d/%02d %02d:%02d:%02d ",
        month, day, year, hour, minute, second);
    Serial.print(sz);
  }
  print_int(age, TinyGPS::GPS_INVALID_AGE, 5);
  smartdelay(0);
}

static void print_str(const char *str, int len)
{
  int slen = strlen(str);
  for (int i=0; i<len; ++i)
    Serial.print(i<slen ? str[i] : ' ');
  smartdelay(0);
}