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
  Data Logger Daten auf SD Card schreiben Crichton 12 301 22.11.2016 18:32
Letzter Beitrag: Crichton
  Countdown Timer Uwe1475 23 736 19.10.2016 18:33
Letzter Beitrag: Uwe1475
  Serial Monitor ASCII 1 schreiben BennIY 11 580 01.08.2016 16:42
Letzter Beitrag: Mathias
  (Mega) Timer 3 A, B & C Scheams 0 231 04.06.2016 17:09
Letzter Beitrag: Scheams
  Arduino MEGA2560 Timer PWM Einsteiger94 3 661 04.04.2016 10:38
Letzter Beitrag: RMR
  char* inhalt in eine Datei auf SD-Karte schreiben MartinK 0 341 30.03.2016 16:42
Letzter Beitrag: MartinK
  Timer Interrupt Anfängerprobleme Fox 4 620 05.03.2016 02:28
Letzter Beitrag: Fox
  Ins eeprom schreiben/lesen anwo 10 1.789 07.02.2016 20:05
Letzter Beitrag: rpt007
  Teensy- Tastaturblöcke in Schreiben einfügen Modinox 19 1.389 10.01.2016 19:09
Letzter Beitrag: Modinox
  OUTPUT bleibt HIGH und timer stopt nicht. Atwist 4 533 08.01.2016 11:02
Letzter Beitrag: Atwist

Gehe zu:


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