Uhr mit 4x 8x8 Led-Matrix Max7219

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • maheau0 schrieb:

      eine Anzeige zum DCF-Status anzeigen einarbeiten
      Wird deine Uhrzeit synchronisiert? Oder brauchst du eine Anzeige, die ein bisschen über die Signalqualität was aussagt?
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • maheau0 schrieb:

      entweder der Doppelpunkt blinkt entsprechend DCF Sekundentakt , oder Led leuchtet bei Syncronikation.
      Das Blinken würde nicht zu der rollenden Anzeige passen. Ich schlage vor, den Trenner bei gültigem Empfang als Doppelpunkt zu machen, bei längerem Ausbleiben des Empfangs als 'langes Komma'.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Hier die neueste Programmversion

      BASCOM-Quellcode

      1. 'Max7219 Test
      2. 'Uhrzeit wird wie mit einem Walzenzählwerk angezeigt
      3. 'Empfang einer gültigen Zeit in den letzten 5 Minuten wird durch den Trenner signalisiert
      4. 'Die Led ist eine Hilfe für die Beurteilung des Zeitsignals, ein Flackern ist schlecht.
      5. $regfile = "m328pdef.dat"
      6. $crystal = 16000000
      7. $hwstack = 38
      8. $swstack = 12
      9. $framesize = 25
      10. Max_din Alias Portd.2 : Config Max_din = Output
      11. Max_clk Alias Portd.3 : Config Max_clk = Output
      12. Max_cs Alias Portd.4 : Config Max_cs = Output
      13. Led Alias Portb.5 : Config Led = Output
      14. 'Das Signal vom DCF-Empfänger wird an den Kontrollerpin portd.7 erwartet
      15. 'DCF77 einrichten
      16. Config Dcf77 = Pind.7 , Timer = 1 , Update = 0 , Inverted = 0 , Check = 1 , Timer1sec = 0
      17. 'Set Portd.7 'pullup setzen
      18. Declare Sub Schreiben(byval Ziffer As Byte , Byval Spalten_nummer As Byte )
      19. Enable Interrupts
      20. Const Anzahl_module = 5
      21. Dim Display_speicher(anzahl_module * 8) As Word '8 Spalten für jedes Modul
      22. Dim Zeile As Byte
      23. Dim Display_speicher_bit As Byte
      24. Dim Zeilen_nummer As Byte
      25. Dim Spalte As Byte
      26. Dim Tabellen_stelle As Byte
      27. Dim Display_daten As Byte , Display_digit As Byte
      28. Dim X As Byte , Z As Byte , Zz As Byte
      29. Dim N As Byte
      30. Dim Z_neu(6) As Byte
      31. Dim Z_alt(6) As Byte
      32. Dim Trenner As Byte , Trenner_alt As Byte
      33. Dim Status As Word
      34. Dim Buchstabenspalte As Byte
      35. Dim Sekunde As Byte
      36. Wait 1
      37. Gosub Init_max7219 'Display initialisieren
      38. Time$ = "09:59:30" 'nur zu Testzwecken, kann auskommentiert werden
      39. For N = 1 To 6 'Werte vorbelegen
      40. Z_alt(n) = 10
      41. Next N
      42. Trenner_alt = 10
      43. Do
      44. Do
      45. If Status > 0 Then Decr Status
      46. If Dcf_status.7 = 1 Then 'wenn gültiger Zeitempfang war
      47. Status = 300 '5 Minuten
      48. Reset Dcf_status.7
      49. End If
      50. Sekunde = _sec
      51. Z_neu(1) = _sec Mod 10
      52. Z_neu(2) = _sec / 10
      53. Z_neu(3) = _min Mod 10
      54. Z_neu(4) = _min / 10
      55. Z_neu(5) = _hour Mod 10
      56. Z_neu(6) = _hour / 10
      57. Call Schreiben(z_neu(6) , 1)
      58. Call Schreiben(z_neu(5) , 7)
      59. Call Schreiben(z_neu(4) , 15)
      60. Call Schreiben(z_neu(3) , 21)
      61. Call Schreiben(z_neu(2) , 29)
      62. Call Schreiben(z_neu(1) , 35)
      63. If Status > 0 Then 'Trennzeichen in Abhängigkeit vom Zeitraum zum letzten gültigen Zeitempfang darstellen
      64. Trenner = 1
      65. Display_speicher(13) = Display_speicher(13) And &HFF00
      66. Display_speicher(13) = Display_speicher(13) + &B00101000
      67. Display_speicher(14) = 0
      68. Display_speicher(27) = Display_speicher(27) And &HFF00
      69. Display_speicher(27) = Display_speicher(27) + &B00101000
      70. Display_speicher(28) = 0
      71. Else
      72. Trenner = 0
      73. Display_speicher(13) = Display_speicher(13) And &HFF00
      74. Display_speicher(13) = Display_speicher(13) + &B01110000
      75. Display_speicher(14) = 0
      76. Display_speicher(27) = Display_speicher(27) And &HFF00
      77. Display_speicher(27) = Display_speicher(27) + &B01110000
      78. Display_speicher(28) = 0
      79. End If
      80. 'Ziffern anzeigen und die veränderten umändern
      81. For Z = 1 To 8
      82. If Z_neu(6) <> Z_alt(6) Then
      83. For Zz = 1 To 6
      84. Shift Display_speicher(zz) , Left , 1
      85. Next Zz
      86. End If
      87. If Z_neu(5) <> Z_alt(5) Then
      88. For Zz = 7 To 12
      89. Shift Display_speicher(zz) , Left , 1
      90. Next Zz
      91. End If
      92. If Z_neu(4) <> Z_alt(4)then
      93. For Zz = 15 To 20
      94. Shift Display_speicher(zz) , Left , 1
      95. Next Zz
      96. End If
      97. If Z_neu(3) <> Z_alt(3) Then
      98. For Zz = 21 To 26
      99. Shift Display_speicher(zz) , Left , 1
      100. Next Zz
      101. End If
      102. If Z_neu(2) <> Z_alt(2) Then
      103. For Zz = 29 To 34
      104. Shift Display_speicher(zz) , Left , 1
      105. Next Zz
      106. End If
      107. If Z_neu(1) <> Z_alt(1) Then
      108. For Zz = 35 To 40
      109. Shift Display_speicher(zz) , Left , 1
      110. Next Zz
      111. End If
      112. If Trenner <> Trenner_alt Then
      113. Shift Display_speicher(13) , Left , 1
      114. Shift Display_speicher(27) , Left , 1
      115. End If
      116. Gosub Ausgabe
      117. Waitms 50
      118. Next Z
      119. For N = 1 To 6 'Werte vorbelegen
      120. Z_alt(n) = Z_neu(n)
      121. Next N
      122. Trenner_alt = Trenner
      123. 'auf die nächste Sekunde warten
      124. While Sekunde = _sec
      125. Led = Pind.7
      126. Wend
      127. Loop
      128. Loop
      129. End
      130. '##################################################### Main-Frame
      131. Sub Schreiben(ziffer As Byte , Byval Spalten_nummer As Byte)
      132. Spalte = Spalten_nummer
      133. Tabellen_stelle = Ziffer * 6
      134. For X = 0 To 5 'das bitmuster spaltenweise in den Speicher schreiben
      135. Buchstabenspalte = Lookup(tabellen_stelle , Font_tabelle)
      136. Display_speicher(spalte) = Display_speicher(spalte) And &HFF00
      137. Display_speicher(spalte) = Display_speicher(spalte) + Buchstabenspalte 'in den lsb-byte vom word schreiben
      138. Tabellen_stelle = Tabellen_stelle + 1
      139. Spalte = Spalte + 1
      140. Next X
      141. End Sub
      142. Ausgabe:
      143. 'Ausgabe an die Module und den neuen Speicherinhalt anzeigen lassen
      144. For Display_speicher_bit = 8 To 15 'die msb-bits werden angezeigt
      145. Zeilen_nummer = Display_speicher_bit - 7
      146. Spalte = 1
      147. Max_cs = 0
      148. While Spalte < 41
      149. For N = 7 To 0 Step -1
      150. Zeile.n = Display_speicher(spalte).display_speicher_bit
      151. Incr Spalte
      152. Next N
      153. Shiftout Max_din , Max_clk , Zeilen_nummer , 1
      154. Shiftout Max_din , Max_clk , Zeile , 1
      155. Wend
      156. Max_cs = 1
      157. Next Display_speicher_bit
      158. Return
      159. Init_max7219: ' Initialisieren des MAX7219
      160. Display_digit = &H0C : Display_daten = &H00 ' Shutdown On
      161. Gosub Led_write_command
      162. Display_digit = &H09 : Display_daten = &H00 ' kein decode "B" für alle Digits
      163. Gosub Led_write_command
      164. Display_digit = &H0A : Display_daten = &H03 ' Helligkeit 0-F
      165. Gosub Led_write_command
      166. Display_digit = &H0B : Display_daten = 7 ' Anzahl Digits 8
      167. Gosub Led_write_command
      168. Display_digit = &H0F : Display_daten = 0 ' Test Off
      169. Gosub Led_write_command
      170. Display_digit = &H0C : Display_daten = 1 ' Shutdown Off
      171. Gosub Led_write_command
      172. Return
      173. Led_write_command:
      174. Max_cs = 0
      175. For N = 1 To 5 'alle 5 Max bekommen die Einstellungen gesendet
      176. Shiftout Max_din , Max_clk , Display_digit , 1
      177. Shiftout Max_din , Max_clk , Display_daten , 1
      178. Next N
      179. Max_cs = 1
      180. Return
      181. Font_tabelle:
      182. 'Font5x8
      183. 'Data 62 , 81 , 73 , 69 , 62,0 ' 0
      184. Data 62 , 65 , 65 , 65 , 62 , 0 ' O
      185. Data 0 , 66 , 127 , 64 , 0 , 0 ' 1
      186. Data 98 , 81 , 73 , 73 , 70 , 0 ' 2
      187. Data 34 , 73 , 73 , 73 , 54 , 0 ' 3
      188. Data 24 , 20 , 18 , 127 , 16 , 0 ' 4
      189. Data 47 , 73 , 73 , 73 , 49 , 0 ' 5
      190. Data 60 , 74 , 73 , 73 , 48 , 0 ' 6
      191. Data 1 , 113 , 9 , 5 , 3 , 0 ' 7
      192. Data 54 , 73 , 73 , 73 , 54 , 0 ' 8
      193. Data 6 , 73 , 73 , 41 , 30 , 0 ' 9
      194. Data 0 , 0 , 0 , 0 , 0 , 0 'Leerzeichen
      Alles anzeigen
      compilieren muss du jetzt mal selber a_42_02cc30b2
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Neenee, so einfach machen wir das nicht. Wir versuchen die Fehler zu bereinigen.
      Fangen wir mal mit dem ersten an:
      Schreibe mal dim display_speicher(40) as word. Die Berechnung 'anzahl_module * 8' führen wir einfach mal selber aus und schreiben eben das Ergebnis '40' rein. Das war vielleicht schon alles. Also ändern und compilieren.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • @tschoeatsch

      Du solltest langsam mal Deinen Stundensatz bekanntgeben un d ne Zwischenrechnung schreiben.

      @maheau0

      Langsam solltest Du mal versuchen selbst was zu machen. Das Forum gibt Hilfe zur Selbsthilfe ist aber nicht für Schnurrer gedacht, die auch noch Forderungen stellen. "Schicke mal..., Mache mal... etc".

      Gruß Harald
      Wem ich nicht ausdrücklich widerspreche, der darf das bis auf Widerruf als "Gefällt mir" verstehen.
    • @maheau0
      Was kriegst du nicht hin? Wenn du schon um Hilfe bittest, dann auch konkret ansprechen.
      so z.B. "Ich weis nicht, wo ich die 40 eintragen soll?" ,oder so ähnlich.

      Was soll der Ruf nach der Hex-Datei ?
      Wenn du das Programm so nicht in den Griff bekommst, hilft dir die Hex-Datei erst recht
      nicht weiter. Tschoeatsch schickt dir die Hex , du spielst sie auf , und.... funktioniert nicht a_56_df238249
      Dann stehst du wieder da ?( ,und rufst nach Hilfe.
      Meine Erfahrung ist, learning by doing , nur so kannst du in die Welt der µC eintauchen.
      Und es gibt hier keinen, glaube ich zu mindest, der dir nicht helfen würde,wenn er könnte.
      Hilfe aber musst du so verstehen, das dir geholfen wird, dir selbst zu helfen.

      Detlef
      Leichtsinn ist kein Mut, Vorsicht keine Feigheit.
    • @maheau0 jetzt poste mal hier das von dir geänderte Programm, aber bitte nicht zum downloaden, sondern als gleich sichtbare Version. Verwende dazu beim Antworten die Schaltfläche </> hier im Forumseditor.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Ok, jetzt hast du 'Dim Display_speicher(40) As Word' doppelt drin stehen, gibt eine Fehlermeldung. Mach eine von den beiden gleichen Zeilen raus.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Du hast diese Zeile 'Dim Display_speicher_bit As Byte' überschrieben, die fehlt jetzt im Programm, bitte wieder einsetzen. Vergleiche mit meinem geposteten Programmlisting.
      Raum für Notizen

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

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