Einfache Subroutine um Eeprom zu beschreiben, lesen oder segmente zu löschen

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Einfache Subroutine um Eeprom zu beschreiben, lesen oder segmente zu löschen

      Hi,

      hatte für mein letztes Projekt eine kleine Funktion geschrieben, da ich bei diesem Projekt mit Variablenblöcken hantiert habe, die ich nach bedarf immer auslesen musste, bzw. beschreiben und die ich um beliebig viele erweitern musste:

      BASCOM Source Code

      1. '**************************************************
      2. 'Aufgabe: Subroutine schreibt,liest oder löscht Daten von _slot Auswahl in entsprechender Section
      3. ' Die Speicherplätze der einzelnen Variablen sind in der Data Speicherregister_EEprom hinterlegt
      4. ' und können auf beliebig weitere Einträge erweitert werden.
      5. '
      6. '_slot = Gibt den Wert des gewünschten Speicherpackes an
      7. '_rw = Gibt an welche Funktion ausgeführt wird:
      8. ' 0 - Lesen
      9. ' 1 - Schreiben
      10. ' 2 - Löschen
      11. '_section = Gibt die Variable an die verändert wird 1-8,0 bedeutet alles ändern
      12. '
      13. 'Geschrieben und getestet: 24.11.2018
      14. 'Autor: Kai Listner
      15. '**************************************************
      16. Sub Eeprom_Datenplaetze(Byval _slot as Word , Byval _rw as Byte , Byval _section as Byte)
      17. Dim Register_auswahl(8) as Long
      18. Local Register as Byte
      19. Local Register_slotstart as Long
      20. Local Null_byte as Byte
      21. Local Null_int as Integer
      22. Local Null_word as Word
      23. Local X as Byte
      24. Null_byte = 0
      25. Null_int = 0
      26. Null_word = 0
      27. Const Startwert = &H10 'Offset von 16 Byte sofern gebraucht
      28. Const Byteregisterlaenge = &H10 'Angabe der Blocklänge aus Speicherregister_EEprom
      29. Register_slotstart = _slot * Byteregisterlaenge
      30. Register_slotstart = Register_slotstart + Startwert
      31. Restore Speicherregister_Eeprom
      32. For x = 1 To 8 'X= 1 to 8 muss an Datenblock bzw. die Anzahl an Variablen angepasst werden
      33. Read register
      34. Register_auswahl(x) = register + register_slotstart
      35. Next
      36. Select Case _rw
      37. Case 0: 'Lesen
      38. If _section = 0 Then
      39. For x = 1 To 8
      40. Eeprom_sectionlesen:
      41. Select Case x
      42. Case 1 : readeeprom Laenge , Register_auswahl(1)
      43. Case 2 : readeeprom Laenge_last , Register_auswahl(2)
      44. Case 3 : readeeprom Abstand , Register_auswahl(3)
      45. Case 4 : readeeprom Abstand_last , Register_auswahl(4)
      46. Case 5 : readeeprom Anzahl , Register_auswahl(5)
      47. Case 6 : readeeprom Anzahl_last , Register_auswahl(6)
      48. Case 7 : readeeprom Geschw , Register_auswahl(7)
      49. Case 8 : readeeprom Geschw_last , Register_auswahl(8)
      50. End Select
      51. If _section <> 0 Then Goto Eeprom_sectionlesen_end
      52. Next
      53. Else
      54. x = _section
      55. goto Eeprom_sectionlesen
      56. End If
      57. Eeprom_sectionlesen_end:
      58. Case 1: 'Schreiben
      59. If _section = 0 Then
      60. For x = 1 To 8
      61. Eeprom_sectionschreiben:
      62. Select Case x
      63. Case 1 : writeeeprom Laenge , Register_auswahl(1)
      64. Case 2 : writeeeprom Laenge_last , Register_auswahl(2)
      65. Case 3 : writeeeprom Abstand , Register_auswahl(3)
      66. Case 4 : writeeeprom Abstand_last , Register_auswahl(4)
      67. Case 5 : writeeeprom Anzahl , Register_auswahl(5)
      68. Case 6 : writeeeprom Anzahl_last , Register_auswahl(6)
      69. Case 7 : writeeeprom Geschw , Register_auswahl(7)
      70. Case 8 : writeeeprom Geschw_last , Register_auswahl(8)
      71. End Select
      72. If _section <> 0 Then Goto Eeprom_sectionschreiben_end
      73. Next
      74. Else
      75. x = _section
      76. Goto Eeprom_sectionschreiben
      77. End If
      78. Eeprom_sectionschreiben_end:
      79. Case 2: 'Löschen
      80. If _section = 0 Then
      81. For x = 1 To 8
      82. Eeprom_sectionloeschen:
      83. Select Case x
      84. Case 1 : writeeeprom Null_word , Register_auswahl(1)
      85. Case 2 : writeeeprom Null_word , Register_auswahl(2)
      86. Case 3 : writeeeprom Null_word , Register_auswahl(3)
      87. Case 4 : writeeeprom Null_word , Register_auswahl(4)
      88. Case 5 : writeeeprom Null_word , Register_auswahl(5)
      89. Case 6 : writeeeprom Null_word , Register_auswahl(6)
      90. Case 7 : writeeeprom Null_word , Register_auswahl(7)
      91. Case 8 : writeeeprom Null_word , Register_auswahl(8)
      92. End Select
      93. If _section <> 0 Then Goto Eeprom_sectionloeschen_end
      94. Next
      95. Else
      96. x = _section
      97. Goto Eeprom_sectionloeschen
      98. End If
      99. Eeprom_sectionloeschen_end:
      100. End Select
      101. End Sub
      102. '*****************************************************************************
      103. Speicherregister_EEprom:
      104. Data &H00 , &H02 , &H04 , &H06 , &H08 , &H0A , &H0C , &H0E
      105. ' | | | | | | | |
      106. ' | | | | | | | |
      107. ' | | | | | | | |
      108. ' | | | | | | | ---------------Count_last 2Byte
      109. ' | | | | | | ----------------------Count 2Byte
      110. ' | | | | | -----------------------------Speed_last 2Byte
      111. ' | | | | ------------------------------------Speed 2Byte
      112. ' | | | -------------------------------------------Distance_last 2Byte
      113. ' | | --------------------------------------------------Distance 2Byte
      114. ' | ---------------------------------------------------------Length_last 2Byte
      115. ' ----------------------------------------------------------------Length 2Byte
      116. ' +16Byte = &H10
      117. '*****************************************************************************
      Display All
      Sicherlich gibt es da bestimmt noch Verbesserungsbedarf, sodass man evtl noch die festen Variablen durch Dynamische erweitern könnte (wusste aber nicht wie ich dynamische Variable über alle Variablentypen gestalten sollte, somit sind sie eben fest in der Sub verankert), aber sie funktioniert einwandfrei und ist für meine Zwecke absolut Zielführend.

      Falls sie jemand nutzen möchte, steht es ihm frei sie zu nutzen, sollte jemand fragen oder Anregunden haben: Dies ist ein Forum, man wird nicht gebissen ;) auch bin ich natürlich immer auf der Suche selbst nach anregungen wie ich meinen Programmierstil verbessern kann...

      Gruß Kai
    • Ich habs jetzt nur überflogen.
      Aber sieht so aus, als ob du Datensätze speichern willst.

      Jetzt willst du nur angeben, welcher Datensatz, und ob er zu Lesen, zu schreiben oder zu löschen ist.

      Du kannst zum einen Variablen als Datensatz zusammenstallen, indem du sie hintereinander weg dimensionierst.

      Ein Datensatz etwa für eine Adresse:
      Dim Name as String*12
      Dim Vorname as string*12
      Dim Plz as Word
      Dim Strasse as String*10

      Jetzt brauchst du noch die Länge des Datensatzes, den musst du noch von Hand ausrechnen.

      Const DatensatzSize = 13+13+2+11 ' Datensatzlänge der Adresse

      Jetzt kannst du deiner Routine übergeben

      Sub WriteDatensatz(3)

      End Sub

      Dann wird Byte für Byte vom SRam EEProm kopiert. Insgesamt Anzahl Bytes = DatensatzSize.

      Die Startadresse im EEProm wird bestimmt durch DatensatzSize * DatensatzNr.

      Das mal als Anregung.
      Kaum macht man es richtig - und schon geht's!
    • Mitch64 wrote:

      Ich habs jetzt nur überflogen.
      Aber sieht so aus, als ob du Datensätze speichern willst.

      Jetzt willst du nur angeben, welcher Datensatz, und ob er zu Lesen, zu schreiben oder zu löschen ist.

      Du kannst zum einen Variablen als Datensatz zusammenstallen, indem du sie hintereinander weg dimensionierst.

      Ein Datensatz etwa für eine Adresse:
      Dim Name as String*12
      Dim Vorname as string*12
      Dim Plz as Word
      Dim Strasse as String*10

      Jetzt brauchst du noch die Länge des Datensatzes, den musst du noch von Hand ausrechnen.

      Const DatensatzSize = 13+13+2+11 ' Datensatzlänge der Adresse

      Jetzt kannst du deiner Routine übergeben

      Sub WriteDatensatz(3)

      End Sub

      Dann wird Byte für Byte vom SRam EEProm kopiert. Insgesamt Anzahl Bytes = DatensatzSize.

      Die Startadresse im EEProm wird bestimmt durch DatensatzSize * DatensatzNr.

      Das mal als Anregung.
      Hä...an sich war das von mir keine Frage für ein Problem...vielmehr eine Lösung für Leute die eine Lösung suchen... xD

      Der Code funktioniert ja und arbeitet etwa nach deinem geschilderten Prinzp...nur das ich die Länge meines Datenstrings nicht im EEPROM angebe...

      Die Länge des kompletten Datenpack ergibt sich aus der Zusammenrechnung der Variablentypen (Byte = 1 Byte, Integer & Word = 2 Byte,...) Die komplette Länge Steht in "Byteregisterlaenge" und die Einzelnen Positionen der Variablen sind angegeben unter dem Label Speicherregister_EEprom...

      Sollte man irgendwelche Daten davor sichern wollen kann man die Größe der "Lücke" in der Variable "Startwert" angeben.

      Als Übergabe an _slot gibt man dann den Datensatz an der gelesen, geschrieben oder gelöscht werden soll...
      Welche Funktion ausgeführt werden soll wird an _RW übergeben.
      Und sollte man nur einzelne Werte lesen/beschreiben/löschen wollen übergibt man diesen in _section ( 0 -> Betrift Alle Werte; _section > 0 betrifft nur den Ausgewählten Wert)

      In dem sinne biete ich eine fertige Lösung für Leute die mit Datenpaketen arbeiten wollen...

      Gruß Kai