MCS Bootloader aus Beispiel mit ATMEGA644PA

    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!

    • MCS Bootloader aus Beispiel mit ATMEGA644PA

      Liebe Forumsmitglieder,

      ich versuche gerade meinem Bootloader um die Speicherlogic aus den Bascom-Beispielen zu erweitern.
      Ich benutzte einen ATMEGA644PA. Laut Datenblatt hat dieser pro Page 128 Words und insgesamt 256 Pages.

      Im Beispiel (das ja sogar den 644 voreingestellt hat Const Loaderchip = 644 ) wird Maxword wie folgt berechnet
      Const Maxword =(2 ^ Maxwordbit) * 2 '128
      wobei für den 644 Maxwordbit = 7 ist. Damit ist, so ich mich nicht verreichne, Maxword = 256.

      In dem Abschnitt Writepage wird nun eine Schleife von 1 bis 128 in 2er-Schritten durchlaufen und Wrd um je 2 erhöht. Das heißt Wrd wird am Ende 128 sein.
      Zeile 10 gibt es aber die Bedingung If Wrd = Maxword. Das kann ja nie erfüllt sein.

      BASCOM-Quellcode

      1. Writepage:
      2. If Bkind = 0 Then
      3. For J = 1 To 128 Step 2 'we write 2 bytes into a page
      4. Vl = Buf(j) : Vh = Buf(j + 1) 'get Low and High bytes
      5. ! lds r0, {vl} 'store them into r0 and r1 registers
      6. ! lds r1, {vh}
      7. Spmcrval = 1 : Gosub Do_spm 'write value into page at word address
      8. Wrd = Wrd + 2 ' word address increases with 2 because LS bit of Z is not used
      9. If Wrd = Maxword Then ' page is full
      10. Wrd = 0 'Z pointer needs wrd to be 0
      11. Spmcrval = 5 : Gosub Do_spm 'write page
      12. Spmcrval = 17 : Gosub Do_spm ' re-enable page
      13. Page = Page + 1 'next page
      14. Spmcrval = 3 : Gosub Do_spm ' erase next page
      15. Spmcrval = 17 : Gosub Do_spm ' re-enable page
      16. End If
      17. Next
      18. Else 'eeprom
      19. For J = 1 To 128
      20. Writeeeprom Buf(j) , Wrd
      21. Wrd = Wrd + 1
      22. Next
      23. End If
      24. Toggle Portb.2 : Waitms 10 : Toggle Portb.2 'indication that we write
      25. Return
      Alles anzeigen


      Im Datenblatt des 644PA steht:
      Device Flash size Page size PCWORD No. of pages PCPAGE PCMSB
      ATmega164A/ATmega164PA 8K words (16KBytes) 64 words PC[5:0] 128 PC[12:6] 12
      ATmega324A/ATmega324PA 16K words (32KBytes) 64 words PC[5:0] 256 PC[13:6] 13
      ATmega644A/ATmega644PA 32K words (64KBytes) 128 words PC[6:0] 256 PC[14:7] 14
      ATmega1284/ATmega1284P 64K words (128KBytes) 128 words PC[6:0] 512 PC[15:7] 15

      Also 128 Words pro Page. Im Beispiel werden aber nur 128 Byte (also 64 Word) gelesen (Zeile 15 bis 17).

      BASCOM-Quellcode

      1. Do
      2. Bblocklocal = 1
      3. Bstarted = 0 ' we were not started yet
      4. Csum = 0 'checksum is 0 when we start
      5. Print Chr(nak); ' firt time send a nack
      6. Do
      7. Bstatus = Waitkey() 'wait for statuse byte
      8. Select Case Bstatus
      9. Case 1: ' start of heading, PC is ready to send
      10. Csum = 1 'checksum is 1
      11. Bblock = Waitkey() : Csum = Csum + Bblock 'get block
      12. Bcsum1 = Waitkey() : Csum = Csum + Bcsum1 'get checksum first byte
      13. For J = 1 To 128 'get 128 bytes
      14. Buf(j) = Waitkey() : Csum = Csum + Buf(j)
      15. Next
      16. Bcsum2 = Waitkey() 'get second checksum byte
      17. If Bblocklocal = Bblock Then 'are the blocks the same?
      18. If Bcsum2 = Csum Then 'is the checksum the same?
      19. Gosub Writepage 'yes go write the page
      20. Print Chr(ack); 'acknowledge
      21. Incr Bblocklocal 'increase local block count
      22. Else 'no match so send nak
      23. Print Chr(nak);
      24. End If
      25. Else
      26. Print Chr(nak); 'blocks do not match
      27. End If
      28. Case 4: ' end of transmission , file is transmitted
      29. If Wrd > 0 And Bkind = 0 Then 'if there was something left in the page
      30. Wrd = 0 'Z pointer needs wrd to be 0
      31. Spmcrval = 5 : Gosub Do_spm 'write page
      32. Spmcrval = 17 : Gosub Do_spm ' re-enable page
      33. End If
      34. ' Waitms 100 ' OPTIONAL REMARK THIS IF THE DTR SIGNAL ARRIVES TO EARLY
      35. Print Chr(ack); ' send ack and ready
      36. Portb.3 = 0 ' simple indication that we are finished and ok
      37. Waitms 20
      38. Goto _reset ' start new program
      39. Case &H18: ' PC aborts transmission
      40. Goto _reset ' ready
      41. Case 123 : Exit Do 'was probably still in the buffer
      42. Case 124 : Exit Do
      43. Case Else
      44. Exit Do ' no valid data
      45. End Select
      46. Loop
      47. If Bretries > 0 Then 'attempte left?
      48. Waitms 1000
      49. Decr Bretries 'decrease attempts
      50. Else
      51. Goto _reset 'reset chip
      52. End If
      53. Loop
      Alles anzeigen

      Jetzt bin ich verwirrt. Müsste nicht die Schleife im Writepage-Abschnitt bis 256 gehen, respektive 128 Words zusammensetzten aus 256 Byte und gleichzeitig Maxword = 128 sein?
      Wäre toll, wenn mich Bascomanfänger jemand in die richtige Richtung schupsen könnte.
      Freundliche Grüße und schönes Wochenende
    • mlesy schrieb:

      In dem Abschnitt Writepage wird nun eine Schleife von 1 bis 128 in 2er-Schritten durchlaufen und Wrd um je 2 erhöht. Das heißt Wrd wird am Ende 128 sein.
      Zeile 10 gibt es aber die Bedingung If Wrd = Maxword. Das kann ja nie erfüllt sein.
      Wenn du 128 mal Wrd in der J-Schleife um jeweils 2 erhöhst, hast du am Ende 256, das passt doch.
      Die Bedingung in Zeile 10 ist damit im letzten Zweig der Schleife erfüllt.
    • Hallo,

      da die J-Schleife in 2er Schritten durchlaufen wird, passt es leider nicht.
      J=1 Wrd 0 ->2
      J=3 Wrd 2 ->4
      ...
      J=127 Wrd 126 ->128

      Oder soll/muss das writepage hier zweimal durchlaufen? Dann hätten doch aber auch gleich 256 Byte gelesen werden können.