Siebensegment Timer mit MAX7219 mit sechs Segmente

    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!

    • @tschoeatsch


      Ich habe das Programm auf den Controller gespielt, es läuft tatsächlich rückwärts ich werde das Programm ausarbeiten.
      mal sehen wich ich es auch Takte genau mit 1 Hz wahrscheinlich mit einem Uhrenquarz

      Quellcode

      1. Config Clock = Soft
      2. Dim Bsec As Byte , Bmin As Byte , Bhour As Byte
      3. Dim Zeit As Long
      4. Gosub Init_max7219 'Display initialisieren
      5. '#####################################################
      6. Zeit = 59 'Startzeit in Sekunden angeben
      7. Do
      8. Bsec = Time(zeit)
      9. W_st(4) = Bsec Mod 10
      10. W_st(3) = Bsec / 10
      11. W_st(2) = Bmin Mod 10
      12. W_st(1) = Bmin / 10
      13. ' W_st(2) = bhour Mod 10
      14. ' W_st(1) = bhour / 10
      15. ' If W_st(1) = 0 Then W_st(1) = 10
      16. Gosub Anzeigen
      17. Wait 1
      18. If Zeit > 0 Then Decr Zeit Else Zeit = 59
      19. Loop
      20. End
      Alles anzeigen
    • Memory schrieb:

      Ich kenne das Tool ich werde wahrscheinlich ein RTC Signal benutzen ich hatte einen Quarzoszillator benutzt weil die genauer sind als ein Quarz für ein ähnliches Projekt,
      natürlich hatte ich da Abweichungen warum auch immer.
      Hallo Memory,
      ich dachte du redest hier über einen "Kuzzeittimer", also bestimmt unter einem Tag.
      Da kannst du doch keine wirklich bemerkbaren Abweichungen haben.
      2-3 sec am Tag wären nach meinem Verständnis für einen normalen Quarz das höchste der Gefühle.
      Also andere sollte in durch dein Programm hervorgerufen sein.
      "Natürlich" sind die definitiv nicht, wenn die Abweichungen deutlich darüber liegen.
      Zeige doch mal dein ganzes Programm, dann sieht man vielleicht, woran es liegt.
    • In meinem Programm ist es vielleicht ungünstig 'config clock=soft' zu schreiben. Ich bin mir jetzt nicht sicher, ob da jetzt timer und anderer Schnickes eingerichtet wird, den man nicht braucht. Besser wäre vielleicht 'config clock=user'. Da muss man sich um den Takt selber kümmern (was du ja machen willst), es werden aber die Variablen für eine clock bereit gestellt.
      Alles im Konjunktiv, weil ich mir nicht 80% sicher bin. Kannst du das mal probieren?
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Ich hab' jetzt mal einen interrupt mit timer1 zusammengebastelt. Hast du ein 4MHz Quarz dran? Wenn ja, dann überprüfe doch mal die Genauigkeit über eine längere Zeit in meinem Programm ist jetzt mal 1 Stunde vorgegeben.

      Die ports must du an deine hardware anpassen!

      BASCOM-Quellcode

      1. 'Max7219 Anzeige
      2. '7-Segment
      3. $regfile = "m8def.dat"
      4. $crystal = 4000000
      5. $hwstack = 42
      6. $swstack = 16
      7. $framesize = 32
      8. Config Portd.5 = Output : Din_display Alias Portd.5
      9. Config Portd.7 = Output : Clk_display Alias Portd.7
      10. Config Portd.2 = Output : Cs_display Alias Portd.2
      11. Config Timer1 = Timer , Prescale = 64 , Clear_timer = 1
      12. Compare1a = 62500 - 1
      13. On Compare1a Timer1_isr
      14. Enable Compare1a
      15. Enable Interrupts
      16. 'Timer value explination
      17. ' The timer is a 16Bit timer, it overflows when the timer reaches 65536
      18. ' The AVR is running at 4000000Hz, the prescaler is 64
      19. ' Each tick is 0,016 ms - (1 / CPUSpeed in KHz ) * Prescaler
      20. ' The timer needs 62500 ticks to reach the required time ( 62500 * 0,016 = 1000ms)
      21. ' The start value for the timer must be set to 3036 so that it will overflow at 65536 after 62500 ticks
      22. ' NOTE: The load command does the inversion for you (256-value or 65536-value)
      23. Const Anzahl_displays = 4
      24. Dim W_st(anzahl_displays) As Byte 'anzuzeigende Werte an den einzelnen Stellen
      25. Dim Display_adress As Byte , Display_daten As Byte
      26. Dim N_1 As Byte
      27. Config Clock = User
      28. Dim Bsec As Byte , Bmin As Byte , Bhour As Byte
      29. Dim Zeit As Long
      30. Gosub Init_max7219 'Display initialisieren
      31. '#####################################################
      32. Zeit = 3600
      33. Do
      34. Bsec = Time(zeit)
      35. W_st(4) = Bsec Mod 10
      36. W_st(3) = Bsec / 10
      37. W_st(2) = Bmin Mod 10
      38. W_st(1) = Bmin / 10
      39. ' W_st(2) = bhour Mod 10
      40. ' W_st(1) = bhour / 10
      41. ' If W_st(1) = 0 Then W_st(1) = 10
      42. Gosub Anzeigen
      43. Loop
      44. End
      45. '#####################################################
      46. Timer1_isr:
      47. If Zeit > 0 Then Decr Zeit
      48. Return
      49. '#####################################################
      50. Anzeigen: 'senden der anzuzeigenden Zahlen an den einzelnen 7-Segmentanzeigen
      51. For N_1 = 1 To Anzahl_displays
      52. Display_adress = N_1 : Display_daten = W_st(n_1)
      53. Gosub Send
      54. Next N_1
      55. Return
      56. Init_max7219: ' Initialisieren des MAX7219
      57. Display_adress = &H0C : Display_daten = &H00 ' Shutdown On
      58. Gosub Send
      59. Display_adress = &H09 : Display_daten = &HFF ' decode "B" für alle Digits, wenn als Daten 3 gesendet wird, wird '3'angezeigt
      60. Gosub Send
      61. Display_adress = &H0A : Display_daten = &H08 ' Helligkeit 0-F
      62. Gosub Send
      63. Display_adress = &H0B : Display_daten = Anzahl_displays -1 ' Anzahl Digits, Zählung startet mit 0
      64. Gosub Send
      65. Display_adress = &H0F : Display_daten = 0 ' Test Off
      66. Gosub Send
      67. Display_adress = &H0C : Display_daten = 1 ' Shutdown Off
      68. Gosub Send
      69. Return
      70. Send:
      71. Cs_display = 0
      72. Shiftout Din_display , Clk_display , Display_adress , 1
      73. Shiftout Din_display , Clk_display , Display_daten , 1
      74. Cs_display = 1
      75. Return
      Alles anzeigen
      Raum für Notizen

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

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

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von tschoeatsch ()

    • Danke. Bei dem tool finde ich die Erklärung ganz gut. Deswegen setze ich die auch gerne in das Programm mit ein. Ich bin mir aber nicht ganz sicher, ob man bei x ticks das compare auf x-1 (so wie ich es hier gemacht habe) einstellen muss. Der timer fäng bei 0 an, bei 1 hat er also 1 tick gemacht. Wenn jetzt compare=1 wäre, würde er wieder bei 0 beginnen. So gesehen müsste das -1 eigentlich falsch sein, oder doch richtig?
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Hm, der Tackt verstreicht und der Timerzähler erhöht sich, die Zahl gibt also die verstrichenen Takte an. Wenn die Zahl mit dem compare-Wert überein stimmt, wird sie auf 0 gesetzt, dann verstreicht die Zeit, bist der 0. Tackt vorbei ist. So gesehen müsste doch x statt x-1 beim compare drin stehen.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Das mit dem Config Clock = User geht auch was ich nicht verstehe ist wenn ich diese Variante nehme läuft das Display stabil.

      BASCOM-Quellcode

      1. Config Clock = Soft
      2. Dim Bsec As Byte , Bmin As Byte , Bhour As Byte
      3. Dim Zeit As Long
      4. Gosub Init_max7219 'Display initialisieren
      5. '#####################################################
      6. Zeit = 59 'Startzeit in Sekunden angeben
      7. Do
      8. Bsec = Time(zeit)
      9. W_st(4) = Bsec Mod 10
      10. W_st(3) = Bsec / 10
      11. W_st(2) = Bmin Mod 10
      12. W_st(1) = Bmin / 10
      13. ' W_st(2) = bhour Mod 10
      14. ' W_st(1) = bhour / 10
      15. ' If W_st(1) = 0 Then W_st(1) = 10
      16. Gosub Anzeigen
      17. Wait 1
      18. If Zeit > 0 Then Decr Zeit Else Zeit = 59
      19. Loop
      20. End
      Alles anzeigen

      Benutze ich diese Variante habe ich im Display Aussetzer.

      BASCOM-Quellcode

      1. Config Timer1 = Timer , Prescale = 64 , Clear_timer = 1
      2. Compare1a = 62500 - 1
      3. On Compare1a Timer1_isr
      4. Enable Compare1a
      5. Enable Interrupts
      6. 'Timer value explination
      7. ' The timer is a 16Bit timer, it overflows when the timer reaches 65536
      8. ' The AVR is running at 4000000Hz, the prescaler is 64
      9. ' Each tick is 0,016 ms - (1 / CPUSpeed in KHz ) * Prescaler
      10. ' The timer needs 62500 ticks to reach the required time ( 62500 * 0,016 = 1000ms)
      11. ' The start value for the timer must be set to 3036 so that it will overflow at 65536 after 62500 ticks
      12. ' NOTE: The load command does the inversion for you (256-value or 65536-value)
      13. Const Anzahl_displays = 4
      14. Dim W_st(anzahl_displays) As Byte 'anzuzeigende Werte an den einzelnen Stellen
      15. Dim Display_adress As Byte , Display_daten As Byte
      16. Dim N_1 As Byte
      17. Config Clock = User
      18. Dim Bsec As Byte , Bmin As Byte , Bhour As Byte
      19. Dim Zeit As Long
      20. Gosub Init_max7219 'Display initialisieren
      21. '#####################################################
      22. Zeit = 3600
      23. Do
      24. Bsec = Time(zeit)
      25. W_st(4) = Bsec Mod 10
      26. W_st(3) = Bsec / 10
      27. W_st(2) = Bmin Mod 10
      28. W_st(1) = Bmin / 10
      29. ' W_st(2) = bhour Mod 10
      30. ' W_st(1) = bhour / 10
      31. ' If W_st(1) = 0 Then W_st(1) = 10
      32. Gosub Anzeigen
      33. Loop
      34. End
      35. '#####################################################
      36. Timer1_isr:
      37. If Zeit > 0 Then Decr Zeit
      38. Return
      Alles anzeigen
    • Hm, ich muss sagen, ich hatte Startschwierigkeiten. Nach dem Einschalten musste ich einen reset machen, damit die Anzeige ansprang.
      Was bei diesem Programm ungünstig ist, in der isr wird eine long-Variabe geändert, die in der main durch eine aufwändige Rechnung zerzupft wird. Probiere mal
      zeit1=zeit
      bsec=time(zeit1)
      So kann die isr in die Zerlegung von zeit1 reinplatzen, was aber an zeit1 nix ändert. Vorher war das ungünstiger. Vielleicht ist das schon die Lösung.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • tschoeatsch schrieb:

      ich hatte Startschwierigkeiten. Nach dem Einschalten musste ich einen reset machen, damit die Anzeige ansprang.
      Ist bei mir jetzt behoben. Ich arbeite mit internen RC-Oszillator. Ich hab' jetzt bei den fuses eine längere Verzögerung eingestellt und jetzt läuft nach dem Einschalten das Programm gleich los, so wie es ja sein soll.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • hero schrieb:

      in der ISR ein Flag setzen und in der Do-Loop auf das Flag warten, dann die Zeit runterzählen und die ganzen Berechnungen machen.
      Das wäre natürlich am konfliktfreisten.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Sorry, mal kurz OT, ich bin jetzt etwas verwirrt.
      Ich bin gerade am Bau eines Frequenzmessers, mit Quarz klappt das soweit alles.
      Als genaue Zeitbasis wollte ich DCF77 nehmen, dazu eventuell gleich den Attiny mitverwenden, ADC Gain x20 um mir den Sekundentakt eventuell damit aufzubereiten.
      VCO mit den 77,5 kHz Synchronisieren sollte dann das nächste sein.
      Die Google Suche führt auch in diesen Tread, und ich lese gleich zweimal, DCF77 gibt kein Sekunden-Signal aus.
      Laut Wiki ist das Signal immer noch im Sekundentakt Amplitudenmoduliert was ich auswerten wollte, das digitale Signal interessiert mich erst mal (noch) nicht.
      Hat sich da etwas geändert?