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
watchdog timer und SD schreiben
19.03.2014, 21:08
Beitrag #1
Brick watchdog timer und SD schreiben
Hallo Forum Experten,

ich bin neu in der Arduino Welt und hobe ein paar Probleme mit meinem ersten Projekt. Ich verwende den Arduino Uno und das Adafruit Ultimate GPS Shield.

Ich lese alle 1s die GPS daten und schreibe sie auf die SD Karte. Soweit geht das auch.

Um Batterie zu sparen habe ich versucht den Arduino schlafen zu legen.
Seither wird mir nichts mehr auf meine SD Karte geschrieben.

Hier mein Sketch

//--------------------------------------------------------------------------------------------------
// global
//--------------------------------------------------------------------------------------------------
SoftwareSerial softwareSerial(8, 7);
Adafruit_GPS gps(&softwareSerial);
File logfile;



//--------------------------------------------------------------------------------------------------
// setup
//--------------------------------------------------------------------------------------------------
void setup()
{
Serial.begin(115200);

pinMode(13, OUTPUT);
pinMode(10, OUTPUT);

// -> SD card initialization.
if (0 != SD.begin(10))
{
char filename[15];
strcpy(filename, "GPSLOG00.TXT");

for (uint8_t i = 0; i < 100; i++)
{
filename[6] = '0' + i / 10;
filename[7] = '0' + i % 10;

if (0 == SD.exists(filename)) break;
}

if (0 != (logfile = SD.open(filename, FILE_WRITE)))
{
Serial.print("writing to file: ");
Serial.println(filename);
}
else
{
Serial.print("could not open file: ");
Serial.println(filename);
}
}
else
{
Serial.println("SD card initialization failed.");
}
// <-

// -> GPS initialization
gps.begin(9600);

gps.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCONLY);
gps.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);
gps.sendCommand(PGCMD_NOANTENNA);
// <-

// -> watch dog timer
MCUSR &= ~(1<<WDRF);
WDTCSR |= (1<<WDCE) | (1<<WDE);
WDTCSR = 1<<WDP1 | 1<<WDP2 | 0<<WDP3; /* 1.0 seconds */
WDTCSR |= _BV(WDIE);
// <-
}



//--------------------------------------------------------------------------------------------------
// loop
//--------------------------------------------------------------------------------------------------
void loop()
{
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
sleep_mode();
sleep_disable();
power_all_enable();

gps.read();

if (0 != gps.newNMEAreceived())
{
if (0 != gps.parse(gps.lastNMEA()))
{
if (0 != gps.fix)
{
const char* pcSentence = gps.lastNMEA();
const uint8_t uiSentenceSize = strlen(pcSentence);

logfile.write((uint8_t *)pcSentence, uiSentenceSize);
logfile.flush();
}
}
}
}



//--------------------------------------------------------------------------------------------------
// watch dog timer interrupt
//--------------------------------------------------------------------------------------------------
ISR(WDT_vect)
{
}

Ich bin für jede Hilfe dankbar.
Tristan
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.03.2014, 21:31
Beitrag #2
RE: watchdog timer und SD schreiben
Hallo Tristan,

Auszug aus http://playground.arduino.cc/Learning/ar...yn840kVbIg
Zitat:Sleep is assisted by interrupts. without them, only a reset can wake the Arduino up again.
Wenn du also den Arduino wieder wach machen möchtest, musst du einen Interrupt auf Pin 2 oder 3 überwachen, wie es dort auch im Beispiel steht.

In deinem jetzigen Code ist auch ein Denkfehler. Selbst wenn er funktionieren würde, würde der Aurduino ständig in den Schlaf fallen und wieder aufgeweckt werden. Dies da die Loop() ständig durchlaufen wird.

Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.03.2014, 08:53
Beitrag #3
RE: watchdog timer und SD schreiben
Danke für die Antwort. Laut Doku sollte man den Arduino auch mit dem WDT aufwecken können.

When the arduino is in SLEEP_MODE_PWR_DOWN the only way to wake it is with either a watchdog timer interrupt or a level interrupt on pins 2 or 3.

Ich verstehe nicht ganz warum mein GPS / SD write code der nach dem wakeup kommt nicht funktioniert. Ich habe testweise mal das LED ein aus geschaltet nach dem wakeup. Das hat gklappt.

Erreichen will ich:
- GPS auf SD schreiben
- schlafen
- GPS auf SD schreiben
- schlafen
...

gibt es vielleicht einen besseren Weg das zu erreichen ?
Danke
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.03.2014, 09:22
Beitrag #4
RE: watchdog timer und SD schreiben
Hallo Tristan,

ich weiß jetzt nicht wie weit dein Englisch ist. Hier gibts eine sehr gute Beschreibung zum Gesamtthema SleepModes und die verschiedenen Möglichkeiten ihn wieder aufzuwecken. Unter anderem auch ein gut kommentiertes Beispiel bzgl. WDT.
http://donalmorrissey.blogspot.de/2010/0...-part.html

Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.03.2014, 09:54
Beitrag #5
RE: watchdog timer und SD schreiben
Hallo,

danke für den Link. Genau den habe ich als Vorlage für mein Programm genommen ;-)

Um das nochmal zu verdeutlichen:

Der WDT funktioniert. Lediglich der Code nach dem wake up macht Probleme und ich weiß nicht wieso. Sind das alles Asynchrone methoden die eine gewisse Zeit brauchen um abgearbeitet zu werden und wenn ja wie viel ?

Gruß Tristan
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.03.2014, 19:59
Beitrag #6
RE: watchdog timer und SD schreiben
Hallo,

der GPS-Logger braucht ne weile um sich die Daten der Sattelitten zu holen das müsste man mit einer if else oder whil Schleife abdecken.

Fals ich das genauer beschreiben soll Melde dich nochmal.
Gruß
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.03.2014, 15:25
Beitrag #7
RE: watchdog timer und SD schreiben
Moin,

also irgendwie scheint mir die ISR hier recht zweckfrei. Die muss doch was machen.

Im Beispiel (in dem Link) setzt die ISR eine Variable (f_wdt), die im Loop() ausgewertet wird und die Standardaktion zulässt. Danach wird im Loop() die Variable (f_wdt) wieder zurückgesetzt und der SleepMode angestoßen. Jetzt wird die ISR wieder aktiv und setzt die Variable (f_wdt) wieder so, dass im Loop() der Ablauf neu starten kann.
Genau dieser Kreislauf fehlt im Code von Tristan irgendwie Huh (glaube ich).

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 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Münzeinwurf mit Timer KBLc 11 486 26.04.2017 21:21
Letzter Beitrag: KBLc
  Brauche Zeitverzögerung delay/millis/timer? Spiecky 17 641 15.04.2017 09:41
Letzter Beitrag: hotsystems
  Über drei Taster zwei externe Timer steuern Sidamo 23 763 09.01.2017 20:12
Letzter Beitrag: Tommy56
  Data Logger Daten auf SD Card schreiben Crichton 12 841 22.11.2016 18:32
Letzter Beitrag: Crichton
  Countdown Timer Uwe1475 23 1.244 19.10.2016 18:33
Letzter Beitrag: Uwe1475
  Serial Monitor ASCII 1 schreiben BennIY 11 924 01.08.2016 16:42
Letzter Beitrag: Mathias
  (Mega) Timer 3 A, B & C Scheams 0 391 04.06.2016 17:09
Letzter Beitrag: Scheams
  Arduino MEGA2560 Timer PWM Einsteiger94 3 935 04.04.2016 10:38
Letzter Beitrag: RMR
  char* inhalt in eine Datei auf SD-Karte schreiben MartinK 0 454 30.03.2016 16:42
Letzter Beitrag: MartinK
  Timer Interrupt Anfängerprobleme Fox 4 818 05.03.2016 02:28
Letzter Beitrag: Fox

Gehe zu:


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