mikrocontroller.net

Forum: Compiler & IDEs rtc 1302 tage vergleichen (arduino)


Autor: DAVID -. (bastler-david)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
Wie kann ich den rtc1302 Chip abfragen und vergleichen welcher wochentag 
heute ist besser gesagt eine if abfrage so schreiben das zb Montag / 
monday wert 1 zu trifft und Dienstag halt wert 2.

ich habe es jetzt zumindest so weit gebracht das ich es zwar Kompilieren 
kann es aber nicht ausgeführt wird.
Habe es unter andern so versucht mit #include <DS1302.h> und :

 if (rtc.getDOWStr(FORMAT_SHORT) == MONDAY)
    {
      mache was nur am montag ();
    }

Und / oder

 if (rtc.getDOWStr(FORMAT_SHORT) == 1) //(1 = Montag)
    {
     mache was ();
    }

so wie

if (rtc.getDOWStr() == MONDAY)
    {
      mache was ();
    }

Auch versucht habe ichs mit

 if (rtc.getDOWStr() == 1) //(1 = Montag)
    {
     mache was ();
    }
und noch andern was mir grade nicht ein fehlt.

Als Fehlermeldung bekomme ich, das ich nur ganze ganze vergleichen kann 
und es versucht wird monday in ein marko umzuwandeln.

So richtig fündig wurde ich auch mit google nicht.
Wie ich zeit abfrage das weiß ich schon länger nur Wochentage 
vergleichen wollten nicht klappen.

Vielen lieben danke für eure/deine Hilfe und ein schönes neues Jahr.

Autor: Codix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo David. Die Funktion liefert einen String zurück und keinen Wert. 
Du musst den String zuerst einem Char Array zuweisen und dann 
vergleichen (strcmp) oder direkt den Aufruf in strcmp als Parameter 
angeben.
Ich würde die erste Variante wählen, einen Hash erzeugen und mit einem 
switch auswerten. strcmp braucht zuviel Zeit. Ein BCC zu erzeugen sollte 
auch ausreichend sein. Habe dies nicht verifiziert, bin mit meinem BLU 
Handy unterwegs.

Autor: Rufus Τ. F. (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde mir die Sourcen dieser "Library" ansehen und die hier 
offensichtlich benötigte Funktion "getDOW" nachrüsten, die den Wochentag 
als numerischen Wert (mit den schon oben im nicht funktionierenden 
Programmbeispiel verwendeten Konstanten wie MONDAY) zurückgibt.

Und das ist simpel. Aus
char *DS1302::getDOWStr(uint8_t format)
{
  char *output= "xxxxxxxxx";
  Time t;
  t=getTime();
  switch (t.dow)
  {
    case MONDAY:
      output="Monday";
      break;
    case TUESDAY:
      output="Tuesday";
      break;
    case WEDNESDAY:
      output="Wednesday";
      break;
    case THURSDAY:
      output="Thursday";
      break;
    case FRIDAY:
      output="Friday";
      break;
    case SATURDAY:
      output="Saturday";
      break;
    case SUNDAY:
      output="Sunday";
      break;
  }     
  if (format==FORMAT_SHORT)
    output[3]=0;
  return output;
}

kann man wirklich sehr, sehr schnell das hier machen:
int DS1302::getDOW()
{
  Time t;
  t=getTime();
  return t.dow;
}

: Bearbeitet durch Moderator
Autor: DAVID -. (bastler-david)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super vielen dank euch beiden. (gesundes neues)

Das einfügen und anpassen an Code war schnell gemacht.
Leider hat sich in:

int DS1302::getDOW()
{
  Time t;
  t=getTime();
  return t.dow;
}
Noch ein Fehler versteckt  (exit status 1  qualified-id in declaration 
before '(' token)  Es muss also in

int DS1302::getDOW()

Noch ein ( eingebaut werden aber wo ?
Vielen dank

Autor: tictactoe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DAVID -. schrieb:
Das hier:
int DS1302::getDOW()
{
  Time t;
  t=getTime();
  return t.dow;
}
kannst du nur schreiben, wenn du auch die Kontrolle über die Klasse 
DS1302 hast. Hast du aber nicht (die kommt ja aus #include <DS1302.h>). 
Es bleibt dir nur übrig, eine freie Funktion zu schreiben:
static int getDOW(DS1302& clock)  // besser: const DS1302& clock
{
  return clock.getTime().dow;
}
Setzt voraus, das getTime() public ist. Wäre aber eine ausgesprochen 
dumme Klasse, wenn es das nicht wäre.

Autor: Rufus Τ. F. (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin natürlich davon ausgegangen, daß der Prototyp der neuen Funktion 
getDOW zur Klassendeklaration in der *.h hinzugefügt wird, und daß die 
Implementierung der Funktion ebenso in der zugehörigen *.cpp-Datei 
erfolgt.

Meine Formulierung

> Ich würde mir die Sourcen dieser "Library" ansehen und die hier
> offensichtlich benötigte Funktion "getDOW" nachrüsten

sollte da eigentlich klar genug gewesen sein.

Autor: DAVID -. (bastler-david)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ehm tut mir leid so ganz folgen könnte ich dir nicht.
Habe gedacht das int DS1302::getDOW() in den code mit soll?

Ok noch mal für mich ich soll also:

int DS1302::getDOW()
{
  Time t;
  t=getTime();
  return t.dow;
}

in die  DS1302.cpp oder in die DS1302.H einbinden ?

und die if ist dann

if (rtc.getDOWStr(FORMAT_SHORT) == MONDAY)
    {
      mache was nur am montag ();
    }
oder nur noch
if (rtc.getDOW) == 1)
    {
      mache was nur am montag ();
    }
Möchte nur verstehen wie man sowas richtig macht.
Vielen lieben dank ihr 3.

Autor: Rufus Τ. F. (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Die Implementierung der Funktion gehört in die *.cpp-Datei, aber in der 
Klassendeklaration in der *.h-Datei musst Du noch einen 
Funktionsprototypen einfügen, damit klar ist, daß die Funktion überhaupt 
eine Memberfunktion der Klasse ist.

Das sieht dann so aus:
...
...

  char  *getDateStr(uint8_t slformat=FORMAT_LONG, uint8_t eformat=FORMAT_LITTLEENDIAN, char divider='.');
  char  *getDOWStr(uint8_t format=FORMAT_LONG);
  char  *getMonthStr(uint8_t format=FORMAT_LONG);
  
  // diese Zeile hier ist neu
  int getDOW();
...
...


Aufgerufen wird die Funktion dann so:
if (rtc.getDOW() == MONDAY)
{
mache was nur am montag ();
}

Wie wäre es, wenn Du nach all der Zeit mal ein Buch über die 
Grundlagen der von Dir genutzten Programmiersprache durchlesen würdest?

Autor: PittyJ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zumindest sollte man den Unterschied von Strings (char *) und Zahlen 
(integer) kennen. Und dafür hilft ein gutes Lehrbuch.
Nur Copy und Paste hilft leider nicht.

Autor: Winfried J. (Firma: Nisch-Aufzüge) (winne) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Basicbeispiel

Print Mid$("MoDiMiDofrSaSo",2*DOW+1,2)

Lässt sich sicher auch in C in einem Einzeiler machen.
Wenn unterschiedliche Stringlänge nötig dann Stringarray.
Das geht vorwärts wie rückwärts.

Sorry bin grad im Basicmode(schüttel), habe tagelang mit dem TFTMaximite 
eine Notrufzentrale mit DTMFübertagung simuliert, wo das Thema auch 
dabei war.

Namaste

Autor: Rufus Τ. F. (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Winfried J. schrieb:
> Lässt sich sicher auch in C in einem Einzeiler machen.

Der Threadstarter möchte nur wissen, welcher Wochentag gerade ist, dazu 
ist überhaupt keine Stringverarbeitung erforderlich. Nur hat aus welchen 
Gründen auch immer die tolle von ihm verwendete "Library" nur eine 
Funktion angeboten, die den Namen des Wochentags als String liefert, 
aber nicht den Wochentag als numerische Konstante (obwohl es eine 
korrespondierende Funktion zum setzen des Wochentags mit numerischer 
Konstante gibt).

Daher bietet es sich an, die fehlende 
"liefere-den-Wochentag-als-numerische-Konstante"-Funktion nachzurüsten, 
und die ist gerade mal ein Dreizeiler, wie sich gezeigt hat.

Stringverarbeitung kommt da gar keine vor; wozu auch?

Autor: Winfried J. (Firma: Nisch-Aufzüge) (winne) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oh das habe ich mit nem 3 Zeiler direkt per I2C direkt in die RTC hinen 
und wieder heraus gepolkt, weil die Systemuhr da einen kompletten Bogen 
drum machte auch im sourcecode des Interpreters. Ich habe extra 
nachgeschaut ob DOW ausgelesen wird. dafür musste ich sogar noch HW 
ändern weil die RTC eine extra I2C bus hat und ich nicht schon wieder 
Die MMBasic.firmware umschreiben wollte, nur da ran zu kommen.

Namaste

Autor: DAVID -. (bastler-david)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bedanke mich noch mal bei euch das einlesen in Bücher und co ist 
durch aus im Hintergrund aber ich muss halt doch fragen weil ich auch 
vieles was ich lese nicht wirklich verstehe daher hier und da mal fragen 
die für euch klar sind für mich aber unverständlich sind.

ok wie dem auch sei.
ich habe so wie ich das verstanden habe ich 2 dateien geändert und das 
Kompilieren ergab schon mal was diesen teil an geht keine Fehler mehr.

obs geht wird sich morgen zeigen / bin zufaul die rtc auszubauen und um 
zuprogrammieren nur für diesen test da warte ich lieber bis morgen.

Ein anderes Problem was mir von Anfang an auf gefallen ist bei der rtc 
Library gibt es Zeilen wo werte als t gespeichert zb ( t=getTime();) 
werden so weit so gut.

ABER Ist es schlimm wenn mehrere librarys werte als t speichern dann im 
Programm code aber in andere buchstaben oder zahlen um gespeichert 
werden ? oder wäre es besser jeder Library extra buchstaben/zahlen 
zugeben?

Danke ihr habt mir bis jetzt schon sehr geholfen.

Autor: Rufus Τ. F. (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DAVID -. schrieb:
> Ein anderes Problem was mir von Anfang an auf gefallen ist

... Du solltest in Deinem Buch mal den Abschnitt über die Gültigkeit 
und Sichtbarkeit von Variablen durchlesen, und den Unterschied 
zwischen lokalen und globalen Variablen herausarbeiten.

Das ist elementares Grundlagenwissen.

Autor: DAVID -. (bastler-david)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo
Kurze Rückmeldung es scheint Woll zu funktionieren.
nach dem bearbeiten der library.
Vielen dank

PS
und für leute die vor dem selben problem stehen hänge ich die geänderten 
daten mal an (Wochen tage wurden ins deutsche geändert)

Autor: Rufus Τ. F. (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DAVID -. schrieb:
> Wochen tage wurden ins deutsche geändert

Die solltest Du Dir nochmal genauer ansehen, da musst Du etwas *mehr 
Sorgfalt* an den Tag legen als Du es bei Deiner eher ... ausbaufähigen 
Rechtschreibung sonst tust.

-> "Sontag"

-> "Maez"

und dann doch englische Namen für Mai, Juli, Oktober und Dezember?

Auch das mit dem Formatieren von Quelltext solltest Du noch etwas üben:
...
  if (format==FORMAT_SHORT)
    output[3]=0;
  return output;
} int DS1302::getDOW() {  Time t;   t=getTime();  return t.dow;
}


Das ist ... grindig.

Autor: DAVID -. (bastler-david)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ok da rufus entweder noch keine zeit hatte oder mein Löschwunsch 
abgeschlagen hat.
Hier noch mal der hinweiß es ist wie rufus schon sagte ist das oben eine 
fehlerhafte Datei BITTE NICHT LADEN.

Hier die richtigen.

Und der code dazu:

if (rtc.getDOW() == 1) //(1 = Montag)
    {
      Tut was an diesen tag
    }

    if (rtc.getDOW() == 2) // = Dienstag)
    {
     Tut was an diesen tag
    }

    if (rtc.getDOW() == 3) // = Mittwoch)
    {
      Tut was an diesen tag
    }

    if (rtc.getDOW() == 4) // = Donnerstag)
    {
     Tut was an diesen tag
    }

    if (rtc.getDOW() == 5) // = Freitag)
    {
     Tut was an diesen tag
    }

    if (rtc.getDOW() == 6) // = Samstag)
    {
      Tut was an diesen tag

    }

    if (rtc.getDOW() == 7) // = Sonntag)
    {
      Tut was an diesen tag
    }

Es müssen zahlen seinen int speichert ja keine Buchstaben ganz vergessen 
:-)

Autor: tictactoe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So eine Kaskade löst man typischerweise mit einem switch:
switch (rtc.getDOW()) {
case 1:
   // tu was am Montag
   break;
case 2:
   ...
}
Als netter Seiteneffekt wird getDOW() nur einmal aufgerufen. Die 
Funktion könnte ja was vollkommen Nicht-Triviales machen, wie z.B. den 
DS1302 auslesen, das will man normalerweise nicht zu oft tun.

Autor: DAVID -. (bastler-david)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok um das Thema abzuschließen es muss doch mit tagen abgefragt werden 
zahlen werden nicht vergleichen ?

also:

if (rtc.getDOW() == friday)
    {
     Tut was an diesen tag
    }

naja es scheint zu laufen ob zufall oder nicht wird sich zeigen müssen.
DANKE euch allen.

Autor: Joachim B. (jar)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Rufus Τ. F. schrieb:
> Nur hat aus welchen
> Gründen auch immer die tolle von ihm verwendete "Library" nur eine
> Funktion angeboten, die den Namen des Wochentags als String liefert,
> aber nicht den Wochentag als numerische Konstante

wobei man sagen muss, die Zeiten ändern sich, damals (tm) in der CT war 
der Sonntag noch 0, heute eben 7
PS die <SPACE> am Ende hatte ich beigefügt um immer die gleiche 
Textlänge zu erhalten
char *strWochentagname( uint8_t TagNummer )
{ switch (TagNummer)
  { case 1:
      return"Montag    ";
    case 2:
      return"Dienstag  ";
    case 3:
      return"Mittwoch  ";
    case 4:
      return"Donnerstag";
    case 5:
      return"Freitag   ";
    case 6:
      return"Samstag   ";
    case 7: //  RTC
      //case 0: //  C'T
      return"Sonntag   ";
    default: 
      return"ERROR     ";
  } // switch (TagNummer)
} // char *strWochentagname( uint8_t TagNummer )

: Bearbeitet durch User
Autor: Rufus Τ. F. (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DAVID -. schrieb:
> Es müssen zahlen seinen

Wozu mag das hier in der *.h-Datei drinstehen?
#define MONDAY    1
#define TUESDAY    2
#define WEDNESDAY  3
#define THURSDAY  4
#define FRIDAY    5
#define SATURDAY  6
#define SUNDAY    7

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.