[Anfänger] Programm läuft nicht los (ohne Verbindungsaufbau mittels Serial)

Hallo,

ich habe eine Verständnisfrage:
Läuft der Arduino Uno R3 nicht weiter, wenn Serial.begin(9600) aufgerufen wird? Wartet das Board auf den Verbindungsaufbau?

Hintergrund:
Ich habe mir einen kleinen Datenlogger mit Temperaturmessung und SD-Card gebastelt. Aus Debugging-Gründen habe ich entsprechende "Serial.print"-Ausgaben eingefügt. Wenn ich das Board nun ohne PC betreiben will, muss ich dann alle "Serial"-Einträge löschen bzw. kann ich alle Einträge mittels If-Abfrage "Debuggingmodus EIN/AUS" über einen boolean-Wert überspringen??? Ich steh auf dem Schlauch...

Danke im Voraus!!!

Gruss Stefan

Hi,
kann drin bleiben, stört nicht. Wenn was nicht geht zeig uns den Code.

Grüsse
Klaus

Weder Serial.begin(9600) noch Serial.print blockieren/stoppen die Ausführung wenn an der Schnittstelle nichts dranhängt. Die serielle Schnittstelle macht keinen Verbindungsaufbau sondern sendet blind Daten hinaus.
Sie verlangsamen aber die Ausführung des Sketches darum ist es oft sinnvoll eine hohe Baudrate zu wählen (zb 115200)

Um serielle DebuginAusgaben abschalten zu können ist #if(debuging) serial.print("text"); sinnvoll. Mit einem #define debuging 1 bzw #define debuging 0 schaltest Du die Debugingausgaben ein bzw aus ( bei aus werden sie nocht in den Kode kompiliert sondern der Compiler ignoriert diese Funktionen.

Mehr Hilfe wenn Du uns den Sketch gibst.

Grüße Uwe

Läuft das Programm denn, wenn der Arduino am SerialMonitor hängt?

Wenn nicht:

Serial vergrößert deinen Code und den erforderlichen RAM Bereich.
Wenn du deine Debug-Meldungen im RAM ablegst, noch mehr...

Wenn der RAM überläuft, kann alles mögliche passieren.

Kennst du PROGMEM und das F("Text aus dem Flash") Makro ?

uwefed:
Mehr Hilfe wenn Du uns den Sketch gibst.

Von einem Ram-Problem erwarte ich daß der Sketch normal startet und dann nach einiger Zeit unvorhergesehen und unverständliche Fehler macht. Der Titel "Programm läuft nicht los (ohne Verbindungsaufbau mittels Serial) " verspricht daß der Sketch gar nicht funktioniert, die kurze Beschreibung "Ich habe mir einen kleinen Datenlogger mit Temperaturmessung und SD-Card gebastelt." läßt michael_x's Verdacht plausibel klingen.

Weiter beim großen Rätselraten ohne Sketch.

Grüße Uwe

Hi,

also hier mal der Code (erklären brauch ich den wohl hier nicht):

#include <SD.h>
#include <stdio.h>
const int chipSelect = 10;      //Pin für
const float interval = 10000;   //Zeit zwischen log-Einträgen in ms
const char filename[ ] = "temp_log.txt";

void setup()
{
  Serial.begin(9600);
  Serial.println("Initialisiere SD-Speicherkarte...");
  pinMode(10, OUTPUT);
  if (!SD.begin(chipSelect)) {
    Serial.println("SD-Speicherkarte defekt oder nicht vorhanden!");
    return;
  }
  Serial.println("SD-Speicherkarte wurde initialisiert!");
}

void loop()
{
  File dataFile = SD.open(filename, FILE_WRITE);
  if (dataFile) {
    dataFile.println(calctemp(analogRead(0)));
    dataFile.close();
    Serial.println(calctemp(analogRead(0)));
  }  
  else {
    Serial.println("Fehler beim Öffnen der Logdatei!");
  }
  delay(10000);              // wait for a second
}


float calctemp(float rawadc)
// Hilfsfunktion zur Umrechnung auf Grad Celsius
{
  float R_fix = 20;      // Wert des Festwiderstand in kOhm
  float R_NTC_REF = 47;      // NTC-Widerstand in kOhm (bei Referenztemperatur von 25 °C)
  float B_Wert = 4090;         // Konstante lt. aus Datenblatt
  float R_akt;            // Aktueller Widerstand, errechnet aus Spannungsteiler
  float temp;         // Rückgabewert der Funktion
  float T_REF = 25 + 273.15; // Basistemperatur auf Kelvin umrechnen
  R_akt = ((1023 /rawadc)*R_fix)-R_fix;
  //Temperatur in Kelvin ausrechnen, in °C umrechnen und Fehlerkorrektur mit Offsetwert
  temp = B_Wert*T_REF/(B_Wert+log10((R_akt/R_NTC_REF))*T_REF) - 273.15 - 1.1;
  return temp;
}

Wie erwähnt, am PC funktioniert alles, nur bei normaler Spannungsversorgung nicht...

Gruß Stefan

am PC funktioniert alles, nur bei normaler Spannungsversorgung nicht

Liegt also nicht am SerialMonitor, sondern ob die Spannungsversorgung über USB oder Extern (Vin) kommt ???

Wie kannst du ohne serielle Ausgabe erkennen, ob was läuft: nur daran, was hinterher auf der Karte dazugekommen ist ?

Ich glaub, ich dreh gleich durch!!!

Gerade habe ich es zum Laufen gebracht. Aber warum, ist mir total schleierhaft. :~
Heute wurde mein Sensor-Shield geliefert, also gleich alles umgesteckt und plötzlich funktioniert es (Daten werden korrekt auf die Karte geschrieben). Also probehalber alles zurück und das Problem ist wieder da.

Ich versteh es nicht, dazu bin ich echt zu blöd...

Da auf dem Shield nur 4 wirkliche Bauteile drauf sind (2 Widerstände, ein Kondensator und die PWR-Led) kann es doch eigentlich nicht daran liegen, oder???

Hallo miteinander,

komischerweise funktioniert es jetzt auch ohne Sensor-Shield. :slight_smile:

Meine Änderung:
Ich habe unter den Einstellungen die ausführliche Anzeige eingestellt.
Der Hinweis, dass bereits kompilierte Dateien gelinkt werden, hat mich stutzig gemacht. Also im "Temp"-Ordner alles gelöscht und neu kompiliert. Jetzt funktionert es unabhängig von der Hardware (mit und ohne PC bzw.USB)
Ob das wirklich der Grund war, keine Ahnung.

Mittlerweile bin ich allerdings über etwas anderes gestolpert:
Sobald ich mich mittels der Arduino-Software bzw. putty/kitty mit dem Board verbinde, wird das Board neu initialisiert (resetted). Jedenfalls erhalte ich die unter "void setup()" eingefügten Ausgaben (siehe Code oben).
In der Dokumentation steht das so nicht drin, da wird die Setup-Routine nur bei der Herstellung der Stromversorgung / dem Reset aufgerufen.
Bedeutet ein Verbindungsaufbau auch immer ein "Reset" oder bricht mir hier irgendwie die USB-Versorgungsspannung ein?

Kann ich mich mit dem laufendem (in "void loop()") befindlichen Board verbinden, ohne diesen Effekt zu haben?

Gruss Stefan

PS:
Spannungseinbruch ist wahrscheinlich Quatsch, da parallel auch die Netzteilversorgung angeschlossen war.

Mittlerweile bin ich allerdings über etwas anderes gestolpert:
Sobald ich mich mittels der Arduino-Software bzw. putty/kitty mit dem Board verbinde, wird das Board neu initialisiert (resetted). Jedenfalls erhalte ich die unter "void setup()" eingefügten Ausgaben (siehe Code oben).
In der Dokumentation steht das so nicht drin, da wird die Setup-Routine nur bei der Herstellung der Stromversorgung / dem Reset aufgerufen.
Bedeutet ein Verbindungsaufbau auch immer ein "Reset" oder bricht mir hier irgendwie die USB-Versorgungsspannung ein?

Kann ich mich mit dem laufendem (in "void loop()") befindlichen Board verbinden, ohne diesen Effekt zu haben?

Wenn ein Programm die serielle Schnittstelle belegt, wird von Windows das DTR Signal auf LOW gezogen. Diese Flanke erzeugt einen Reset.
Das ist der Reset, der eigentlich nur für den Bootloader gebraucht wird.

Wegen USB ist das keine extra Leitung mehr, die du weglassen könntest, sondern kommt aus dem 16U2 IC.
Mit einem 10µF Kondensator zwischen RESET und 5V ( andere empfehlen einen 120 Ohm Widerstand ) kannst du den RESET verhindern.
Auch hat der Arduino extra eine Verbindung zwischen zwei Lötpads (mit RESET-EN beschriftet), die du mit einem Messer durchtrennen kannst.
Und wenn du merkst, dass manuelles Reset-Drücken im richtigen Augenblick für jeden Upload Käse ist, kannst du die RESET-EN Flecken wieder mit Lötzinn verbinden.

Ob 2 Löcher bohren für Pins mit einem Jumper gut ist, weiss ich nicht. Selbst vor dem Aufkratzen der Verbindung wird fast jeder zurückschrecken, denke ich.