Added interrupt support
Added interrupt support to shield_sdlog sketch
This commit is contained in:
parent
5f0415ee68
commit
defdba557d
|
|
@ -26,6 +26,11 @@ Adafruit_GPS GPS(&mySerial);
|
||||||
/* set to true to only log to SD when GPS has a fix, for debugging, keep it false */
|
/* set to true to only log to SD when GPS has a fix, for debugging, keep it false */
|
||||||
#define LOG_FIXONLY false
|
#define LOG_FIXONLY false
|
||||||
|
|
||||||
|
// this keeps track of whether we're using the interrupt
|
||||||
|
// off by default!
|
||||||
|
boolean usingInterrupt = false;
|
||||||
|
void useInterrupt(boolean); // Func prototype keeps Arduino 0023 happy
|
||||||
|
|
||||||
// Set the pins used
|
// Set the pins used
|
||||||
#define chipSelect 10
|
#define chipSelect 10
|
||||||
#define ledPin 13
|
#define ledPin 13
|
||||||
|
|
@ -46,7 +51,7 @@ uint8_t parseHex(char c) {
|
||||||
|
|
||||||
// blink out an error code
|
// blink out an error code
|
||||||
void error(uint8_t errno) {
|
void error(uint8_t errno) {
|
||||||
/*
|
/*
|
||||||
if (SD.errorCode()) {
|
if (SD.errorCode()) {
|
||||||
putstring("SD error: ");
|
putstring("SD error: ");
|
||||||
Serial.print(card.errorCode(), HEX);
|
Serial.print(card.errorCode(), HEX);
|
||||||
|
|
@ -102,10 +107,12 @@ void setup() {
|
||||||
|
|
||||||
logfile = SD.open(filename, FILE_WRITE);
|
logfile = SD.open(filename, FILE_WRITE);
|
||||||
if( ! logfile ) {
|
if( ! logfile ) {
|
||||||
Serial.print("Couldnt create "); Serial.println(filename);
|
Serial.print("Couldnt create ");
|
||||||
|
Serial.println(filename);
|
||||||
error(3);
|
error(3);
|
||||||
}
|
}
|
||||||
Serial.print("Writing to "); Serial.println(filename);
|
Serial.print("Writing to ");
|
||||||
|
Serial.println(filename);
|
||||||
|
|
||||||
// connect to the GPS at the desired rate
|
// connect to the GPS at the desired rate
|
||||||
GPS.begin(9600);
|
GPS.begin(9600);
|
||||||
|
|
@ -122,13 +129,54 @@ void setup() {
|
||||||
// Turn off updates on antenna status, if the firmware permits it
|
// Turn off updates on antenna status, if the firmware permits it
|
||||||
GPS.sendCommand(PGCMD_NOANTENNA);
|
GPS.sendCommand(PGCMD_NOANTENNA);
|
||||||
|
|
||||||
|
// the nice thing about this code is you can have a timer0 interrupt go off
|
||||||
|
// every 1 millisecond, and read data from the GPS for you. that makes the
|
||||||
|
// loop code a heck of a lot easier!
|
||||||
|
useInterrupt(true);
|
||||||
|
|
||||||
Serial.println("Ready!");
|
Serial.println("Ready!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Interrupt is called once a millisecond, looks for any new GPS data, and stores it
|
||||||
|
SIGNAL(TIMER0_COMPA_vect) {
|
||||||
|
char c;
|
||||||
|
while (mySerial.available())
|
||||||
|
{
|
||||||
|
c = GPS.read();
|
||||||
|
// if you want to debug, this is a good time to do it!
|
||||||
|
#ifdef UDR0
|
||||||
|
if (GPSECHO)
|
||||||
|
if (c) UDR0 = c;
|
||||||
|
// writing direct to UDR0 is much much faster than Serial.print
|
||||||
|
// but only one character can be written at a time.
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void useInterrupt(boolean v) {
|
||||||
|
if (v) {
|
||||||
|
// Timer0 is already used for millis() - we'll just interrupt somewhere
|
||||||
|
// in the middle and call the "Compare A" function above
|
||||||
|
OCR0A = 0xAF;
|
||||||
|
TIMSK0 |= _BV(OCIE0A);
|
||||||
|
usingInterrupt = true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// do not call the interrupt function COMPA anymore
|
||||||
|
TIMSK0 &= ~_BV(OCIE0A);
|
||||||
|
usingInterrupt = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
char c = GPS.read();
|
char c;
|
||||||
|
while (mySerial.available())
|
||||||
|
{
|
||||||
|
c = GPS.read();
|
||||||
if (GPSECHO)
|
if (GPSECHO)
|
||||||
if (c) Serial.print(c);
|
if (c) Serial.print(c);
|
||||||
|
}
|
||||||
|
|
||||||
// if a sentence is received, we can check the checksum, parse it...
|
// if a sentence is received, we can check the checksum, parse it...
|
||||||
if (GPS.newNMEAreceived()) {
|
if (GPS.newNMEAreceived()) {
|
||||||
|
|
@ -161,3 +209,4 @@ void loop() {
|
||||||
|
|
||||||
|
|
||||||
/* End code */
|
/* End code */
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue