Go Down

Topic: Programmierfehler besser erkennen ? oder eine Frage des Programmierstils (Read 1 time) previous topic - next topic

big-maec

Hallo,
ich hatte ein bischen Problemme mit der if Schleife. Der Wert wurde nicht immer Richtig ausgewertet.Hardware ist ein S65 Shield mit RTCund Arduino board.

Diese if Auswertung macht Probleme die wurde nicht immer ausgewertet bzw. übersprungen. Obwohl der Sekunden Wert vom RTC immer richtig ankam.
Beispiel:  if(  sec != RTC.get(DS1307_SEC,true))
           {
            .............
            }

Diese if  läuft richtig.
           if( RTC.get(DS1307_SEC,true) != sec)
           {
            .............
            }

Meine Frage: Kann man solche Probleme im vorraus vermeiden ? Eine Frage des Stils ?
Gruesse
big-maec

uwefed

es ist besser, daß Du den Wert des RTC zuerst in eine Variable speicherst und dann diese in der IF-Anweisung vergleichst.
also
wert = RTC.get(DS1307_SEC,true) ;
if( wert != sec)...
Ich kann Dir aber nichts genaueres sagen.
Grüße Uwe

Udo Klein

Was für einen Typ hat "sec"? Und was für einen Typ liefert die Funktion zurück?
Im Zweifelsfall: ja, das ist eine Frage des Stils.
Check out my experiments http://blog.blinkenlight.net

big-maec

Hi,

als Wert bekomme ich ein integer Wert zurück. Die Schleife sollte mir den Sekundenzeiger nach Ablauf einer Sekunde löschen und neu setzen. Parallel dazu habe ich mir noch den Sekunden Wert als Zahl (Digital Uhr) ausgeben lassen. Da hat man deutlich gesehen das der Zeiger innerhalb einer Minute mehrmals für ca 4 Sekunden nicht weiter lief, sprünge waren die Folge.  Allerdings der Zahlen Wert schon. Hier mal die get Routine:

Code: [Select]
int DS1307::get(int c, boolean refresh)  // aquire individual RTC item from buffer, return as int, refresh buffer if required
{
  if(refresh) read();
  int v=-1;
  switch(c)
  {
  case DS1307_SEC:
    v=(10*((rtc_bcd[DS1307_SEC] & DS1307_HI_SEC)>>4))+(rtc_bcd[DS1307_SEC] & DS1307_LO_BCD);
    break;
  case DS1307_MIN:
    v=(10*((rtc_bcd[DS1307_MIN] & DS1307_HI_MIN)>>4))+(rtc_bcd[DS1307_MIN] & DS1307_LO_BCD);
    break;
  case DS1307_HR:
    v=(10*((rtc_bcd[DS1307_HR] & DS1307_HI_HR)>>4))+(rtc_bcd[DS1307_HR] & DS1307_LO_BCD);
    break;
  case DS1307_DOW:
    v=rtc_bcd[DS1307_DOW] & DS1307_LO_DOW;
    break;
  case DS1307_DATE:

   
       v=rtc_bcd[DS1307_DATE]/16 * 10 +  rtc_bcd[DS1307_DATE] % 16;
   
    break;
  case DS1307_MTH:
    v=(10*((rtc_bcd[DS1307_MTH] & DS1307_HI_MTH)>>4))+(rtc_bcd[DS1307_MTH] & DS1307_LO_BCD);
    break;
  case DS1307_YR:

   
      v=2000 + rtc_bcd[DS1307_YR]/16 * 10 + rtc_bcd[DS1307_YR] % 16;
   
    break;

  } // end switch
  return v;
}
Gruesse
big-maec

Udo Klein

Check out my experiments http://blog.blinkenlight.net

big-maec

Gruesse
big-maec

Udo Klein

Ja, aber Du hast immer noch nicht Deinen kompletten Sketch gezeigt. Solche Problemstellen sind nun mal nicht ohne Kontext zu erklären.
Check out my experiments http://blog.blinkenlight.net

big-maec

Hi,

den ganzen Code kann ich hier nicht Einstellen bekomme einen Fehler "The message exceeds the maximum allowed length (9500 characters).". Aber kein Problem den Sketch kann man sich hier herunterladen. Den Sketch habe ich auch schon in meinemt6963c Uhr Project verwendet. Da funktioniert er wesentlich besser. Ich habe mit dem S65-Shield viel mehr Probleme (Interrupts ?) die ich zum Teil schon lösen konnte.Das einzige was noch nicht richtig funktioniert ist die Einstellung des Hardware RTC 1307 über die serielle Schnittstelle.Es funktioniert nur wenn ich den letzten Teil mit dem sd.mount im Main loop ausklammer.
Gruesse
big-maec

Udo Klein

Check out my experiments http://blog.blinkenlight.net

big-maec

Hi,

das stimmt aber jetzt bekomme folgende Fehlermeldung. The upload folder is full. Please try a smaller file and/or contact an administrator. Die Links habe ich korrigiert und ich habe mittlerweile herausgefunden das sprintf den seriellen empfang blockiert, warum ?

Gruesse
big-maec

Go Up