MAX7219 Ansteuern

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

    • Du musst zuerst den max initialisieren und ihm dabei sagen, dass du 7-Segmenter dran hast. Wenn der max das mal weiß, dann musst du nur den anzuzeigenden Wert und an welcher Stelle dem max sagen. Einzelne Initialisierungsbefehle findest du in den Programmen, die ich bei den bisherigen max7219 threads gezeigt habe. Das musst du dann sinngemäß für die Einrichtung mit 7-Segmentern machen.
      Hast du die hardware schon zum probieren? Wie willst du die Daten an den max schicken, mit shiftout?
      Raum für Notizen

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

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

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

    • Hallo tschoeatsch
      genau von dir habe eine Antwort erwartet auf diese Thema, die Hardware ist null Komma nix auf ein
      Steckboard aufgebaut das ist das geringste Problem. Mir gehts um die Ansteuerung Software mäßig da liegt das
      Problem. Es soll ein 24 Stunden Timer mit Sekunden, Minuten und Stunden werden.

      Du hast ja schon Erfahrung mit deiner Spektakulärer Timebar gemacht.
    • Gut, dann bau doch mal die Schaltung gemäß Datenblatt auf, dann können wir das mal probieren. Ich hab' den max bislang nur mit den 8x8 Led-Modulen benutzt, fürchte mich aber nicht das mal mit 7-Segmentern zu probieren.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Hier hast du mal einen Test. Da ich nur die 8x8 Matrix dran habe, sehe ich nur ein pixeliges Ergebnis, aber immerhin leuchtet was a_30_7dc14a07

      BASCOM-Quellcode

      1. 'Max7219 Anzeige
      2. '7-Segment
      3. $regfile = "m32def.dat"
      4. $crystal = 16000000
      5. $hwstack = 64
      6. $swstack = 64
      7. $framesize = 64
      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. Dim W_st(6) As Byte 'anzuzeigende Werte an den einzelnen Stellen
      12. Dim Display_adress As Byte , Display_daten As Byte
      13. Dim N_1 As Byte , N As Byte
      14. Gosub Init_max7219 'Display initialisieren
      15. '#####################################################
      16. Do
      17. For N = 0 To 4
      18. W_st(1) = N : W_st(2) = N + 1 : W_st(3) = N + 2 : W_st(4) = N + 3 : W_st(5) = N + 4 : W_st(6) = N + 5
      19. Gosub Anzeigen
      20. Wait 1
      21. Next N
      22. Loop
      23. End
      24. '#####################################################
      25. Anzeigen: 'senden der anzuzeigenden Zahlen an den einzelnen 7-Segmentanzeigen
      26. For N_1 = 1 To 6
      27. Display_adress = N_1 : Display_daten = W_st(n_1)
      28. Cs_display = 0
      29. Shiftout Din_display , Clk_display , display_adress , 1
      30. Shiftout Din_display , Clk_display , Display_daten , 1
      31. Cs_display = 1
      32. Next N_1
      33. Return
      34. Init_max7219: ' Initialisieren des MAX7219
      35. display_adress = &H0C : Display_daten = &H00 ' Shutdown On
      36. Cs_display = 0
      37. Shiftout Din_display , Clk_display , Display_adress , 1
      38. Shiftout Din_display , Clk_display , Display_daten , 1
      39. Cs_display = 1
      40. Display_adress = &H09 : Display_daten = &HFF ' decode "B" für alle Digits, wenn als Daten 3 gesendet wird, wird '3'angezeigt
      41. Cs_display = 0
      42. Shiftout Din_display , Clk_display , display_adress , 1
      43. Shiftout Din_display , Clk_display , Display_daten , 1
      44. Cs_display = 1
      45. display_adress = &H0A : Display_daten = &H08 ' Helligkeit 0-F
      46. Cs_display = 0
      47. Shiftout Din_display , Clk_display , display_adress , 1
      48. Shiftout Din_display , Clk_display , Display_daten , 1
      49. Cs_display = 1
      50. display_adress = &H0B : Display_daten = 5 ' Anzahl Digits 6, Zählung startet mit 0
      51. Cs_display = 0
      52. Shiftout Din_display , Clk_display , display_adress , 1
      53. Shiftout Din_display , Clk_display , Display_daten , 1
      54. Cs_display = 1
      55. display_adress = &H0F : Display_daten = 0 ' Test Off
      56. Cs_display = 0
      57. Shiftout Din_display , Clk_display , display_adress , 1
      58. Shiftout Din_display , Clk_display , Display_daten , 1
      59. Cs_display = 1
      60. display_adress = &H0C : Display_daten = 1 ' Shutdown Off
      61. Cs_display = 0
      62. Shiftout Din_display , Clk_display , Display_adress , 1
      63. Shiftout Din_display , Clk_display , Display_daten , 1
      64. Cs_display = 1
      65. Return
      Alles anzeigen
      Das Programm lässt auf den 6 Stellen die Zahlen von 0 bis 5 anzeigen und zählt um 4 Schritte nach oben, sodass am Ende in der letzten Stelle eine 9 steht. Dann fängt's wieder neu an. So ist der Plan.
      Raum für Notizen

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

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

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

    • Deine 7-Segmenter hast du nach Datenblatt angeschlossen? Also die Zuordnung der einzelnen Segmente zu den angegebenen pins am max.
      Du kannst in der main ja auch einfach mal w_st(1)=3 schreiben und dann gosub anzeigen. Wenn das Programm neu startet sollte an der ersten Stelle eine '3' stehen und an den anderen eine '0'
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Du kannst erstmal den Originalcode nehmen und das wait stark vergrößern, damit du Zeit hast, die Anzahl der leuchtenden Segmente zu zählen. Die 1. Stelle soll eine '0' darstellen, dazu leuchten 6 Segmente, die 2. Stelle eine '1', dazu leuchten 2 Segmente, bei einer '2' leuchten 5 Segmente... Wenn das so passt, hast du vielleicht einen Verdrahtungsfehler bei den Segmentanschlüssen.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • So die Segmente laufen die fehlende Segmente führten von den schlechten Verbindungen des Steckbords her kann auch die Brücken gewesen sein.
      Es scrolt eine zahlen reihe von 0 bis 7 durch von rechts nach links, ich gehe von aus das scrollen durch den Befehl Shiftout dafür zuständig ist.

      Wie komme ich weiter ?
    • Nein, nein, das schaut nur wie ein scrollen aus. Das Programm schreibt in die displays '0123' und '45' in die nicht vorhandenen 2 displays. Beim nächsten Durchlauf wird '2345' in die vorhandenen Displays geschrieben. Das geht so weiter, bis im letzten Display. das 6. eine '9' stünde, dann sind die Zahlen '4567' sichtbar. Dann fängt es wieder bei '0123' an.


      Memory schrieb:

      Wie komme ich weiter ?
      Jetzt muss du dein Stoppuhrprogramm schreiben! Zum Anzeigen der Einzelziffern kannst du die subs aus meinem Programm verwenden.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Probier mal das aus

      BASCOM-Quellcode

      1. 'Max7219 Anzeige
      2. '7-Segment
      3. $regfile = "m32def.dat"
      4. $crystal = 16000000
      5. $hwstack = 64
      6. $swstack = 64
      7. $framesize = 64
      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
      15. Dim Tausender As Word , Hunderter As Word , Zehner As Word , Einer As Word
      16. Gosub Init_max7219 'Display initialisieren
      17. '#####################################################
      18. Do
      19. For N = 0 To 2000
      20. Tausender = N / 1000
      21. Hunderter = N Mod 1000 : Hunderter = Hunderter / 100
      22. Zehner = N Mod 100 : Zehner = Zehner / 10
      23. Einer = N Mod 10
      24. W_st(1) = Tausender
      25. W_st(2) = Hunderter
      26. W_st(3) = Zehner
      27. W_st(4) = Einer
      28. Gosub Anzeigen
      29. Waitms 20
      30. Next N
      31. Loop
      32. End
      33. '#####################################################
      34. Anzeigen: 'senden der anzuzeigenden Zahlen an den einzelnen 7-Segmentanzeigen
      35. For N_1 = 1 To Anzahl_displays
      36. Display_adress = N_1 : Display_daten = W_st(n_1)
      37. Cs_display = 0
      38. Shiftout Din_display , Clk_display , Display_adress , 1
      39. Shiftout Din_display , Clk_display , Display_daten , 1
      40. Cs_display = 1
      41. Next N_1
      42. Return
      43. Init_max7219: ' Initialisieren des MAX7219
      44. Display_adress = &H0C : Display_daten = &H00 ' Shutdown On
      45. Cs_display = 0
      46. Shiftout Din_display , Clk_display , Display_adress , 1
      47. Shiftout Din_display , Clk_display , Display_daten , 1
      48. Cs_display = 1
      49. Display_adress = &H09 : Display_daten = &HFF ' decode "B" für alle Digits, wenn als Daten 3 gesendet wird, wird '3'angezeigt
      50. Cs_display = 0
      51. Shiftout Din_display , Clk_display , Display_adress , 1
      52. Shiftout Din_display , Clk_display , Display_daten , 1
      53. Cs_display = 1
      54. Display_adress = &H0A : Display_daten = &H08 ' Helligkeit 0-F
      55. Cs_display = 0
      56. Shiftout Din_display , Clk_display , Display_adress , 1
      57. Shiftout Din_display , Clk_display , Display_daten , 1
      58. Cs_display = 1
      59. Display_adress = &H0B : Display_daten = Anzahl_displays -1 ' Anzahl Digits, Zählung startet mit 0
      60. Cs_display = 0
      61. Shiftout Din_display , Clk_display , Display_adress , 1
      62. Shiftout Din_display , Clk_display , Display_daten , 1
      63. Cs_display = 1
      64. Display_adress = &H0F : Display_daten = 0 ' Test Off
      65. Cs_display = 0
      66. Shiftout Din_display , Clk_display , Display_adress , 1
      67. Shiftout Din_display , Clk_display , Display_daten , 1
      68. Cs_display = 1
      69. Display_adress = &H0C : Display_daten = 1 ' Shutdown Off
      70. Cs_display = 0
      71. Shiftout Din_display , Clk_display , Display_adress , 1
      72. Shiftout Din_display , Clk_display , Display_daten , 1
      73. Cs_display = 1
      74. Return
      Alles anzeigen
      Das zählt von 0 bis 2000.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Ich versuch mal zu erklären

      Wenn du eine zweistellige Zahl hast z.B. 23 und diese durch 10 teilst kommt 2,3 raus.
      Als Byte wäre das dann eine 2. Und 23 MOD 10 ergibt dann 3 also die Einerstelle.

      Hier noch ein Auszug aus der Bascom-Hilfe

      Bascom-Hilfe schrieb:


      For example : 21 MOD 3 will result in 0 since 7x3=21. There will be no remainder.
      But 22 MOD 3 will result in 1 since 22-(7x3)=1
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.