Fehler: out of SRam Space

    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!

    • Fehler: out of SRam Space

      Hallo Zusammen,
      erstmal alles Gute für 2018 !
      Nachdem ich meinen Pc nun wieder in Betrieb habe mit WIN 10,konnte es auch mit Bascom weitergehen. Ich arbeite ja immer noch am Verstehen von MAX 7219 und habe dabei auch einige Fortschritte gemacht. Auf jedem 7 Segm. eine Zahl darstellen etc.
      Jetzt bin ich aktuell dabei ein Programm zu entwickeln, dass beliebe Zahlen anzeigt. dabei schiebe ich die Zahl in einen String und zeige diesen nach + nach an, weise also den einzelnen Werten eine 7 Segm. zu. So ist mein Plan. Ob das geht weis ich noch nicht, weil : plötzlich bekomme ich beim Syntax Check den Fehler 22 (Out of Sram Space) Wenn man die aus kommentierten Variablen wieder einbindet entsteht der Fehler. ( z.B. Zaehl_lg oder Zaehl_str) ich hab auch den Variablen andere Namen gegeben ( z.B. "B") aber das bringt nichts, dann ist eben B out of Sram Space.
      Wer kann mir da mal bitte raten woran das liegt, bzw. was zu tun ist. Wo liegt mein Fehler?

      Hier mein Programm soweit.
      Herzlichen Dank vorab.
      Gruss Theo

      BASCOM-Quellcode

      1. '(
      2. Programmname : Max7219_V3
      3. Prozessor : ATTiny 2313 (im DIL - Gehäuse)
      4. Takt : 8 Mhz
      5. Bascom Version :2.0.8.1
      6. Thema : ansteuern eines MAX 7219; angeschlossen sind auf der Testplatine
      7. 6 x 7 Segmentanzeigen mit gem. Kathode
      8. Der Maxv 7219 wird über SPI angesteuert
      9. Verwendet wird ein Max 7219 in DIL Gehäuse
      10. Pins vom uC zum Max7219
      11. A) MOSI = PB5 --> Din vom Max7219
      12. B) Clock = PB7 --> Clk von Max7219
      13. C) PB2 --> Load Pin von MAX 7219
      14. In diesem Programm sollen ganze Zahlen dargestellt werden.
      15. ')
      16. $regfile = "Attiny2313.dat"
      17. '$crystal = 16000000 'mit Quartz; kein Teiler durch 8
      18. $crystal = 8000000
      19. $swstack = 40
      20. $hwstack = 40
      21. $framesize = 40
      22. '###################################
      23. ' Verbindungen zwisch uC und Max7219
      24. Config Portb.2 = Output
      25. Cs_display Alias Portb.2
      26. 'beliebiger Pin am Tiny2313 --> Load von Max
      27. Config Portb.5 = Output
      28. Din_display Alias Portb.5 'Daten die übertragen werden sollen
      29. 'MOSI am Tiny2313 --> Din von Max
      30. Config Portb.7 = Output
      31. Clk_display Alias Portb.7 'Clock für Datenübertragung
      32. 'USCK am Tiny2313 --> Clk von Max
      33. '#####################################
      34. 'Variablenvereinbarung
      35. Dim Befehl As Byte
      36. Dim Datensatz As Byte
      37. Dim J As Byte
      38. Dim Dig_no As Byte 'Digit Nummer (Nummer der 7 Segm. Anzeige) 1=rechte Anzeige ; 6 = linke Anzeige
      39. Declare Sub Init_max7219()
      40. Declare Sub Daten_anzeigen()
      41. Declare Sub Initialisierung_senden()
      42. Dim Anz_wert As Integer
      43. Dim Zaehler As Word
      44. Zaehler = 123
      45. 'Dim Zaehl_str As String * 5 ' *5 weil Word max 5 Zahlen hat
      46. 'Dim Zaehl_lg As Byte
      47. 'Dim Hga As String * 1 'Hilfsgrösse A --> Zwischenvariable
      48. 'Dim Pos As Byte 'Position des zu lesenden Zeichens
      49. Init_max7219
      50. Do
      51. 'Zaehl_str = Str(zaehler) 'Zahl in String wandeln
      52. 'Zaehl_lg = Len(zaehl_str) 'Länge des String ermitteln
      53. ' For J = 0 To Zaehl_lg
      54. ' If J > 5 Then Exit For
      55. ' Pos = Zaehl_lg - J
      56. ' Hga = Mid(zaehl_str , Pos , 1) 'bei Mid werden die Zeichen von links gelesen
      57. ' Anz_wert = Val(hga) 'String in Byte wandeln
      58. 'Dig_no = J + 1
      59. 'Daten_anzeigen
      60. 'Next J
      61. '##############
      62. 'dieser Teil funktioniert problemlos
      63. 'For J = 0 To 5
      64. ' Dig_no = J + 1 'Achtung :die einzelnen Digits werden von 1 bis 6 gezählt
      65. ' Anz_wert = J
      66. ' Daten_anzeigen
      67. ' Wait 3
      68. 'Next J
      69. '################
      70. Loop
      71. End
      72. Sub Init_max7219()
      73. '7 Segment Anzeige initialisieren
      74. 'Shutdown Mode einstellen
      75. Befehl = &H0C 'Register für Shutdown (siehe Table 2)
      76. Datensatz = &H00 'Shutdown on (siehe Table 3)
      77. Initialisierung_senden
      78. 'Decode Mode einstellen
      79. Befehl = &H09 'Register für Decode Mode :hier BCD Code B (siehe Table 2)
      80. Datensatz = &HFF 'siehe Datenblatt Table 4
      81. Initialisierung_senden
      82. ' Anzahl der Digits(Anzahl der 7 Segm. Anzeigen) einstellen
      83. Befehl = &H0B ' Scan Limit (siehe Table 2 )
      84. Datensatz = &H05 'hier 6 Displays angeschlossen (siehe Table 8)
      85. Initialisierung_senden
      86. 'Intensität (Leuchtstärke / Bestromung der Segmente)
      87. Befehl = &H0A 'siehe Adress Map (Table 2)
      88. Datensatz = &H04 'Intensity Register (siehe Table 7)
      89. Initialisierung_senden
      90. 'Display Test
      91. Befehl = &H0F 'Display Test (siehe Table 2)
      92. Datensatz = 0 'Test = aus (siehe Table 10)
      93. Initialisierung_senden
      94. 'Shutdown Mode einstellen
      95. Befehl = &H0C 'Register für Shutdown (siehe Table 2)
      96. Datensatz = 1 'Shutdown off; Datensatz=0 wäre Shutdown on--> keine Anzeige (siehe Table3)
      97. Initialisierung_senden
      98. End Sub
      99. Sub Initialisierung_senden()
      100. Cs_display = 0
      101. Shiftout Din_display , Clk_display , Befehl , 1
      102. Shiftout Din_display , Clk_display , Datensatz , 1
      103. Cs_display = 1
      104. Waitms 1
      105. Cs_display = 0
      106. End Sub
      107. Sub Daten_anzeigen()
      108. Cs_display = 0
      109. Shiftout Din_display , Clk_display , Dig_no , 1
      110. Shiftout Din_display , Clk_display , Anz_wert , 1
      111. Cs_display = 1
      112. Waitms 1
      113. Cs_display = 0
      114. End Sub
      Alles anzeigen
    • Hallo Theo,
      dein verwendeter Controller hat halt nur 128 Byte SRAM, wovon du schon 120 Byte für die Stacks "verprasst".
      Da du keine Argumente an die Subs übergibst, kannst du die 10 auskommentierten Bytes vom swstack holen (den also auf 30 setzen). Bei den Stacks kann man sicherlich noch mehr reduzieren, weil sonst jedes neue Dim wieder zu dem Problem führt.
    • @Theo schau mal im bascom-editor auf der linken Seite in den 'code explorer', da findest du Hinweise auf den verwendeten stack.
      Allerdings musst du, wenn du interrupts verwendest, den $hwstack mindestens auf 32 setzen, da hierbei Register Zwischengespeichert werden. Das wird leider nicht automatisch angezeigt.
      stack.PNG
      wenn der code explorer nicht angezeigt wird, kann man den unter 'Anzeigen' einschalten.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • @Theo du steuerst deinen max übrigens nicht über SPI, da müsstest du spiout nehmen, es geht mit shiftout aber genauso. Was geht nicht? Deine Verdrahtung kannst du mit dem displaytest überprüfen. Dazu in der max-init den displaytest nach dem shutdown-off anordnen und natürlich ausführen, 0,5 Sek. warten und wieder beenden. Dadurch sollten alle Segmente deiner Anzeige eben 0,5 Sekunden leuchten.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Hallo Tschoeatsch,
      ja, der Max 7219 stellt schon einige Herausforderungen für mich da. Ich hab jetzt mal den Display Test mit in die Initialisierung eingebunden wie Du vorgeschlagen hast, er lässt auch alle Segmente leuchten bei allen 6 Anzeigen incl. DP auf voller Leuchtsärke, aber diese werden nach 0,5 sec nicht wieder ausgeschaltet. Ich versteh nicht warum.

      In dem unten angehängten Programm ist ein aus kommentierter Bereich, der schreibt die Zahlen von 0 bis 5 mit 3 sec Takt von rechts nach links in die Anzeige, das kappte auf Anhieb.

      Bei meiner Zahlendarstellung der Zahl "123"kommen nur Diffuse anzeigen. Zwar auf jedem Segment ganze Zahlen, aber eben nicht "123" auf den letzten 3 Segmenten von links gesehen.
      Die Spannungsversorgung ist bei mir so geschaltet, dass bei PWR on sowohl der Tiny als auch Max9219 + Segm. versorgt werden. Wenn ich jetzt einschalte, leuchten sofort alle Segm. (incl. DP) gehen aber nicht wieder aus.

      Siehst Du einen Grund dafür ?
      Den Befehl SPIout hab ich mir malangesehen, aber nicht verstanden. Wie müsste das in meinem Beispiel - gesehen für z.b einen Init- Parameter und einen Datenparameter - denn aussehen ? Kannst Du mir da mal ein Beispiel machen?

      Vielen Dank.

      Hier mein aktueller Code

      BASCOM-Quellcode

      1. '(
      2. Programmname : Max7219_V3
      3. Prozessor : ATTiny 2313 (im DIL - Gehäuse)
      4. Takt : 8 Mhz
      5. Bascom Version :2.0.8.1
      6. Thema : ansteuern eines MAX 7219; angeschlossen sind auf der Testplatine
      7. 6 x 7 Segmentanzeigen mit gem. Kathode
      8. Der Maxv 7219 wird über SPI angesteuert
      9. Verwendet wird ein Max 7219 in DIL Gehäuse
      10. Pins vom uC zum Max7219
      11. A) MOSI = PB5 --> Din vom Max7219
      12. B) Clock = PB7 --> Clk von Max7219
      13. C) PB2 --> Load Pin von MAX 7219
      14. In diesem Programm sollen ganze Zahlen dargestellt werden.
      15. ')
      16. $regfile = "Attiny2313.dat"
      17. '$crystal = 16000000 'mit Quartz; kein Teiler durch 8
      18. $crystal = 8000000
      19. '$swstack = 40
      20. $swstack = 10
      21. '$hwstack = 40
      22. $hwstack = 15
      23. '$framesize = 40
      24. $framesize = 30
      25. '###################################
      26. ' Verbindungen zwisch uC und Max7219
      27. Config Portb.2 = Output
      28. Cs_display Alias Portb.2
      29. 'beliebiger Pin am Tiny2313 --> Load von Max
      30. Config Portb.5 = Output
      31. Din_display Alias Portb.5 'Daten die übertragen werden sollen
      32. 'MOSI am Tiny2313 --> Din von Max
      33. Config Portb.7 = Output
      34. Clk_display Alias Portb.7 'Clock für Datenübertragung
      35. 'USCK am Tiny2313 --> Clk von Max
      36. '#####################################
      37. 'Variablenvereinbarung
      38. Dim Befehl As Byte
      39. Dim Datensatz As Byte
      40. Dim J As Byte
      41. Dim Dig_no As Byte 'Digit Nummer (Nummer der 7 Segm. Anzeige) 1=rechte Anzeige ; 6 = linke Anzeige
      42. Declare Sub Init_max7219()
      43. Declare Sub Daten_anzeigen()
      44. Declare Sub Initialisierung_senden()
      45. Dim Anz_wert As Integer
      46. Dim Zaehler As Word
      47. Zaehler = 123
      48. Dim Zaehl_str As String * 5 ' *5 weil Word max 5 Zahlen hat
      49. Dim Zaehl_lg As Byte
      50. Dim Hga As String * 1 'Hilfsgrösse A --> Zwischenvariable
      51. Dim Pos As Byte 'Position des zu lesenden Zeichens
      52. Init_max7219
      53. Do
      54. Zaehl_str = Str(zaehler) 'Zahl in String wandeln
      55. Zaehl_lg = Len(zaehl_str) 'Länge des String ermitteln
      56. For J = 0 To Zaehl_lg
      57. If J > 5 Then Exit For
      58. Pos = Zaehl_lg - J
      59. Hga = Mid(zaehl_str , Pos , 1) 'bei Mid werden die Zeichen von links gelesen
      60. Anz_wert = Val(hga) 'String in Byte wandeln
      61. Dig_no = J + 1
      62. Daten_anzeigen
      63. Next J
      64. '##############
      65. 'dieser Teil funktioniert problemlos
      66. 'For J = 0 To 5
      67. ' Dig_no = J + 1 'Achtung :die einzelnen Digits werden von 1 bis 6 gezählt
      68. ' Anz_wert = J
      69. ' Daten_anzeigen
      70. ' Wait 3
      71. 'Next J
      72. '################
      73. Loop
      74. End
      75. Sub Init_max7219()
      76. '7 Segment Anzeige initialisieren
      77. 'Shutdown Mode einstellen
      78. Befehl = &H0C 'Register für Shutdown (siehe Table 2)
      79. Datensatz = &H00 'Shutdown on (siehe Table 3)
      80. Initialisierung_senden
      81. 'Decode Mode einstellen
      82. Befehl = &H09 'Register für Decode Mode :hier BCD Code B (siehe Table 2)
      83. Datensatz = &HFF 'siehe Datenblatt Table 4
      84. Initialisierung_senden
      85. ' Anzahl der Digits(Anzahl der 7 Segm. Anzeigen) einstellen
      86. Befehl = &H0B ' Scan Limit (siehe Table 2 )
      87. Datensatz = &H05 'hier 6 Displays angeschlossen (siehe Table 8)
      88. Initialisierung_senden
      89. 'Intensität (Leuchtstärke / Bestromung der Segmente)
      90. Befehl = &H0A 'siehe Adress Map (Table 2)
      91. Datensatz = &H04 'Intensity Register (siehe Table 7)
      92. Initialisierung_senden
      93. 'Display Test
      94. Befehl = &H0F 'Display Test (siehe Table 2)
      95. Datensatz = 0 'Test = aus (siehe Table 10)
      96. Initialisierung_senden
      97. 'Shutdown Mode einstellen
      98. Befehl = &H0C 'Register für Shutdown (siehe Table 2)
      99. Datensatz = 1 'Shutdown off; Datensatz=0 wäre Shutdown on--> keine Anzeige (siehe Table3)
      100. Initialisierung_senden
      101. 'Display Test durchfhren
      102. 'Display Test on
      103. Befehl = &H0F 'Display Test (siehe Table 2)
      104. Datensatz = 1 'Test =an (siehe Table 10)
      105. Initialisierung_senden
      106. Waitms 500 '0,5 sec warten (alle Segmnete müssen 0,5 sec leuchten)
      107. 'Display Test off
      108. Befehl = &H0F 'Display Test (siehe Table 2)
      109. Datensatz = 1 'Test = aus (siehe Table 10)
      110. Initialisierung_senden
      111. End Sub
      112. Sub Initialisierung_senden()
      113. Cs_display = 0
      114. Shiftout Din_display , Clk_display , Befehl , 1
      115. Shiftout Din_display , Clk_display , Datensatz , 1
      116. Cs_display = 1
      117. Waitms 1
      118. Cs_display = 0
      119. End Sub
      120. Sub Daten_anzeigen()
      121. Cs_display = 0
      122. Shiftout Din_display , Clk_display , Dig_no , 1
      123. Shiftout Din_display , Clk_display , Anz_wert , 1
      124. Cs_display = 1
      125. Waitms 1
      126. Cs_display = 0
      127. End Sub
      Alles anzeigen
    • Schalt erst mal deinen Test nach dem Einschalten auch wieder aus ^^ Test= aus Datensatz=0.
      Ich hab' grad' mal mein Win10 zerstört und bin jetzt mit dem beschäftigt a_20_e8d7189d Das Beispiel für SPI braucht jetzt noch bisschen.
      Oder schau mal in diesem code nach Uhr mit 4x 8x8 Led-Matrix Max7219
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • BASCOM-Quellcode

      1. 'SPI einrichten
      2. Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = High , Phase = 1 , Clockrate = 4 , Noss = 1
      3. Spiinit
      4. ' Verbindungen zwisch uC und Max7219
      5. Config Portb.2 = Output
      6. Cs_display Alias Portb.2
      7. 'beliebiger Pin am Tiny2313 --> Load von Max
      8. 'MOSI am Tiny2313 --> Din von Max
      9. 'USCK am Tiny2313 --> Clk von Max
      10. Sub Initialisierung_senden()
      11. Cs_display = 0
      12. Spiout Befehl , 1
      13. Spiout Datensatz , 1
      14. Cs_display = 1
      15. End Sub
      Alles anzeigen
      so müsste es mit SPI gehen. Deine sub 'Daten_anzeigen' natürlich entsprechend umschreiben.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • hallo tschoeatsch,
      herzlichen Dank für Deine Hilfe ! Ja, das mit dem Test ein/aus war ein blöder Fehler von mir. Aber: shit happens.

      So nachdem ich den Fehler beseitigt hatte, passiert folgendes : alle 6x 7-Segmenter leuchten incl. des DP
      für ca. 500ms. Danach bleiben die DP's an die einzelnen Segmente gehen aus. Das Programm macht aber auch keinen Fortschritt, d.h. meine Zahl "123" wird nicht angezeigt. Es werden auch keine anderen Zeichen angezeigt.
      Erkennst Du in meinem Programm dafür einen Grund ?
      Dieses Erscheinungsbild habe ich übrigens auch bei Programmen die laufen; nach PWR on leuchten erst mal alle DP's und mit dem Fortschritt der Beschreibung der einzelnen 7- Segmenter gehen die DP's auf off.

      Deine Einarbeitung in SPI habe ich gesehen. Danke! Ich wird mal ne neue Version erzeugen und da dadrin einarbeiten. Wenn das fertig ist, melde ich mich wieder.
      Danke + Gruss
      Theo
    • Mach mal an dem Max zwischen CS und VCC einen pullup (10k) dran, dann wird es zuverlässiger.
      Das Aufteilen in einzelne Ziffern hab' ich auf deine Art noch nie probiert, ich mach das immer so

      BASCOM-Quellcode

      1. Dim Zahl As Word
      2. Dim Zehntausend As Word , Tausend As Word , Hundert As Word , Zehn As Word , Eins As Word
      3. Zehntausend = Zahl / 10000
      4. Tausend = Zahl Mod 10000 : Tausend = Tausend / 1000
      5. Hundert = Zahl Mod 1000 : Hundert = Hundert / 100
      6. Zehn = Zahl Mod 100 : Zehn = Zehn / 10
      7. Eins = Zahl Mod 10
      Damit das Senden an den Max in einer Schleife gemacht werden kann, nimmst halt statt Zehntausend/Tausend.. ein array Ziffern(5) as word. Zehntausend wäre dann Ziffer(5).
      Raum für Notizen

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

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

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

    • hallo tschoeatsch,

      vielen Dank für Deinen Hinweis in #10. Ich muss/werde das später mal erproben.
      sag mal, kann es sein, das der Tiny 2313 gar kein HW SPI kann ? Ich bekomme da so kryptische Fehlermeldungen. Ich hab daraufhin mal das DB vom Tiny2313 mit dem DB vom Mega 328p ( hab ich auch hier) verglichen. Daraufhin habe ich mich entschlossen das alles auf den 328p umzuschreiben.
      Das wird etwas dauern.
      Weiter hin schlage ich vor, diesen Threat bei einen alten Thema : Probleme mit Max7219 ( oder so ähnlich; vor ca.2 Monaten von mir) fortzusetzen, denn unter dem obigen Thema findet das ja " kein Mensch" wieder.

      Gruss
      Theo
    • Die USI sollte SPI Funktionalität haben (Konjunktiv! Ich weiß es nicht 100%ig) Ich hab' grad' mit meinem Win10 Probleme, vielleicht teste ich dein Programm mal zur Ablenkung aus.
      Wir lesen uns dann im anderen thread...
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Theo schrieb:

      Mega 328p ( hab ich auch hier)
      Das ist m.E. der richtige Prozessor für Anfänger.
      Keine Probleme mit SRAM,
      keine Probleme mit Hardware-SPI
      usw. usw.
      Der Chip hat alles, was man braucht und wenn man mehr braucht, dann ist man kein Anfänger und kann selber entscheiden, welcher Chip ok. ist. Das ist dann auch erst der Zeitpunkt, mal einen Tiny zu verwenden.
    • Noch ein kleiner Hinweis zum Programm: das Wandeln von einer Zahl zu den Einzelziffern macht dieser Befehl
      avrhelp.mcselec.com/str2digits.htm
      Raum für Notizen

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

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