- LiTime Speicher und Akkus         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 19

Thema: Uhren-Testprogramm funktioniert nicht

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.03.2013
    Beiträge
    242

    Uhren-Testprogramm funktioniert nicht

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,

    ich mache zZ meine ersten Versuche damit, das Uhren-IC DS1307 zu testen und habe in dem folgenden Sketch einen Fehler, den ich nicht verstehe:

    Ich möchte erreichen, dass die Zeit für die LOOP entweder von den vor dem SETUP definierten Werten Sekunden bis Jahr übernommen wird, oder von der Zeit, die das Uhren-IC aktuell hat.

    Dazu gebe ich vom SM in den ersten 5 s nach Programmstart entweder ein "j" oder ein "n" ein, was in die Variable "Zeit_einlesen" übernommen wird.

    Schreibe ich in die Zeile 47 "if (Zeit_einlesen == "j")" , was ich für richtig halte, dann wird der anschließende Programmteil nicht durchlaufen ("Zeit_einlesen 2 = ....." wird nicht ausgegeben), obwohl unmittelbar vorher "Zeit_einlesen 1 = j" ausgegeben wird.

    Schreibe ich in die Zeile 47 "if (Zeit_einlesen = "j")" , was ich für falsch halte, dann wird der anschließende Programmteil durchlaufen ("Zeit_einlesen 2 = j" wird ausgegeben). Dabei ist es egal, ob ich ein j oder ein n schicke.

    Wo ist da der Wurm drin?

    vG

    fredyxx


    Code:
    /*
    
      Mit diesem Programm wird das Uhren - IC getestet
    
    */
    
    #if defined(ARDUINO) && ARDUINO >= 100
    #include "Arduino.h"
    #else
    #include "WProgramm.h"
    #endif
    #include <Wire.h>
    #include <DS1307.h>
    
    
    int Sekunden  = 1;        //   Vorgaben für den Durchlauf von SETUP
    int Minuten  = 1;
    int Stunden  = 1;
    int Tag_der_Woche = 1;    //     Mo = 1; Di = 2
    int Tag  = 1;
    int Monat  = 1;
    int Jahr  = 17;
    
    String Zeit_einlesen;
    
    void setup() {
    
    
    
      Serial.begin(9600);        // Serielle SS für Ausgabe
      while (!Serial) {
        // wait for serial port to connect. Needed for native USB port only
      }      //   >>>>  Ende while
    
      delay(5000);    // 5 Sekunden lang Zeit für die Eingabe j oder n
    
      Serial.println ("");
      Serial.println (" j = Zeit aus dem Programm uebernehmen;  n = Zeit vom Uhren-IC");
      Serial.println ("");
    
    
      Zeit_einlesen = Serial.readString();        //
    
      Serial.print("Zeit_einlesen 1    =   ");
      Serial.println(Zeit_einlesen);
    
      if (Zeit_einlesen ==  "j")   {
    
        Serial.print("Zeit_einlesen 2    =   ");
        Serial.println(Zeit_einlesen);
    
        RTC.stop();
        RTC.set(DS1307_SEC, Sekunden);     //  Sekunden setzen
        RTC.set(DS1307_MIN, Minuten);     //  Minuten setzen
        RTC.set(DS1307_HR, Stunden);      //  Stunden setzen
        RTC.set(DS1307_DOW, Tag_der_Woche);     //  Tag der Woch setzen
        RTC.set(DS1307_DATE, Tag);        //  Datum Tag setzen
        RTC.set(DS1307_MTH, Monat);       //  Datum Monat setzen
        RTC.set(DS1307_YR, Jahr);         //  Datum Jahr setzen
        RTC.start();
    
      }      //   >>>>  Ende if (Zeit_einlesen == "j")
    
    
    
    }           //   >>>>  Ende Setup
    
    
    void loop() {
      // Daten vom Uhrenbaustein lesen 
    
      Serial.print(RTC.get(DS1307_HR, true));
      Serial.print(":");
      Serial.print(RTC.get(DS1307_MIN, false));
      Serial.print(":");
      Serial.print(RTC.get(DS1307_SEC, false));
      Serial.print("      ");
      Serial.print(RTC.get(DS1307_DATE, false));
      Serial.print("/");
      Serial.print(RTC.get(DS1307_MTH, false));
      Serial.print("/");
      Serial.print(RTC.get(DS1307_YR, false));
      Serial.println();
    
      if ( RTC.get(DS1307_SEC, false) ==  30) {
    
        Serial.println("JA");       //   gibt immer bei 30 Sekunden ein JA aus!!
      }
    
      delay(1000);        // 1 Sekunde warten
    
    
    }

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Hallo!

    Mit "if (Zeit_einlesen = "j")" schreibst du den Wert "j" in Zeit_einlesen und fragst dann, ob Zeit_einlesen ungleich Null ist. Dies ist immer der Fall, da "j" ein (konstanter) String ist.

    Das Problem ist, dass der eingelesene String zusätzliche Sonderzeichen enthalten kann. Wenn du in dem Arduino-Monitor einen Wert eingibst, schließt du die Eingabe mit einem Return ab. Dies ist dann Teil des Strings, der übermittelt wird.

    Vorschlag:
    Zeit_einlesen = Serial.readString().trim();
    Geändert von Sisor (13.09.2017 um 22:09 Uhr)

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.03.2013
    Beiträge
    242
    Danke für die Antwort, aber damit erhalte ich die Fehlermeldung:
    no match for 'operator=' (operand types are 'String' and 'void')

    Nun dämmert es bei mir, dass ich das Problem schon mal hatte. Finde aber die Stelle noch nicht wo und wie ich das gelöst hatte.

    vG

    fredyxx

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Na gut, dann so:
    Zeit_einlesen = Serial.readString();
    Zeit_einlesen.trim();

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    31
    Beiträge
    1.578
    Hi,

    Ich habe selber keinen arduino aber ich würde mal checken was deine eingabefunktion ausgibt. Du liest einen String ein, kann sein dass der mit CR und lf terminiert wird, dann müsstest du dieses später mit abfragen oder wegschneiden.
    Nur so eine Idee!

    Gruß
    Chris

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.03.2013
    Beiträge
    242
    Zitat Zitat von Sisor Beitrag anzeigen
    Na gut, dann so:
    Zeit_einlesen = Serial.readString();
    Zeit_einlesen.trim();
    Danke, so funtioniert es

    vG
    fredyxx

  7. #7
    HaWe
    Gast
    Zitat Zitat von fredyxx Beitrag anzeigen
    Danke für die Antwort, aber damit erhalte ich die Fehlermeldung:
    no match for 'operator=' (operand types are 'String' and 'void')

    Nun dämmert es bei mir, dass ich das Problem schon mal hatte. Finde aber die Stelle noch nicht wo und wie ich das gelöst hatte.

    vG

    fredyxx
    Die Arduino-C++-Klasse String (groß geschrieben) ist das größte Übel seit wir von den Bäumen herunter gekommen sind, wahrscheinlich sogar, seit wir die Ozeane verlassen haben.
    Es hat nichts, aber auch rein gar nichts mehr zu tun mit Standard-C(++) Datentypen wie char* a, char a[] oder string a (klein geschrieben).

    probier's mal mit Abfrage des 1. Zeichens in deinem "String":
    (einfaches Hochkomma für Zeichen, keine Doppel-Anführungszeichen für Zeichenketten!)
    if(Zeit_einlesen[0]=='j') .......


    edit:
    ah, hat sich zeitlich überschnitten!

  8. #8
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.03.2013
    Beiträge
    242
    [QUOTE=HaWe;639090]
    probier's mal mit Abfrage des 1. Zeichens in deinem "String":
    (einfaches Hochkomma für Zeichen, keine Doppel-Anführungszeichen für Zeichenketten!)
    if(Zeit_einlesen[0]=='j') .......

    Danke , das klappt auch!

    Was bedeutet die [0] ??

    vG
    fredyxx

  9. #9
    HaWe
    Gast
    [QUOTE=fredyxx;639092]
    Zitat Zitat von HaWe Beitrag anzeigen
    probier's mal mit Abfrage des 1. Zeichens in deinem "String":
    (einfaches Hochkomma für Zeichen, keine Doppel-Anführungszeichen für Zeichenketten!)
    if(Zeit_einlesen[0]=='j') .......

    Danke , das klappt auch!

    Was bedeutet die [0] ??

    vG
    fredyxx
    strings jeder Art sind grundsätzlich arrays, an jeder Stelle steht ein einzelner Buchstabe.
    Buchstaben sind meist Bytes (unsigned char), bei Arduino seltsamerweise signed char (auf anderen Systemen oder als Steuerzeichen auch teilw. int, führt hier aber zu weit ).
    Die Nummerierung startet in C mit der Null, daher ist array[0] die erste "Zelle", array[1] die 2., usw., bei einem string oder array der Länge n ist also array[n-1] der letzte Buchstabe, der direkt zum string gehört.
    Es folgen dann bei C-strings noch das terminierende Byte 0 ( '\0'), und ggf voher noch das "Enter-Zeichen" (carriage-return, line-feed), wenn du nach deiner string-Eingabe am Schluss die Enter-Taste gedrückt hast, in C auf AVR und ARM und Linux ist das das '\n' (alles andere führt hier zu weit).
    \0 ist der ASCII-Wert 0, nicht das Zahlsymbol 0,
    \n ist der ASCII-Wert 10.

    Für dich ist vor allem wichtig, dass wenn du nur 1 Zeichen per Serial eingibst und mit ENTER abschließt, dieses Zeichen an der 1. Array-Stelle gespeichert wird, also array[0], und dass aber noch weitere Steuerzeichen folgen können, die das System drangehängt hat.

    (edited: )
    Leider kann man sich aber (wie erwähnt) bei Arduino nie recht drauf verlassen, was das alles genau ist. Wenn du also ein 'j' eingibst + ENTER, kann dein String-array so aussehen
    j \0
    -oder-
    j \n \0
    -oder (passiert, wenn man lange genug wartet bevor man dann irgendwann ENTER drückt), auch nur:-
    j
    - IMMER aber steht das j an 1. Stelle, also in der Zelle array[0].


    ANSI C- oder C++ -Funktionen entfernen oder verarbeiten die string-Steuerzeichen mit ihren recht gut dokumentierten Standard-Funktionen, Arduino verwendet dazu die seltsam-verqueren und nicht bis maximal hundsmiserabel dokumentierten String-Class Funktionen wie trim().
    Geändert von HaWe (15.09.2017 um 19:01 Uhr)

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Zitat Zitat von HaWe Beitrag anzeigen
    Die Arduino-C++-Klasse String (groß geschrieben) ist das größte Übel seit wir von den Bäumen herunter gekommen sind, wahrscheinlich sogar, seit wir die Ozeane verlassen haben.
    Es hat nichts, aber auch rein gar nichts mehr zu tun mit Standard-C(++) Datentypen wie char* a, char a[] oder string a (klein geschrieben).
    Was bewegt dich zu solchen haarsträubenden Falschaussagen?
    String-Objekte sind in Arduino als Wrapper um einen Buffer vom Typ char* realisiert, um den Umgang mit Zeichenketten zu vereinfachen und wesentliche Funktionalität wie Vergleich, Modifikation, Verkettung etc. bereitzustellen.

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. atmega32 führt testprogramm nicht aus
    Von exzoys im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 15
    Letzter Beitrag: 01.02.2011, 11:08
  2. Testprogramm läuft nicht
    Von 9999 im Forum Robby RP6
    Antworten: 24
    Letzter Beitrag: 30.05.2009, 18:05
  3. Testprogramm funktioniert nicht!
    Von Gillich im Forum Schaltungen und Boards der Projektseite Mikrocontroller-Elektronik.de
    Antworten: 2
    Letzter Beitrag: 05.04.2008, 00:49
  4. Testprogramm für rn Control funktioniert nicht richtig
    Von thdrummer im Forum Schaltungen und Boards der Projektseite Mikrocontroller-Elektronik.de
    Antworten: 1
    Letzter Beitrag: 26.02.2007, 16:18
  5. Genauigkeit von Uhren
    Von orph im Forum Elektronik
    Antworten: 5
    Letzter Beitrag: 25.09.2006, 17:48

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test