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!

    • Memory schrieb:

      Damit habe ich eine Verständnis Problem
      Zahl = Lookup(stelle1 , Ziffern)
      Mal abgesehen davon, dass du ruhig mal nach schauen kannst, wie schon Michael es vorschlug, du brauchst diesen Befehl nicht, wenn du den max so initialisierst, wie ich es in meinem Beispiel (anderer thread) gemacht habe.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • @Memory

      Lookup brauchst du auch nur wenn du für deine Zahlen eine Datentabelle nutzt. Also wenn der MAX das nicht selbst dekodiert. Zahl = Lookup(stelle1, Ziffern) macht folgendes:

      Zahl ist ein Byte und Lookup sucht in der Datentabelle "Ziffern" nach der Position "Stelle1" und übergibt diese dann an "Zahl".

      BASCOM-Quellcode

      1. Stelle1 = 0
      2. Zahl = Lookup(stelle1 , Ziffern)
      3. 'In Zahl steht nun das erste Element der Datentabelle
      4. 'a, b, g, f, e, d, c, dp
      5. ' a
      6. ' ---
      7. 'f| | b
      8. ' ---
      9. 'e| g | c
      10. ' ---
      11. ' d dp
      12. Ziffern:
      13. Data &B11011110 '0
      14. Data &B01000010 '1
      15. Data &B11101100 '2
      16. Data &B11100110 '3
      17. Data &B01110010 '4
      18. Data &B10110110 '5
      19. Data &B10111110 '6
      20. Data &B11010010 '7
      21. Data &B11111110 '8
      22. Data &B11110110 '9
      23. Data &B00000000 'blank
      Alles anzeigen
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Hm ich habe es mal so versucht die Anzeige zeigt nur 0000 an.

      BASCOM-Quellcode

      1. 'Max7219 Anzeige
      2. '7-Segment
      3. $Regfile="m8def.dat"
      4. $Crystal=4000000
      5. $hwstack=40
      6. $swstack=16
      7. $framesize=32
      8. Config Portd.3 = Output : Din_display Alias Portd.3
      9. Config Portd.5 = Output : Clk_display Alias Portd.5
      10. Config Portd.2 = Output : Cs_display Alias Portd.2
      11. Const Anzahl_displays = 4
      12. Dim W_st(anzahl_displays) As Byte 'anzuzeigende Werte an den einzelnen Stellen
      13. Dim Display_adress As Byte , Display_daten As Byte
      14. Dim N_1 As Byte , N As Word , _sec as word, _min as word , _hour as Word
      15. Dim Tausender As Word , Hunderter As Word , Zehner As Word , Einer As Word
      16. dim Stelle1 as word , Stelle2 as Word , Stelle3 as Word , Stelle4 as Word , Stelle5 as Word , Stelle6 as Word
      17. Gosub Init_max7219 'Display initialisieren
      18. '#####################################################
      19. Do
      20. Stelle1 = 1
      21. Stelle1 = _sec Mod 10
      22. Stelle2 = _sec / 10
      23. Stelle3 = _min Mod 10
      24. Stelle4 = _min / 10
      25. Stelle5 = _hour Mod 10
      26. Stelle6 = _hour / 10
      27. If Stelle6 = 0 Then Stelle6 = 10
      28. Gosub Anzeigen
      29. Loop
      30. End
      31. '#####################################################
      32. Anzeigen: 'senden der anzuzeigenden Zahlen an den einzelnen 7-Segmentanzeigen
      33. For N_1 = 1 To Anzahl_displays
      34. Display_adress = N_1 : Display_daten = W_st(n_1)
      35. Cs_display = 0
      36. Shiftout Din_display , Clk_display , Display_adress , 1
      37. Shiftout Din_display , Clk_display , Display_daten , 1
      38. Cs_display = 1
      39. Next N_1
      40. Return
      41. Init_max7219: ' Initialisieren des MAX7219
      42. Display_adress = &H0C : Display_daten = &H00 ' Shutdown On
      43. Cs_display = 0
      44. Shiftout Din_display , Clk_display , Display_adress , 1
      45. Shiftout Din_display , Clk_display , Display_daten , 1
      46. Cs_display = 1
      47. Display_adress = &H09 : Display_daten = &HFF ' decode "B" für alle Digits, wenn als Daten 3 gesendet wird, wird '3'angezeigt
      48. Cs_display = 0
      49. Shiftout Din_display , Clk_display , Display_adress , 1
      50. Shiftout Din_display , Clk_display , Display_daten , 1
      51. Cs_display = 1
      52. Display_adress = &H0A : Display_daten = &H08 ' Helligkeit 0-F
      53. Cs_display = 0
      54. Shiftout Din_display , Clk_display , Display_adress , 1
      55. Shiftout Din_display , Clk_display , Display_daten , 1
      56. Cs_display = 1
      57. Display_adress = &H0B : Display_daten = Anzahl_displays -1 ' Anzahl Digits, Zählung startet mit 0
      58. Cs_display = 0
      59. Shiftout Din_display , Clk_display , Display_adress , 1
      60. Shiftout Din_display , Clk_display , Display_daten , 1
      61. Cs_display = 1
      62. Display_adress = &H0F : Display_daten = 0 ' Test Off
      63. Cs_display = 0
      64. Shiftout Din_display , Clk_display , Display_adress , 1
      65. Shiftout Din_display , Clk_display , Display_daten , 1
      66. Cs_display = 1
      67. Display_adress = &H0C : Display_daten = 1 ' Shutdown Off
      68. Cs_display = 0
      69. Shiftout Din_display , Clk_display , Display_adress , 1
      70. Shiftout Din_display , Clk_display , Display_daten , 1
      71. Cs_display = 1
      72. Return
      Alles anzeigen
    • Hallo Memory,
      das hat ja eigentlich nichts mit der Ansteuerung zu tun.
      Wenn du in der Routine Anzeigen die Werte des Array W_st() ausgibst, dann muss da natürlich etwas drinstehen. Also schreibe doch mal hinter die Dims
      W_st(1)=1
      W_st(2)=2
      W_st(3)=3
      W_st(4)=4
      W_st(5)=5
      W_st(6)=6
      und schau mal, ob etwas angezeigt wird. Danach sehen wir weiter.
      Außerdem steht in der Konstante Anzahl_displays=4, Stelle geht aber bis 6.
    • Memory schrieb:

      Was habe ich da falsch gemacht ??
      Du hast vor der Ausgabe auf die displays nicht festgelegt, was ausgegeben werden soll. Wenn du es so machst

      BASCOM-Quellcode

      1. Do
      2. Stelle1 = 1
      3. W_st(6) = _sec Mod 10
      4. W_st(5) = _sec / 10
      5. W_st(4) = _min Mod 10
      6. W_st(3) = _min / 10
      7. W_st(2) = _hour Mod 10
      8. W_st(1) = _hour / 10
      9. If W_st(1) = 0 Then W_st(1) = 10
      10. Gosub Anzeigen
      11. Loop
      Alles anzeigen


      schreibst, wird es schon besser. Allerdings hast du nur 4 Stellen, also lässt du am Besten die Stunden mal weg

      BASCOM-Quellcode

      1. Do
      2. Stelle1 = 1
      3. W_st(4) = _sec Mod 10
      4. W_st(3) = _sec / 10
      5. W_st(2) = _min Mod 10
      6. W_st(1) = _min / 10
      7. ' W_st(2) = _hour Mod 10
      8. ' W_st(1) = _hour / 10
      9. ' If W_st(1) = 0 Then W_st(1) = 10
      10. Gosub Anzeigen
      11. Loop
      12. End
      Alles anzeigen
      Jetzt läuft die Uhr aber noch nicht, du musst die Sekunden hochzählen (lassen) und die Minuten (und Stunden) entsprechend weiter schalten lassen.
      Eine Möglichkeit wäre eine RTC als Taktgeber zu verwenden, oder ohne eine zu haben und für weitere Experimente mit
      Config Dcf77 = Pind.7 , Timer = 1 , Update = 0 , Inverted = 0 , Check = 1 , Timer1sec = 0
      den Anschluss eines DCF-Empfängers vorbereiten. Den brauchst du aber nicht zwingend anschließen, aber es wird durch bascom jetzt die Sekunden und Minuten hoch gezählt. Das schaut dann so aus

      BASCOM-Quellcode

      1. 'Max7219 Anzeige
      2. '7-Segment
      3. $Regfile="m8def.dat"
      4. $Crystal=4000000
      5. $hwstack=40
      6. $swstack=16
      7. $framesize=32
      8. Config Portd.3 = Output : Din_display Alias Portd.3
      9. Config Portd.5 = Output : Clk_display Alias Portd.5
      10. Config Portd.2 = Output : Cs_display Alias Portd.2
      11. 'DCF77 einrichten
      12. Config Dcf77 = Pind.7 , Timer = 1 , Update = 0 , Inverted = 0 , Check = 1 , Timer1sec = 0
      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 , N As Word
      17. Dim Tausender As Word , Hunderter As Word , Zehner As Word , Einer As Word
      18. Gosub Init_max7219 'Display initialisieren
      19. '#####################################################
      20. Do
      21. W_st(4) = _sec Mod 10
      22. W_st(3) = _sec / 10
      23. W_st(2) = _min Mod 10
      24. W_st(1) = _min / 10
      25. ' W_st(2) = _hour Mod 10
      26. ' W_st(1) = _hour / 10
      27. ' If W_st(1) = 0 Then W_st(1) = 10
      28. Gosub Anzeigen
      29. Loop
      30. End
      31. '#####################################################
      32. Anzeigen: 'senden der anzuzeigenden Zahlen an den einzelnen 7-Segmentanzeigen
      33. For N_1 = 1 To Anzahl_displays
      34. Display_adress = N_1 : Display_daten = W_st(n_1)
      35. Cs_display = 0
      36. Shiftout Din_display , Clk_display , Display_adress , 1
      37. Shiftout Din_display , Clk_display , Display_daten , 1
      38. Cs_display = 1
      39. Next N_1
      40. Return
      41. Init_max7219: ' Initialisieren des MAX7219
      42. Display_adress = &H0C : Display_daten = &H00 ' Shutdown On
      43. Cs_display = 0
      44. Shiftout Din_display , Clk_display , Display_adress , 1
      45. Shiftout Din_display , Clk_display , Display_daten , 1
      46. Cs_display = 1
      47. Display_adress = &H09 : Display_daten = &HFF ' decode "B" für alle Digits, wenn als Daten 3 gesendet wird, wird '3'angezeigt
      48. Cs_display = 0
      49. Shiftout Din_display , Clk_display , Display_adress , 1
      50. Shiftout Din_display , Clk_display , Display_daten , 1
      51. Cs_display = 1
      52. Display_adress = &H0A : Display_daten = &H08 ' Helligkeit 0-F
      53. Cs_display = 0
      54. Shiftout Din_display , Clk_display , Display_adress , 1
      55. Shiftout Din_display , Clk_display , Display_daten , 1
      56. Cs_display = 1
      57. Display_adress = &H0B : Display_daten = Anzahl_displays -1 ' Anzahl Digits, Zählung startet mit 0
      58. Cs_display = 0
      59. Shiftout Din_display , Clk_display , Display_adress , 1
      60. Shiftout Din_display , Clk_display , Display_daten , 1
      61. Cs_display = 1
      62. Display_adress = &H0F : Display_daten = 0 ' Test Off
      63. Cs_display = 0
      64. Shiftout Din_display , Clk_display , Display_adress , 1
      65. Shiftout Din_display , Clk_display , Display_daten , 1
      66. Cs_display = 1
      67. Display_adress = &H0C : Display_daten = 1 ' Shutdown Off
      68. Cs_display = 0
      69. Shiftout Din_display , Clk_display , Display_adress , 1
      70. Shiftout Din_display , Clk_display , Display_daten , 1
      71. Cs_display = 1
      72. Return
      Alles anzeigen
      Probier es mal aus, was jetzt passiert, ich hab' es nicht getestet, kann also auch Müll sein
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Memory schrieb:

      Ja an config soft clock habe ich schon darüber nach gedacht. Mit dem Sekunden Signal der DCF uhr könnte es auch gehen. Wenn ich nur das Sekunden Signal benutze.
      Das wird nix, DCF syncronisiert nur die per Quarz laufende Uhr (wenn du Empfang hast). Eine genaue Sekunde bekommst du dadurch nicht. Da wäre eine RTC besser, oder die soft clock mit Uhrenquarz.
      Das mit DCF hab' ich jetzt nur vorgeschlagen, um schnell eine zählende Sekunde und Minute zu bekommen. Sowas könntest du auch mit einem Timer selber programmieren, wäre dann genauso genau.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Zum Rückwärtslaufe brauchst du einen (genauen) Sekundentakt. Den kannst du mit einem Timer programmieren oder du verwendest eine RTC mit Taktausgang oder zur Not eine, die den Sekundenwert aus gibt.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Willst du mal das probieren?

      BASCOM-Quellcode

      1. 'Max7219 Anzeige
      2. '7-Segment
      3. $regfile = "m8def.dat"
      4. $crystal = 4000000
      5. $hwstack = 40
      6. $swstack = 16
      7. $framesize = 32
      8. Config Portd.3 = Output : Din_display Alias Portd.3
      9. Config Portd.5 = Output : Clk_display Alias Portd.5
      10. Config Portd.2 = Output : Cs_display Alias Portd.2
      11. Const Anzahl_displays = 4
      12. Dim W_st(anzahl_displays) As Byte 'anzuzeigende Werte an den einzelnen Stellen
      13. Dim Display_adress As Byte , Display_daten As Byte
      14. Dim N_1 As Byte
      15. Config Clock = Soft
      16. Dim Bsec As Byte , Bmin As Byte , Bhour As Byte
      17. Dim Zeit As Long
      18. Gosub Init_max7219 'Display initialisieren
      19. '#####################################################
      20. Zeit = 70 'Startzeit in Sekunden angeben
      21. Do
      22. Bsec = Time(zeit)
      23. W_st(4) = Bsec Mod 10
      24. W_st(3) = Bsec / 10
      25. W_st(2) = Bmin Mod 10
      26. W_st(1) = Bmin / 10
      27. ' W_st(2) = bhour Mod 10
      28. ' W_st(1) = bhour / 10
      29. ' If W_st(1) = 0 Then W_st(1) = 10
      30. Gosub Anzeigen
      31. Wait 1
      32. If Zeit > 0 Then Decr Zeit Else Zeit = 70
      33. Loop
      34. End
      35. '#####################################################
      36. '#####################################################
      37. Anzeigen: 'senden der anzuzeigenden Zahlen an den einzelnen 7-Segmentanzeigen
      38. For N_1 = 1 To Anzahl_displays
      39. Display_adress = N_1 : Display_daten = W_st(n_1)
      40. Cs_display = 0
      41. Shiftout Din_display , Clk_display , Display_adress , 1
      42. Shiftout Din_display , Clk_display , Display_daten , 1
      43. Cs_display = 1
      44. Next N_1
      45. Return
      46. Init_max7219: ' Initialisieren des MAX7219
      47. Display_adress = &H0C : Display_daten = &H00 ' Shutdown On
      48. Cs_display = 0
      49. Shiftout Din_display , Clk_display , Display_adress , 1
      50. Shiftout Din_display , Clk_display , Display_daten , 1
      51. Cs_display = 1
      52. Display_adress = &H09 : Display_daten = &HFF ' decode "B" für alle Digits, wenn als Daten 3 gesendet wird, wird '3'angezeigt
      53. Cs_display = 0
      54. Shiftout Din_display , Clk_display , Display_adress , 1
      55. Shiftout Din_display , Clk_display , Display_daten , 1
      56. Cs_display = 1
      57. Display_adress = &H0A : Display_daten = &H08 ' Helligkeit 0-F
      58. Cs_display = 0
      59. Shiftout Din_display , Clk_display , Display_adress , 1
      60. Shiftout Din_display , Clk_display , Display_daten , 1
      61. Cs_display = 1
      62. Display_adress = &H0B : Display_daten = Anzahl_displays -1 ' Anzahl Digits, Zählung startet mit 0
      63. Cs_display = 0
      64. Shiftout Din_display , Clk_display , Display_adress , 1
      65. Shiftout Din_display , Clk_display , Display_daten , 1
      66. Cs_display = 1
      67. Display_adress = &H0F : Display_daten = 0 ' Test Off
      68. Cs_display = 0
      69. Shiftout Din_display , Clk_display , Display_adress , 1
      70. Shiftout Din_display , Clk_display , Display_daten , 1
      71. Cs_display = 1
      72. Display_adress = &H0C : Display_daten = 1 ' Shutdown Off
      73. Cs_display = 0
      74. Shiftout Din_display , Clk_display , Display_adress , 1
      75. Shiftout Din_display , Clk_display , Display_daten , 1
      76. Cs_display = 1
      77. Return
      Alles anzeigen
      Ich hab' jetzt keine 7_Segmentdisplays zum Probieren, vielleicht funktioniert es.
      Der gag an der Sache ist, du musst nur die Startzeit einstellen ('Zeit' in Sekunden) und diese Variable alle Sekunde decrementieren. Das Umrechnen in Minuten und Stunden macht die Funktion 'Bsec = Time(zeit)'
      Raum für Notizen

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

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