Официальный сайт компании Arduino по адресу arduino.cc
потеря данных Serial из за прерывания
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Сб, 04/06/2016 - 16:37
Добрый день. Имеется индикатор реализованый на микросхеме 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); }