String verschwindet von allein im EERAM

    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!

    • String verschwindet von allein im EERAM

      Hallo Zusammen,

      mir ist heute aufgefallen, das die in RAM gespeicherte Texte teilweise von allein verschwinden.
      Was kann da die Ursache sein?
      Wie kann ich das verhindern?

      Nicht immer taucht das Problem auf.
      Aber es ist schon ärgerlich, wenn mal ein Stringteil so einfach verschwindet.

      BASCOM-Quellcode

      1. Dim Sfc As String * 80
      2. Dim Ee_vorname As Eram String * 10
      3. Dim Ss_vorname As String * 10
      4. 'Hinzufügen.
      5. 'Der String wird zu erst in eine Variable geschrieben
      6. 'und dann ins RAM
      7. Ss_vorname = "String"
      8. Ee_vorname = Ss_vorname
      9. 'Aufrufen.
      10. 'Der String im RAM, wird direkt in eine Variable geschrieben
      11. Ss_vorname = Ee_vorname
      12. 'Dann wird der String per TCPWritestr gesendet
      13. Sfc = "Name|" + Ss_vorname + "|"
      14. Result = = Tcpwritestr(idx , Sfc , 255)
      Alles anzeigen

      Am Anfang dachte ich, es liegt an der TCP Verbindung.
      Doch nachdem ich per Print mir die Daten ins HyperTerminal geholt habe, da habe ich gesehen, das die auch dort fehlen.

      Kann es mal vorkommen, das einfach so ein Teil von der Zeichenkette verschwindet?

      Bin total ratlos bin für jede Hilfe angewiesen ;)

      PS: String ist nicht lang maximal 20 Zeichen insgesamt.

      VG
      Katip
    • katipefendi schrieb:

      Doch nachdem ich per Print mir die Daten ins HyperTerminal geholt habe, da habe ich gesehen, das die auch dort fehlen.
      Ich sehe keine entsprechende Routine, nichtmal, welchen der beiden Strings du jetzt ans Terminal sendest.

      katipefendi schrieb:

      String ist nicht lang maximal 20 Zeichen insgesamt.
      und SS_Vorname schafft max.10

      katipefendi schrieb:

      Kann es mal vorkommen, das einfach so ein Teil von der Zeichenkette verschwindet?
      nein,
      es sein denn, einer überschreibt die Daten.

      katipefendi schrieb:

      Result = = Tcpwritestr(idx , Sfc , 255)
      ist das so durch den Compiler gegangen?
    • Hi,

      also nochmal
      Ich wollte einfach wie möglich darstellen, damit man die Übersicht nicht verliert.

      Es sind zwei Variablen je mit 10 String länge deklariert und daher hatte ich oben geschrieben max. 20 Zeichen lang.
      Es geht vielmehr darum, warum beim Lesen von RAM, Zeichenteile verschwinden.

      Das passiert aber nicht immer, zwar selten aber es passiert nun mal.

      Quellcode

      1. $regfile = "m328PBdef.dat"
      2. $crystal = 16000000
      3. '$baud = 19200
      4. $hwstack = 128
      5. $swstack = 128
      6. $framesize = 128
      7. Config Pinb.0 = Input
      8. Portb.0 = 1
      9. Inramschreiben Alias Pinb.0
      10. Open "comd.6:19200,8,N,1" For Output As #2
      11. Dim Ee_vorname As Eram String * 10
      12. Dim Ee_nachname As Eram String * 10
      13. Dim Ss_vorname As String * 10
      14. Dim Ss_nachname As String * 10
      15. Dim Sfc As String * 80
      16. Dim Idx As Byte
      17. Dim Result1 As Word
      18. Dim Flags As Byte
      19. Dim Bclient As Byte
      20. Config Tcpip = Noint , Mac = 0.8.220.05.05.05 , Ip = 192.168.5.13 , Submask = 255.255.255.0 , Gateway = 192.168.5.254 , Localport = 1001 , Chip = W5500 , Spi = 1 , Cs = Portb.2
      21. Do
      22. Debounce Inramschreiben , 0 , Speicherninram , Sub
      23. Print #2 , Ss_vorname
      24. Print #2 , Ss_nachname
      25. For Idx = 0 To 3
      26. Result1 = Socketstat(idx , 0)
      27. Select Case Result1
      28. Case Sock_established
      29. If Flags.idx = 0 Then
      30. Sfc = "Name|" + Ss_vorname + "|" + Ss_nachname + "|"
      31. Result1 = Tcpwritestr(idx , Sfc , 255)
      32. End If
      33. Case Sock_close_wait
      34. Closesocket Idx
      35. Case Sock_closed
      36. Bclient = Getsocket(idx , Sock_stream , Local_port , 0)
      37. Socketlisten Idx
      38. Flags.idx = 0
      39. Case Sock_listen
      40. Case Else
      41. End Select
      42. Next
      43. Loop
      44. '###############################################################################
      45. Speicherninram:
      46. Print #2 , "In RAM schreiben"
      47. Ss_vorname = "Katip"
      48. Ee_vorname = Ss_vorname
      49. Ss_nachname = "Efendi"
      50. Ee_nachname = Ss_nachname
      51. Return
      Alles anzeigen
    • djmsc schrieb:

      @Michael und wo bleibt deine geliebte Frage nach den Stackwerten
      Denn auch die sind wichtig.
      ich wollte mal was neues ausprobieren ;)

      katipefendi schrieb:

      Es geht vielmehr darum, warum beim Lesen von RAM, Zeichenteile verschwinden.
      Dein Programm holt sich beim Start keine Daten in die Strings.
      Dann printet es auch nichts, außer CRLF.
      Schreib doch in Zeile 30-31 nochmal die Sachen aus Zeile 79 und 82.
    • Einzeller schrieb:

      IMHO müsste irgendwo noch genau der umgekehrte Vorgang stattfinden, d.h. ein Auslesen des EEPROMs.
      Ja das wäre die logische Art die Daten aus dem EEPorm wieder einzulesen :)
      Also das

      Ss_vorname = Ee_vorname
      Ss_nachname = Ee_nachname

      vor Do Loop einfügen.

      Allerdings muss man irgendwann mal auf die "Speichern" Taste drücken.

      Aber war es nicht so, dass man dem EEProm auch etwas Zeit zum Schreiben geben sollt?
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Einzeller schrieb:

      Wenn man die Zeilen 79 und 82 vor die Do-Loop-Schleife setzt, werden die Strings Ss_vorname und Ss_nachname aber auch nur vom Programm "gefüllt" ud nicht aus dem EEPROM gelesen - oder mache ich da einen Denkfehler?
      Das Problem ist nicht der nicht gefüllte EEprom.
      Das Problem ist, dass die RAM-Variablen keinen Inhalt haben.
      Der EEprom wird sicher noch in einem anderen Programmteil gelesen, den katipefendi nicht gepostet hat.


      Einzeller schrieb:

      IMHO müsste irgendwo noch genau der umgekehrte Vorgang stattfinden, d.h. ein Auslesen des EEPROMs.
      Eeeprom ist nicht nötig bei Print #2 , Ss_vorname, nur Inhalt.


      djmsc schrieb:

      Aber war es nicht so, dass man dem EEProm auch etwas Zeit zum Schreiben geben sollt?
      Bascom wartet selber, wie bei Print
    • stefanhamburg schrieb:

      @katipefendi: Zum Verständnis: Mit RAM meinst Du EEPROM-Speicher, oder?
      Speicheraufbau
      Hi Stefan,

      ja, sorry damit meine ich den EEPROM

      Per Taster, werden die Strings in den EEPROM geschrieben

      Quellcode

      1. '###############################################################################
      2. Speicherninram:
      3. Print #2 , "In RAM schreiben"
      4. Ss_vorname = "Katip"
      5. Ee_vorname = Ss_vorname
      6. Ss_nachname = "Efendi"
      7. Ee_nachname = Ss_nachname
      8. Return

      Es geht darum, das bei Ein - und Ausschalten des Geräts, die in EEPROM geschrieben Daten manchmal verloren gehen.

      VG
      Katip
    • Das Erom reagiert allergisch auf instabile Betriebsspannung. Mal nen Oskar dran gehagen ? Blockkondensatoren (ca 100n zwischen Vcc und Vss) vorhanden.
      Amtel empfiehlt die Verwendung des Brouwn out Detektors, der würde ein Reset verursachen wenn die Betriebsspannung soweit sinkt bevor er "durchdreht".

      PS werden sie wirklich falsch geschrieben? Oder gelesen? Bei schnellen Start kann die Betriebsspannung sich noch im "Einschwingvorgang"/prellen befinden. Dann würde er u.U auch was falsches lesen. Daher besser nicht als erstes das Erom auslesen sonder ihn ein bisschen "Aufwachzeit (ca 100ms) geben.
    • Michael schrieb:

      katipefendi schrieb:

      Per Taster, werden die Strings in den EEPROM geschrieben
      ja, klar, aber wie holst du die Daten?

      Quellcode

      1. $regfile = "m328PBdef.dat"
      2. $crystal = 16000000
      3. '$baud = 19200
      4. $hwstack = 128
      5. $swstack = 128
      6. $framesize = 128
      7. Config Pinb.0 = Input
      8. Portb.0 = 1
      9. Inramschreiben Alias Pinb.0
      10. Open "comd.6:19200,8,N,1" For Output As #2
      11. Dim Ee_vorname As Eram String * 10
      12. Dim Ee_nachname As Eram String * 10
      13. Dim Ss_vorname As String * 10
      14. Dim Ss_nachname As String * 10
      15. Dim Sfc As String * 80
      16. Dim Idx As Byte
      17. Dim Result1 As Word
      18. Dim Flags As Byte
      19. Dim Bclient As Byte
      20. Config Tcpip = Noint , Mac = 0.8.220.05.05.05 , Ip = 192.168.5.13 , Submask = 255.255.255.0 , Gateway = 192.168.5.254 , Localport = 1001 , Chip = W5500 , Spi = 1 , Cs = Portb.2
      21. Do
      22. Debounce Inramschreiben , 0 , Speicherninram , Sub
      23. Print #2 , Ss_vorname
      24. Print #2 , Ss_nachname
      25. For Idx = 0 To 3
      26. Result1 = Socketstat(idx , 0)
      27. Select Case Result1
      28. Case Sock_established
      29. If Flags.idx = 0 Then
      30. Ss_vorname = Ee_vorname
      31. Ss_nachname = Ee_nachname
      32. Sfc = "Name|" + Ss_vorname + "|" + Ss_nachname + "|"
      33. Result1 = Tcpwritestr(idx , Sfc , 255)
      34. End If
      35. Case Sock_close_wait
      36. Closesocket Idx
      37. Case Sock_closed
      38. Bclient = Getsocket(idx , Sock_stream , Local_port , 0)
      39. Socketlisten Idx
      40. Flags.idx = 0
      41. Case Sock_listen
      42. Case Else
      43. End Select
      44. Next
      45. Loop
      46. '###############################################################################
      47. Speicherninram:
      48. Print #2 , "In RAM schreiben"
      49. Ss_vorname = "Katip"
      50. Ee_vorname = Ss_vorname
      51. Ss_nachname = "Efendi"
      52. Ee_nachname = Ss_nachname
      53. Return
      Alles anzeigen
      Ss_vorname = Ee_vorname
      Ss_nachname = Ee_nachname
    • Pluto25 schrieb:

      Das Erom reagiert allergisch auf instabile Betriebsspannung. Mal nen Oskar dran gehagen ? Blockkondensatoren (ca 100n zwischen Vcc und Vss) vorhanden.
      Amtel empfiehlt die Verwendung des Brouwn out Detektors, der würde ein Reset verursachen wenn die Betriebsspannung soweit sinkt bevor er "durchdreht".
      Oskar? :)



      PS werden sie wirklich falsch geschrieben? Oder gelesen? Bei schnellen Start kann die Betriebsspannung sich noch im "Einschwingvorgang"/prellen befinden. Dann würde er u.U auch was falsches lesen. Daher besser nicht als erstes das Erom auslesen sonder ihn ein bisschen "Aufwachzeit (ca 100ms) geben.

      werde ich mal versuchen
    • katipefendi schrieb:

      Ss_vorname = Ee_vorname
      Ss_nachname = Ee_nachname
      Wie schon zu Anfang, du Printest bevor du die Daten in den Variablen hast.

      Geh doch dein Pogramm mal systematisch durch und schau, wo die Variablen gefüllt werden.
      Tritt dieser Zustand bei jedem Start auf?
      Wenn dein Netz nicht da ist, wird Sock_etablished nicht eintreten.


      In Beitrag #6 hatte ich es bereits beschrieben.

      Michael schrieb:

      Dein Programm holt sich beim Start keine Daten in die Strings.
      Dann printet es auch nichts, außer CRLF.
      Schreib doch in Zeile 30-31 nochmal die Sachen aus Zeile 79 und 82.
      Hast du das nicht umgesetzt?
    • Hi,

      ich habe mal jetzt das ganze anders gemacht, uszwar schreiben und lesen per Taster.

      BASCOM-Quellcode

      1. $regfile = "m328PBdef.dat"
      2. $crystal = 16000000
      3. '$baud = 19200
      4. $hwstack = 128
      5. $swstack = 128
      6. $framesize = 128
      7. Config Pinb.0 = Input
      8. Portb.0 = 1
      9. Inramschreiben Alias Pinb.0
      10. Config Pinb.1 = Input
      11. Portb.1 = 1
      12. Voneepromlesen Alias Pinb.1
      13. Open "comd.6:19200,8,N,1" For Output As #2
      14. Dim Ee_vorname As Eram String * 10
      15. Dim Ee_nachname As Eram String * 10
      16. Dim Ss_vorname As String * 10
      17. Dim Ss_nachname As String * 10
      18. Dim Sfc As String * 80
      19. Dim Idx As Byte
      20. Dim Result1 As Word
      21. Dim Flags As Byte
      22. Dim Bclient As Byte
      23. Config Tcpip = Noint , Mac = 0.8.220.05.05.05 , Ip = 192.168.5.13 , Submask = 255.255.255.0 , Gateway = 192.168.5.254 , Localport = 1001 , Chip = W5500 , Spi = 1 , Cs = Portb.2
      24. Do
      25. Debounce Inramschreiben , 0 , Speicherninram , Sub
      26. Debounce Voneepromlesen , 0 , Speicherlesen , Sub
      27. For Idx = 0 To 3
      28. Result1 = Socketstat(idx , 0)
      29. Select Case Result1
      30. Case Sock_established
      31. If Flags.idx = 0 Then
      32. Ss_vorname = Ee_vorname
      33. Ss_nachname = Ee_nachname
      34. Sfc = "Name|" + Ss_vorname + "|" + Ss_nachname + "|"
      35. Result1 = Tcpwritestr(idx , Sfc , 255)
      36. End If
      37. Case Sock_close_wait
      38. Closesocket Idx
      39. Case Sock_closed
      40. Bclient = Getsocket(idx , Sock_stream , Local_port , 0)
      41. Socketlisten Idx
      42. Flags.idx = 0
      43. Case Sock_listen
      44. Case Else
      45. End Select
      46. Next
      47. Loop
      48. '###############################################################################
      49. Speicherninram:
      50. Print #2 , "In RAM schreiben"
      51. Ss_vorname = "Katip"
      52. Ee_vorname = Ss_vorname
      53. Ss_nachname = "Efendi"
      54. Ee_nachname = Ss_nachname
      55. Return
      56. '###############################################################################
      57. Speicherlesen:
      58. Print #2 , Ss_vorname
      59. Print #2 , Ss_nachname
      60. Return
      Alles anzeigen

      Der Speicher löscht sporadisch und willkürlich Zeichen vom String. Dabei ist es egal ob vom Anfang oder Ende.
      Und das passiert aber nur dann, wenn ich die Versorgungsspannung Ein- bzw. Ausschalte.

      Also hat es mit dem Programmablauf wenig zutun würde ich sagen.
      Oder was denkt ihr?
    • Pluto25 schrieb:

      Sicher das der keinen Mist sendet? Sfc hat maximal 80 Zeichen, aber er wird angewiesen 255 zu übertragen
      Also gesendet werden schon die Daten und es kommen ja auch die an, was gesendet wird.


      Pluto25 schrieb:

      Die Betriebsspannung ist stabil? Der W5500 kann da schon etwas dran rucken.

      Die Betriebsspannung sollte stabil sein, da habe ich ein 5V / 4A Netzteil und für den W5500 3,3 LDO.


      Pluto25 schrieb:

      Die Ss_vorname = Ee_vorname im Speicherlesen würden zeigen ob sie wirklich geschrottet sind.
      Manchmal lese ich da y mit zwei Punkte drauf :S