INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
nmea Satz unvollständig
25.07.2014, 15:04
Beitrag #1
nmea Satz unvollständig
Hallo Forum,

ich habe einen Arduino Uno R3 mit dem Ultimate GPS Logger Shield von Adafruit verbunden. Ich will die GPS Daten einfach unverändert auf dei SD Karte schreiben so wie sie kommen. In der Zwischenzeit lege ich den Arduino schlafen um Energie zu sparen. Er wird vom GPS über die Serielle Schnittstelle dann wieder geweckt wenn neu Daten verfügbar sind.

Meine Programm Loop sieht so aus:
+ gps (RMC) einlesen
+ auf die SD Karte schreiben
+ Arduino in Energiesparmodus (shutdown)

Problem: die ersten paar Zeichen des NMEA-Satzes fehlen auf der SD Karte. Das $ Zeichen immer und manchmal noch ein oder 2 weitere.

Hat jemand eine Idee wo da das Problem liegt ?

Danke!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.07.2014, 16:26
Beitrag #2
RE: nmea Satz unvollständig
Hallo tristan,

du solltest den Code einstellen. Je nach gewählten Sleepmode gibt's einige Sachen zu beachten. Ohne Code wird's eher ein Blindflug.

Grüße RK

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.07.2014, 16:32
Beitrag #3
RE: nmea Satz unvollständig
Hier der komplette Sourcecode ;-)

Code:
#include <SoftwareSerial.h>
#include <avr/sleep.h>



//--------------------------------------------------------------------------------------------------
//                                                                                            define
//--------------------------------------------------------------------------------------------------
#define  SERIAL_BAUDRATE      115200
#define  GPS_BAUDRATE         9600



//--------------------------------------------------------------------------------------------------
//                                                                                            global
//--------------------------------------------------------------------------------------------------
SoftwareSerial  gpsSerial(8, 7);



void Sleep();

//--------------------------------------------------------------------------------------------------
//                                                                                             setup
//--------------------------------------------------------------------------------------------------
void setup()
{
  Serial.begin(SERIAL_BAUDRATE);
  Serial.println("\r\nA simple Arduino programm");
  
  gpsSerial.begin(GPS_BAUDRATE);
  delay(10);
  
  gpsSerial.println("$PMTK220,1000*1F");
  gpsSerial.println("$PMTK314,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*29");
  gpsSerial.println("$PGCMD,33,0*6C");
  
  delay(500);
  Serial.println("setup done.");
}



//--------------------------------------------------------------------------------------------------
//                                                                                              loop
//--------------------------------------------------------------------------------------------------
void loop()
{
  char buffer[128];
  unsigned char byteCount = 0;
  
  if (gpsSerial.available())
  {
    do
    {
      buffer[byteCount++] = gpsSerial.read();
    }
    while (gpsSerial.available());
    
    buffer[byteCount] = '\0';
    
    Serial.println(buffer);
  }
  
  Serial.println("SLEEP");
  delay(25);
  Sleep();
}



//--------------------------------------------------------------------------------------------------
//                                                                                             Sleep
//--------------------------------------------------------------------------------------------------
void Sleep()
{
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  
  MCUSR &= ~(1 << WDRF);                           // reset status flag
  WDTCSR |= (1 << WDCE) | (1 << WDE);              // enable configuration changes
  WDTCSR = (1<<WDP3 | 0<<WDP2 | 0<<WDP1 | 1<<WDP0);// set prescale
  WDTCSR |= (1 << WDIE);                           // enable interrupt mode
  
  sleep_enable();
  sleep_cpu();
  sleep_disable();
}



//--------------------------------------------------------------------------------------------------
//                                                                         watch dog timer interrupt
//--------------------------------------------------------------------------------------------------
ISR (WDT_vect)
{
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.07.2014, 16:44
Beitrag #4
RE: nmea Satz unvollständig
Yup,

ich denke das Problem liegt hier:
Code:
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
Der Modus ist so tief, dass alle Oszillatoren abgeschaltet werden. Das hat Folgen.
Genaue Erklärung siehe http://www.mikrocontroller.net/articles/Sleep_Mode im Abschnitt "Morgenmuffel". Da wird auch klar warum du Daten verlierst. Wenn du den Sleepmode auf Idle setzt, sparst du zwar nicht soviel Energie, solltest aber auch keine Probleme mit Datenverlusten haben.

Grüße RK

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.07.2014, 17:06
Beitrag #5
RE: nmea Satz unvollständig
Danke für die Antwort.
mit set_sleep_mode(SLEEP_MODE_IDLE); verliere ich zwar keine Daten mehr aber der Arduino geht auch nicht mehr schlafen ;-).
Es verhält sich genau so als würde ich das Sleep() weglassen.

Muss der SLEEP_MODE_IDLE noch anders konfiguriert werden damit er greift ?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.07.2014, 19:37
Beitrag #6
RE: nmea Satz unvollständig
Hallo,
kannst Du nicht einfach später anfangen auf SD zu schreiben und zu loggen?
Also, Uno ist im Sleep_Mode- wie gehabt.
Du beendest den Sleep_Mode
nun legst Du mit milis() eine "Pause" ein- bis er aufgewacht ist.
nach dieser "Pause" fängst Du an zu loggen.
Gruß und Spaß
Andreas
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.07.2014, 10:54
Beitrag #7
RE: nmea Satz unvollständig
Hallo tristan,

normalerweise wird der Idle_Mode so gesetzt:
Code:
set_sleep_mode(SLEEP_MODE_IDLE);
  noInterrupts();
  sleep_enable();
  interrupts();
  sleep_cpu();
  sleep_disable();
Mit einer Bitmasken - Operation kannst du dann noch verschiedene Komponenten abschalten:
•Bit 7 - PRTWI: Power Reduction TWI
•Bit 6 - PRTIM2: Power Reduction Timer/Counter2
•Bit 5 - PRTIM0: Power Reduction Timer/Counter0
•Bit 4 - Res: Reserved bit
•Bit 3 - PRTIM1: Power Reduction Timer/Counter1
•Bit 2 - PRSPI: Power Reduction Serial Peripheral Interface
•Bit 1 - PRUSART0: Power Reduction USART0
•Bit 0 - PRADC: Power Reduction ADC
Beispiel um Serial, SPI,TWI und ADC abzuschalten:
Code:
ADCSRA = 0;
PRR = B10010111;
Um die komplette Peripherie abzuschalten nutzt du:
Code:
ADCSRA = 0;
PRR = 0xff;
Um die Brown Out Detection abzuschalten nutzt du:
Code:
MCUCR = _BV (BODS) | _BV (BODSE);
MCUCR = _BV (BODS);
Hope it helps!
Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste