Bootloader Version

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

    • Also, so verstehe ich RAMPZ.

      der 1284 hat 128KB Flash. Adressiert können (wegen 8Bit) nur bis 64K. Deswegen hat Atmel die RAMP Register eingeführt um an den Bereich >64K zu kommen. RAMPZ=0=>46K, RAMPZ=1=>64K. Ich hoffe ich konnte das mit meinem mageren Englisch so richtig verstehen.

      Das Problem nun, trotz RAMPZ=1 schmiert das Programm bei String ab. Integer liefert mir -1.

      Mitch64 wrote:

      Dim _Version as Integer
      Dim _myString as String * 30

      RAMPZ = 1
      Read _Version
      Read _myString
      Bin mir aber nicht mehr sicher ob das mit RAMPZ so richtig ist...


      Pac-Man wrote:

      $noramclear
      Dim _version As Integer
      Dim _mystring As String * 30
      Read _version
      Read _mystring
      Mit $noramclear wird doch alles richtig gelesen, selbst vom Flash>64K, auch ohne RAMPZ=1.

      Kann man sich irgendwie dir Register R8 und R9 über die Serielle schicken? Ich vermute mal das die gelöscht werden.
    • Mit 2 Byte (16 Bit) kann man genau 2^16 Adressen ansteuern. Das sind die gerundeten 64k. Genau sind es 65536.
      RAMPZ ist nun das 3. Adressbyte und bildet die Adressbit 16 bis 23 von der Adresse.

      Und ja kann man r8 und r9 ausgeben.
      Kannst ja in eine Variable (am besten Word) einlesen. r8 = LowByte, r9 = HighByte.

      Das kannst du dann per Print Hex(wert) ausgeben.
      Und wenn du schon dabei bist, dann mach das doch auch gleich mit RAMPZ.

      Ein Long nehmen und dort die 3 Register ablegen.

      Overlay Offset 0 = r8
      Overlay Offset 1 = r9
      Overlay Offset 2 = RAMPZ

      Das letzte Byte bleibt 0.

      Oder der Einfachheit wegen die 3 Bytes als Hex ausgeben.
      Zuerst RAMPZ, dann R9, dann r8 jeweils hintereinander ohne CR.
    • R8 und R9 werden ja scheinbar nicht gelöscht. Ich setze die nun zu einer Neuen Adresse zusammen und Lese mit Cpeekh(Adresse,1) und voila, ich kriege meinen String.

      Im Bootloader

      Source Code

      1. ' Hier noch ein paar Daten für das Hauptprogramm
      2. Dataforapplication:
      3. Data "Bootloader: 1.0.0"

      Im Hauptprogramm

      Source Code

      1. Dim Loaderadresse As Word
      2. Loaderadresse = Makeint(r8 , R9)
      3. Dim Bootloader_version As String * 17
      4. Sub Loader_version
      5. Local X As Word
      6. Local Element As Byte
      7. Element = 0
      8. For X = Loaderadresse To Loaderadresse + &H10
      9. Element = Cpeekh(x , 1 )
      10. Bootloader_version = Bootloader_version + Chr(element)
      11. Next X
      12. If Left(bootloader_version , 11) <> "Bootloader:" Then Bootloader_version = "Bootloader: ---"
      13. End Sub
      Display All
      Kann man das so machen?

      Gruß, Martin
    • Pac-Man wrote:

      Dim R_8 As Long : Dim R_9 As Long : Dim Ra As Long
      Eigentlich meinte ich ein Long für alle Register-Bytes (RAMPZ, r8 und rp) und nicht für jedes Register ein Long.
      Oder ein Word für r9 und r9 als Adresse.


      Pac-Man wrote:

      R8 und R9 werden ja scheinbar nicht gelöscht. I
      Das hatte ich ja bereits in einem früheren Post geschrieben.

      Pac-Man wrote:

      Ich habe RAMPZ nicht selbst gesetzt.
      Ja du nicht. Sondern das macht der Restore im Bootloader.

      Wie du siehst gehört dann der RAMPZ zur Adresse dazu.
      Die Adresse müsste in deinem Fall eigentlich 01FD74 lauten.


      Pac-Man wrote:

      Kann man das so machen?
      Das sollte eigentlich der Read-Befehl machen.
      Aber wie du siehst funktioniert es wohl. mit CPeak. Das verwendet allerdings nur Word-Adressen, kann also lt. Bascomhilfe nicht auf Speicherbereiche oberhalb von FFFF zugreifen.
      Die Adresse ist ja 01FD74 und nicht FD74.
      Aber wer weiß, vielleicht wird ja das RAMPZ auch verwendet.

      Du kannst ja mal die gegenprobe machen und RAMPZ auf 0 setzen vor dem Read, ob es dann auch geht.

      Ich personlich würde übrigens das Read vorziehen. Und nicht per Hand den String auslesen wollen.
    • Hab mal die Anregung von Pluto umgesetzt..

      Im Bootloader

      Source Code

      1. Const Loaderversion = "Bootloader: 1.0.0.0.0.1.xyz"
      2. Const Versionslaenge = Len(loaderversion)
      3. .
      4. .
      5. .
      6. .
      7. .
      8. Dataforapplication:
      9. Data Versionslaenge
      10. Data Loaderversion

      Im Hauptprogramm

      Source Code

      1. Sub Loader_version
      2. Local X As Word
      3. Local Element As Byte
      4. Element = Cpeekh(loaderadresse , 1 ) 'länge des string
      5. For X = Loaderadresse + 1 To Loaderadresse + Element '+1 um die 0 nach länge zu überspringen
      6. Element = Cpeekh(x , 1 )
      7. Bootloader_version = Bootloader_version + Chr(element)
      8. Next X
      9. End Sub
      Display All
      Jetzt ist die Länge des Strings variabel.

      Vielen Dank an alle, hab sehr viel über Speicher und Zugriffe gelernt.

      Gruß, Martin
    • Es könnte nun noch sein das da nichts steht (FF) dann würde es 256 Zeichen einlesen. Vielleicht besser nach der 0 suchen und nicht mehr einlesen als der Bootloader_version lang ist. z.B
      Dim Bootloader_version*23 as sString
      ...
      For X= Loaderadresse To Loaderadresse + 23
      ...
      if element=0 then
      exit for
      else
      ...
      So bräuchte der Bootloader seine Versionslänge nicht zu zählen. Und die Main würde ihren String nicht überfüllen.