MCS Bootloader aus Beispiel mit ATMEGA644PA

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

    • 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 Source Code

      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
      Display All


      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 Source Code

      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
      Display All

      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 wrote:

      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.