DCF77 Ds7219 Matrix Uhr mit Datum und Temperatur Ds18B20

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • DCF77 Ds7219 Matrix Uhr mit Datum und Temperatur Ds18B20

      Hallo zusammen.

      Ich bin der Mike und lese die Bascom Foren schon seit Jahren. Habe vor über 10 Jahren mal damit angefangen und
      bin nach einiger Abwesenheit wieder hier gelandet. Einiges zum Programmieren ist zwar hängen geblieben, aber
      nach langer Zeit vergisst man einiges wieder. Auffrischen ist angesagt und lernen , lernen, lernen.
      Habe selbst durch Kopieren eurer laufenden Software und dann ändern und anpassen schon was gelernt. Aber
      zum tiefgreifenden verständnis wie was Funktioniert ist ein langer weg. Ist schließlich ein Hobby von mir.

      Aber nun zum Thema:
      heraus gekommen ist eine DCF77 Uhr nach meine bisherigen wünschen. Okay es liegt noch viel potenzal brach, aber
      ich bin zufrieden erstmal damit. Erweiterunge sind schon im Kopf. Die Umsetzung folgt später.

      Danke an die Zwei , Sind im Header der Software verewigt , durch sie bin ich animiert worden.
      Die Uhr hat z.Z. eine Datums und Temperatur Anzeige. Steht alles im Kopfteil vom Code.


      danke an alle
      Gruß Mike

      P.S. ich hoffe mal das ich die richtige Version geladen habe..
      Habe einige Versionen gemacht um zum Ergebins zu kommen.
      Jeder Versuch macht klug. Lach
      Files
    • Hi Mike,
      bei deinem Programm ist mir aufgefallen, dass deine subs 'Datum' und 'Temperatur' kein 'return' enthalten. Das ist nicht gut, weil früher oder später der stack überläuft und dein Programmablauf 'komisch' wird. Das solltest du nochmal prüfen.
      Ansonsten freut es mich, wenn meine Werke als Anregung verwendet werden :thumbsup:
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Hallo. Die "Return" Anweisung kommt doch bei Ablauf der Zeit oder der Temperatur Abarbeitung. Solange ich dort in der sub bin brauche ich kein Return. Oder ? Die Version läuft nun schon seit einer Woche ohne Propleme,aber werde mir das mal durch den Kopf gehen lassen. Danke für den Hinweis.
      Habe eh noch einige Fragen. Aber das klären wir später.

      Mike
    • BASCOM Source Code

      1. Datum:
      2. Do
      3. '--------------------------------------
      4. Tag = _day
      5. Monat = _month
      6. Jahr = _year
      7. '--------------------------------------
      8. Tag_tg = Str(tag)
      9. Tag_tg = Format(tag_tg , "00")
      10. '--------------------------------------
      11. Monat_mo = Str(monat)
      12. Monat_mo = Format(monat_mo , "00")
      13. '--------------------------------------
      14. Jahr_ja = Str(jahr)
      15. Jahr_ja = Format(jahr_ja , "00")
      16. '--------------------------------------
      17. Uhrzeit_neu = Tag_tg
      18. Uhrzeit_neu = Uhrzeit_neu + Monat_mo
      19. Uhrzeit_neu = Uhrzeit_neu + Jahr_ja
      20. Gosub Schreiben
      21. Uhrzeit_alt = Uhrzeit_neu
      22. Gosub Ausgabe
      23. ' Während der Datumsanzeige zum DS18_B_20 Lesen gehen
      24. Gosub Ds18_b_20 ' um Zeit zum Convertieren zu haben
      25. '--------------------------------------
      26. If _sec = 13 Or _sec = 43 Then
      27. Return
      28. Else
      29. nop
      30. End If
      31. '--------------------------------------
      32. Loop
      33. '------- Ende Datumsaufbereitung -----------------------------------------------
      34. '###############################################################################
      35. '------- Temperaturaufbereitung ------------------------------------------------
      36. Temperatur:
      37. Do
      38. '--------------------------------------
      39. Temp_st = Str(temperat)
      40. Temp_st = Format(temp_st , "+00.0") + "'" 'Chr(67) 'Anzeige Formatieren
      41. '---------------------------------------
      42. Uhrzeit_neu = Temp_st
      43. Gosub Schreiben
      44. Uhrzeit_alt = Uhrzeit_neu
      45. Gosub Ausgabe
      46. '--------------------------------------
      47. If _sec = 16 Or _sec = 46 Then
      48. Return
      49. Else
      50. nop
      51. End If
      52. '--------------------------------------
      53. Loop
      Display All

      Helimike0705 wrote:

      Die "Return" Anweisung kommt doch bei Ablauf der Zeit oder der Temperatur Abarbeitung.
      Nein. Du hast zwei Label die keine Sub darstellen.
      Eine Sub-Routine sieht immer so aus

      BASCOM Source Code

      1. Name_der_sub:
      2. 'Anweisungen
      3. Return
      Du hast nach dem Label einfach nur eine Do Loop die da nicht wirklich hin gehört.
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Helimike0705 wrote:

      Mein Return bei Ablauf der Zeiten ist nicht zwingend bei Ablauf der gegeben Zeit
      Den Satz verstehe ich jetzt garade nicht so ganz.
      Aber du hast drei Do Loop Schleifen im Programm ohne Abbruchbedingung, somit also wie drei Hauptschleifen.
      Ein Programm besteht aus nur einer Hauptschleife und ggf einigen Unterprogrammen.
      Zum Beispiel so:

      BASCOM Source Code

      1. 'Hauptschleife
      2. Do
      3. ...Anweisungen
      4. Gosub Mach_was
      5. ...Anweisungen
      6. Loop
      7. End
      8. 'Unterprogramm
      9. Mach_was:
      10. ...Anweisung
      11. Return
      Display All

      Dein Programm wird sich so früher oder später "aufhängen".
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Erstmal danke für deine mühen mit mir. Eine Do loop. Dann in die sub. Zurück wenn sub fertig. Und in dieser Do loop alles andere .. Bis Bedingung erfüllt. Dann nächster Schritt. Okay. Da werde ich das mal um schreiben.
      Somit wird in einer Loop Schleife alles abgearbeitet. Richtig?

      So langsam macht das Spaß wenn man auf auf Anfängerfehler hingewiesen wird.

      Danke

      LG Mike
    • Helimike0705 wrote:

      Somit wird in einer Loop Schleife alles abgearbeitet. Richtig?
      Richtig, die Do Loop ist das Hauptprogramm, wo alles abläuft und Unterprogramme angesprungen werden.
      Und falls du mal eine Do Loop in einem Unterprogramm brauchst, dann geht das so:

      BASCOM Source Code

      1. Mach_was:
      2. Do
      3. ...Anweisung
      4. Loop Until Bedingung = Erfüllt
      5. Return
      Als Bedingung kann man einen Zähler hochzählen oder andere Sachen abfragen wei z.B. einen Taster
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Hallo Mike,
      zwei Zitate:

      Ein Unterprogramm ist ein in sich abgeschlossenes Programm innerhalb Eures Gesamtprogramms. Wenn keine Sonderform (wie hier bei Debounce) angewendet wird, springt man gewöhnlich mit dem Befehl Gosub (gehe zur (Sub) Unterroutine) zu einem solchen Teilprogramm. Hier werden beispielsweise Befehlsfolgen abgearbeitet, welche im Programm an unterschiedlichen Stellen immer in gleicher Form geschrieben werden müßten. Durch die Verwendung der Unterroutine braucht dieser Programmteil aber nur einmal geschrieben zu werden. Jedesmal wenn er ausgeführt werden soll wird mit dem Befehl Gosub in diesen Programmteil verzweigt. Das Hauptprogramm merkt sich die Stelle, an der es sozusagen "abgebogen" ist. Das Unterprogramm wird generell mit Return (Zurück) abgeschlossen. Das Programm weiß nun, dass die Unterroutine beendet ist und spring an die Stelle zurück, an der das Hauptprogramm mit Gosub verlassen wurde. Es kann auch in einer Unterroutine nochmals mit Gosub in eine weitere Unterroutine gesprungen werden. Man spricht in diesem Fall von "Verschachtelung"

      Unterprogramme (Subroutinen) beginnen in BASCOM mit einem eindeutigen Namen und einem nachfolgendem Doppelpunkt. Unterprogramme (Subroutinen) werden immer mit Return beendet (verlassen).

      Entnommen hier: MCK 1.2.1 Entprellen von Tastern


      Gruß Christian
      Wenn das die Lösung ist, möchte ich mein Problem wieder haben.
    • Helimike0705 wrote:

      Die "Return" Anweisung kommt doch bei Ablauf der Zeit oder der Temperatur Abarbeitung.
      Jetzt hab' ich's auch kapiert, wie du es gemeint hast.
      Ich hätte einen Vorschlag:
      Die main, die jede Sekunde einmal durchlaufen wird enthält eine select case-Struktur mit der Sekunde. Damit wird entschieden, was angezeigt werden soll.
      select case Sekunde
      case 10 to 13: gosub temperatur
      case 14 to 17: gosub datum
      case 40 to 43: gosub temperatur
      case 44 to 47: gosub datum
      case else : gosub zeit
      end select
      Die sub Zeit steht jetzt gerade noch praktisch als main da und wird zu einer sub zusammen gefasst.
      in den subs wird jetzt der Ausgabetext, hier noch mit 'Uhrzeit_neu' bezeichnet (könnte man etwas 'neutrale bezeichnen, wie 'Text_neu' und 'Text_alt') zusammen gesetzt und in der folgenden sub Ausgabe angezeigt. Ist dann vielleicht übersichtlicher.
      Das Messen der Temperatur braucht eigentlich bisschen mehr als deine 100 msec. Diese Anweisungen
      1wreset ' reset the bus
      1wwrite &HCC
      1wwrite &H44 ' start measure
      Waitms 100 ' wait for end of conversion
      könntest du auch nach dem Auslesen
      1wreset ' reset the bus
      1wwrite &HCC ' read internal RAM
      1wwrite &HBE ' read 9 data bytest
      ausführen, denn nach dem Auslesen passiert ja 1 Sekunde lang nix. Dann kannst du auch das waitms 100 weg lassen.
      Langer Text, kurzer Sinn, nur ein Vorschlag, keine Kritik :D
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Noch ein Vorschlag:
      Durch die unterschiedlichen Texte, Zeit, Datum, Temperatur, hast du ja auch unterschiedliche Trennzeichen, die ja jetzt nicht gescrollt werden, sondern eher platziert werden. Man könnte das scrollen verschönern, indem der neue Text, samt Trennerzeichen, in den lower Teil des Speichers geladen wird (wie jetzt auch) und bei der Anzeige wird spaltenweise der higher Teil mit dem lower verglichen. Gibt's einen Unterschied, wird der higher Teil (der angezeigt wird) um 1 bit nach oben geshiftet und vom lower Teil ein bit in den durch das shiften frei werdenden Platz kopiert. Das 8x und im higher Teil der Spalte steht der lower Teil. Auf die Art ist das viel universeller und auch hübscher. Du bist auch nicht auf die Lage der Ziffern innerhalb der Displaybreite angewiesen, kannst also die Temperatur platzieren, wie du willst und auch ein °C anzeigen lassen.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Danke für die Erklärung. Mir war nicht ganz bewusst, das Do .. Loop in einer Sub nicht so gut ist. Mit loop until aber Nachbar.

      Na das ist ja super. Genau diese Art und Weise wie du schreibst, tschoaetsch, ist meine Vorstellung. Wie gesagt. Ich muss mich erstmal in die Speicher Verwaltung einarbeiten und verstehen wie das abläuft.
      Momentan habe ich das ja nur kopiert und etwas lauffähig gemacht. Aber es macht Spaß seinen Grips anzustrengen und hier lernt man doch einiges dank eurer Hilfe.
    • Es ist vielleicht auch nicht so geschickt, dass ich den Speicher als word-array angelegt hab'. Das sind halt die Freiheiten beim Programmieren, die aber nicht immer 100% toll sind. 2 byte-arrays wären übersichtlicher, eins enthält den neuen Text und dient nur zum Vergleichen, ob die Daten, die im 2. array stehen und angezeigt werden, unterschiedlich sind. Wenn ja, wird durch shiften und bitweisen Kopieren das 2. array dem 1. gleich gemacht und so entsteht auf der Anzeige dann der neue Text.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Source Code

      1. '--------- Anzeige Vorbereiten -------------------------------------------------
      2. Gosub Ds18_b_20_1 'erstmal Aufrufen -->Reseten und Messen Starten
      3. Waitms 600 'Warten.zum Convertieren
      4. Gosub Ds18_b_20_2 'jetzt Daten der Temp. holen
      5. Gosub Init_max7219 'Display initialisieren
      6. Gosub Loeschen 'Display loeschen
      7. Wait 1
      8. Text_alt = " "
      9. '###############################################################################
      10. '------ Uhrzeit Aufbereiten ----------------------------------------------------
      11. Do
      12. Select Case _sec
      13. Case 10 To 13 : Gosub Datum
      14. Case 13 To 16 : Gosub Temperatur
      15. Case 40 To 43 : Gosub Datum
      16. Case 43 To 46 : Gosub Temperatur
      17. Case Else : Gosub Zeit
      18. End Select
      19. If _sec = 55 Then Gosub Ds18_b_20_1
      20. If _sec = 57 Then Gosub Ds18_b_20_2
      21. While Sekunde = _sec
      22. Wend
      23. Gosub Schreiben
      24. Text_alt = Text_neu
      25. Gosub Ausgabe
      26. Loop
      27. '-------------------------------------------------------------------------------
      28. Zeit:
      29. '-----------------------------------------
      30. Sekunde = _sec
      31. Minute = _min
      32. Stunde = _hour
      33. '-----------------------------------------
      34. Stunde_st = Str(stunde)
      35. Stunde_st = Format(stunde_st , "00")
      36. '-----------------------------------------
      37. Minute_st = Str(minute)
      38. Minute_st = Format(minute_st , "00")
      39. '-----------------------------------------
      40. Sekunde_st = Str(sekunde)
      41. Sekunde_st = Format(sekunde_st , "00")
      42. '-----------------------------------------
      43. Text_neu = Stunde_st
      44. Text_neu = Text_neu + Minute_st
      45. Text_neu = Text_neu + Sekunde_st
      46. Return
      47. '------- Ende Uhrzeitaufbereitung ----------------------------------------------
      48. '------- Datum aufbereiten -----------------------------------------------------
      49. Datum:
      50. Waitms 300 'muss sein damit es in der Anzeige nicht durchrollt
      51. '--------------------------------------
      52. Tag = _day
      53. Monat = _month
      54. Jahr = _year
      55. '--------------------------------------
      56. Tag_st = Str(tag)
      57. Tag_st = Format(tag_st , "00")
      58. '--------------------------------------
      59. Monat_st = Str(monat)
      60. Monat_st = Format(monat_st , "00")
      61. '--------------------------------------
      62. Jahr_st = Str(jahr)
      63. Jahr_st = Format(jahr_st , "00")
      64. '--------------------------------------
      65. Text_neu = Tag_st
      66. Text_neu = Text_neu + Monat_st
      67. Text_neu = Text_neu + Jahr_st
      68. Return
      69. '------- Ende Datumsaufbereitung -----------------------------------------------
      70. '------- Temperaturaufbereitung ------------------------------------------------
      71. Temperatur:
      72. Temp_st = Str(temperat)
      73. Temp_st = Format(temp_st , "+00.0") + "'" 'Chr(67) 'Anzeige Formatieren
      74. Text_neu = Temp_st
      75. Return
      76. '------- Ende Temperaturaufbereitung --------------------------------------------
      77. '###################### DS18_B_20 Abfragen #####################################
      78. Ds18_b_20_1:
      79. 1wreset ' reset the bus
      80. 1wwrite &HCC
      81. 1wwrite &H44 ' start measure
      82. Return
      83. '-------------------------------------------------------------------------------
      84. Ds18_b_20_2:
      85. 1wreset ' reset the bus
      86. 1wwrite &HCC ' read internal RAM
      87. 1wwrite &HBE ' read 9 data bytest
      88. Bd(1) = 1wread(9) ' Lese Ram aus und speicher in Array
      89. T = Makeint(bd(1) , Bd(2))
      90. T = T * 10
      91. T = T / 16
      92. Temperat = T
      93. Return
      94. '-------------------------------------------------------------------------------
      Display All
      Hallo. Habe mich mal dran gemacht. Hoffe mal ich bin auf dem richtigen Weg und habe die Vorschläge richtig umgesetzt. Jetzt habe ich Sub´s und eine Main. Die Aufteilung der Daten
      muss ich noch erledigen, bzw mal genau durchdenken wie das funktioniert. Klar würde mir dies besser gefallen. Aber ich komme da auch noch hin. Einen Schrit nach dem anderen.
      Bräuchte nur eine Bestätigung bzw einen Hinweis ob dies momentan so richtig ist.

      The post was edited 1 time, last by Helimike0705 ().

    • Es ist zwar nicht der komplette Quellcode aber auf den ersten Blick sieht es gut aus.

      Helimike0705 wrote:

      If _sec = 55 Then Gosub Ds18_b_20_1
      If _sec = 57 Then Gosub Ds18_b_20_2
      Diese beiden If Abfragen könntest du ebenfalls mit in den Select-Case Block packen

      BASCOM Source Code

      1. Select Case _sec
      2. Case 10 To 13 : Gosub Datum
      3. Case 13 To 16 : Gosub Temperatur
      4. Case 40 To 43 : Gosub Datum
      5. Case 43 To 46 : Gosub Temperatur
      6. Case 55 : Gosub Ds18_b_20_1
      7. Case 57 : Gosub Ds18_b_20_2
      8. Case Else : Gosub Zeit
      9. End Select
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • habe den Absichtlich nicht komplett gepostet. der Teil kann so wie er ist, eingefügt werden gegen den anderen. Das davor bleibt und danach ist auch "noch" so.

      Möcht ja hier im Forum auch Speicherplatz sparen. Aber kann wenn gewünscht alles komplett einstellen, nur ist das mit den Punkten und Komma zwischen den Zahlen
      noch nicht fertig. das wird die nächste Baustelle. Nur ist die für mich noch etwas aufwendiger und lernintensiver.

      Und Case 55 , bzw Case 57 hatte ich auch erst. nur ist da die Zeit zu lang im abarbeiten, warum weis ich noch nicht. Mit if then geht es komischer Weise ohne es zu merken in der Anzeige.
      Bei Case in die sub vom ds18b20 zuspringen, bleibt die Anzeige eine Sekunde stehen. Habe die Abfrage jetzt aufgeteil und frage ja nacheinander ab.
    • Helimike0705 wrote:

      Aber kann wenn gewünscht alles komplett einstellen
      die wenigsten machen sich die Mühe, fremden Code zu durchforsten.
      Von den wenigen gibt es nur eine kleine Menge, die sich auch Codefragmente anschauen.
      Der Poster des Codestückes weiß ja nicht, dass der Fehler nicht in dem Codestück zu finden ist.
      Das wissen aber viele Helfer und machen sich dann nicht die Mühe.

      So gesehen ist es nicht der Wunsch hier, dass du deinen Code komplett postest, sondern es liegt in deiner Hand, ob du ernsthafte Hilfe oder einen Zufallstreffer bekommst.
    • Hallo. Da gebe ich dir recht Mischael. Also im Anhang das Komplett-Programm, ist zwar noch fehlerhaft aber momentan lauffähig. Fehlerhaft wegen der Anzeige die mir noch nicht gefällt.
      Arbeite an der Umsetzung wie von Tschoeatsch vorgeschlagen. Nur dauert dies halt noch, bin am verstehen Lernen der Zusammensetzung des Strings zum Anzeigen. Werde mich aber melden wenn ich nicht vorwärts komme. Erstmal selbst versuchen, nicht alles Andere machen lassen. Habe ja schon den Code von hier benutzt. Nun möcht ich ihn an meine Wünsche anpassen.

      Erweiterungen: beispielsweise eine Speicherung der Mini und Maxi-Werte der Temperatur auf Abfrage mittels Taster. Sowie einen zweiten Sensor für die Aussentemperatur. Da auch Mini
      und Maxi-Werte. Weckerfunktion usw, es gibt ja viele Sachen die da bestimmt machbar sind. Habe ja erst 18% Speicherverbrauch bei dem Arduino-Nano.

      Gruß Mike
      Files