PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Findet den Fehler



jok3r
03.04.2015, 14:49
Hallo,

ich habe schon einige Erfahrungen mit C++ und dem Arduino aber ich finde den Fehler nicht wieso das hier nicht funktioniert


void loop()
{

Serial.print("Initializing SD card...");
// make sure that the default chip select pin is set to
// output, even if you don't use it:
// see if the card is present and can be initialized:
if (!SD.begin(chipSelect)) {
Serial.println("Card failed, or not present");
// don't do anything more:
return;
}
Serial.println("card initialized.");


// make a string for assembling the data to log:
String dataString = "";

// read three sensors and append to the string:
for (int analogPin = 0; analogPin < 3; analogPin++) {
int sensor = analogRead(analogPin);
dataString += String(sensor);
if (analogPin < 2) {
dataString += ",";
}
}

// open the file. note that only one file can be open at a time,
// so you have to close this one before opening another.
File dataFile = SD.open("datalog.txt", FILE_WRITE);

// if the file is available, write to it:
if (dataFile) {
dataFile.println(dataString);
dataFile.close();
// print to the serial port too:
Serial.println(dataString);
}
// if the file isn't open, pop up an error:
else {
Serial.println("error opening datalog.txt");
}
}




und das hier schon


void setup()
{
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}


pinMode(10, OUTPUT);

Serial.print("Initializing SD card...");
// make sure that the default chip select pin is set to
// output, even if you don't use it:
// see if the card is present and can be initialized:
if (!SD.begin(chipSelect)) {
Serial.println("Card failed, or not present");
// don't do anything more:
return;
}
Serial.println("card initialized.");



}

void loop()
{


// make a string for assembling the data to log:
String dataString = "";

// read three sensors and append to the string:
for (int analogPin = 0; analogPin < 3; analogPin++) {
int sensor = analogRead(analogPin);
dataString += String(sensor);
if (analogPin < 2) {
dataString += ",";
}
}

// open the file. note that only one file can be open at a time,
// so you have to close this one before opening another.
File dataFile = SD.open("datalog.txt", FILE_WRITE);

// if the file is available, write to it:
if (dataFile) {
dataFile.println(dataString);
dataFile.close();
// print to the serial port too:
Serial.println(dataString);
}
// if the file isn't open, pop up an error:
else {
Serial.println("error opening datalog.txt");
}
}



Im Quellcode finde ich auch keinen zusammenhang.

Vill erkennt hier jemand auf die schnell das Problem...


Gruß

jok3r
03.04.2015, 17:36
Manchmal sieht man den Wald vor lauter Bäumen nicht.... den Fehler daran hab ich gefunden!!!


Was anderes, ich schreibe gerade an einem Datenlogger der Laufzeitdaten aus einem Steuergerät kopiert (ca 106 Byte ,Serial ) , einen RTC und SD Karte verwaltet und dabei noch ein kleines Menü am TFT ausgibt ...
Jetzt gibt der Compiler schon jedes mal die Meldung "Low memory available, stability problems may occur." aus weil ich bisher ca 87% des dynamischen Speichers verbraten hab. Der Dynamische Speicher ist doch der SRAM oder ?
Kann ich wenigstens Teile davon auslagen ?
Bisher hatte ich noch nie das Problem das mein UNO Speicher Probleme bekommt,daher kenne ich bisher keine Abhilfe.

Das Programm ist bisher schon 20kbytes groß und wird sicher noch um 5-8kbytes wachsen.

Die lib die ich bisher benütze sind...

#include <AltSoftSerial.h>
#include <SPI.h>
#include <SD.h>
#include "RTClib.h"
#include <Wire.h>

Ich bin mir nicht sicher ob es vill an meinem Code liegt ,ich hab jetzt immer öfter Probleme mit der Seriellen Kommunikation Probleme. Mir kommt es so vor das wenn ich den Code stark um lib s und Zeilen erleichtere das es besser wird.

Gruß

Valen
03.04.2015, 23:55
Hallo,

ich habe schon einige Erfahrungen mit C++ und dem Arduino aber ich finde den Fehler nicht wieso das hier nicht funktioniert
...

Im Quellcode finde ich auch keinen zusammenhang.

Vill erkennt hier jemand auf die schnell das Problem...


GrußDu hast es schon selbst gefunden, ... aber nein! Keine Ahnung auf erster Sicht. Und nun immer noch nicht, aber du schon. (Hint!) Es wurde netter sein wenn du uns am Anfang ein Eingrenzung von das Problem gegeben hatte. Was sind die Symptomen woraus du zu der Meinung gekommen bist das etwas fehlt? Fehler-meldungen? Ich sehe nur Code. Und nicht alles davon. (Die erste Code hat kein Setup) Erwartest du das ich das Kompiliere ohne zu wissen welcher Bibliotheken ich dazu benötige?

Unregistriert
04.04.2015, 00:11
Nett das du antwortest aber dieses Thema ist abgeschlossen!!!

Peter(TOO)
04.04.2015, 02:38
Hallo,

Was anderes, ich schreibe gerade an einem Datenlogger der Laufzeitdaten aus einem Steuergerät kopiert (ca 106 Byte ,Serial ) , einen RTC und SD Karte verwaltet und dabei noch ein kleines Menü am TFT ausgibt ...
Jetzt gibt der Compiler schon jedes mal die Meldung "Low memory available, stability problems may occur." aus weil ich bisher ca 87% des dynamischen Speichers verbraten hab.Kann ich wenigstens Teile davon auslagen ?
Bisher hatte ich noch nie das Problem das mein UNO Speicher Probleme bekommt,daher kenne ich bisher keine Abhilfe.

Dein RAM wird in 3 Teile aufgeteilt:
1. Platz für statische Variablen.
2. Stack. Auf dem Stack werden alle automatischen Variablen und die Parameter bei einem Funktionsaufruf abgelegt. Hinzu kommen noch die Rücksprung-Adressen bei Funktionsaufrufen und die Interrupts benötigen auch noch Platz auf dem Stack.
3. Heap. In C wird der Heap mit alloc() und Free() verwaltet in C++ meistens mit new und free.

Besonders der Stackbereich kann Probleme machen, wenn dieser überläuft, dann überschreibt er meistens einen der anderen beiden Bereiche.

Deine Bibliotheken benötigen auch entsprechenden Platz im RAM.

Das dies alles ins RAM passt, ist eine der Aufgaben der Programmierers.

Wie das aufgeteilt ist, verrät dir teilweise das Listing des Linkers.
Wie viel dynamischen Platz der Stack belegt, kannst du mit dem Debugger herausfinden.


Der Dynamische Speicher ist doch der SRAM oder ?
Es gibt zwei Arten von dynamischem RAM:
1. Hardware: Hier bezeichnet es den Aufbau der Speicherzellen. Bei dynamischem RAM werden die Bits im Prinzip in Kondensatoren gespeichert. Da sich die Kondensatoren mit der Zeit entladen, muss die Information dauernd gelesen und neu gespeichert werden.
2. Programmtechnik: Wie oben beschrieben, z.B. der Heap. Das Programm kann zur Laufzeit einen Speicherblock anfordern und diesen dann benutzen. Braucht es diesen nicht mehr, gibt es ihn an den Heap zurück. Fordert das Programm erneut einen Block an, bekommt es einfach den nächsten passenden freien Block zugeteilt. Der Vorteil liegt einerseits darin, dass man beim Schreiben des Programms, noch nicht wissen muss, wie gross der Datenblock sein muss, das muss man erst bei der Anfrage an den Heap wissen. Andererseits kann man so das RAM besser ausnutzen, indem das RAM nur solange belegt wird, wie dieser Speicherblock auch benötigt wird.


MfG Peter(TOO)

Valen
04.04.2015, 11:38
Nett das du antwortest aber dieses Thema ist abgeschlossen!!!Und wir möchten auch gern davon lernen. ;)

jok3r
04.04.2015, 14:59
Danke für deine Antwort, ich habe mich damit den restlichen Abend noch beschäftigt um habe den SRAM um 20% mit dem F() macro und PROGMEM erleichtert.
Das war aber wohl ein typischer fall von leistung gegen Stabilität.....

Wieviel % sollte man dem Prozessor zum arbeiten im SRAM lassen vor allem wenn man in jedem Zyklus 106 Byte empfangen will ? Kann ich den abfragen wie weit er ausgelastet wird ?

Mich nervt der Arduino Compiler eigentlich schon sehr, daher wäge ich es ab ob ich nicht auf ATMEL Studio oder Codeblocks ( damit hab ich schon erfahrungen) umsteigen sollte. Gibt es im allgemeinen gebrauch von Microcontroller diese Setup Funktion auch, oder hat das nur der Arduino?

Setup wird doch zum einmaligen Aufruf oder zur Deklaration gebraucht
das kann man doch auch mit

#if (!test) then
test ;
#endif;

vergleichen oder ?

Gruß