Saját bootloader

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
HPMaster
Bitmanipulátor
Hozzászólások: 129
Csatlakozott: 2008. március 10. hétfő, 6:00
Tartózkodási hely: Budapest IX. ker

Saját bootloader

HozzászólásSzerző: HPMaster » 2017. július 3. hétfő, 20:07

Sziasztok Urak!

Szeretnék kérni némi iránymutatást a bascom saját bootloaderének kezeléséhez.
Az egyszerűség kedvéért maradjunk Delphi-nél.
A chipre feltöltött bootloaderen keresztül szeretném feltölteni a hex vagy bin állományomat a szintén saját, a procival eleve kommunikáló, Delphiben megírt felhasználói szoftverből; de nem igen jövök rá, hogy hogyan kellene kezelnem magát a bootloaderrel való kommunikáció folyamatát.

Alapbeállításként baud=38400-on kapcsolódok a procihoz, természetesen a feltöltés a bascom-on keresztül minden probléma nélkül működik. Tehát az alapok stabilak.
A Delphi-s oldal is megy, tudom kezelni a file megnyitást, a darabolást olyan szeletekre, amelyek a bootloadernek kellenek, stb.

A kédésem az, hogy ha megvan a bootloader a procin, de már van rajta működő program, akkor mi a teendőm, ha menet közben szeretném frissíteni a procimon a programot? Azt is tudom (a bootloader alapján), hogy egy általam kiadott soros paranccsal el tudom ugratni (pl.: M328P proci esetén) a procit a bootloader szekcióhoz GOTO $h3800 paranccsal. (Esetleg valakinek egy ennél egyszerűbb reset megoldás?)

Ezután mi a folyamat? Vagy, az egyszerűség kedvéért egy "üres" proci esetén, amin csak a bootloader van fent?
1) Milyen byte-okkal vezérlek?
A bootloaderben látom:
- 1: start of heading, PC is ready to send;
- 4: end of transmission , file is transmitted
- 123-al és 124-el is kilép a DO ciklusból; (mi a különbség?)
- minden másra: Exit Do ' no valid data
2) Mit válaszol? Én erre mit válaszolok??
2) Mekkora darabokban küldöm a feltöltendő programot?
3) A hex-et, vagy a bin-t küldöm? (Bár nyilván a BIN-t, hiszen a bascom külső bootloader programja is a BIN-t kéri)

Bízom benne, hogyg tudtok segíteni.
Nyilván nem konkrét Delphi-s programsorok érdekelnek, hanem a folyamat...

Előre is köszönöm a hozzászólásokat.

Avatar
HPMaster
Bitmanipulátor
Hozzászólások: 129
Csatlakozott: 2008. március 10. hétfő, 6:00
Tartózkodási hely: Budapest IX. ker

Re: Saját bootloader

HozzászólásSzerző: HPMaster » 2017. július 4. kedd, 19:44

A Bootloader tanulmányozása alapján arra jutottam, hogy a sok szakirodalomban említett 132byte-os csomagok igazából 131byte-osak...
Bár nem értem miért.

Alább a kommentjeim, amelyekre a progi működése alapján következtetek:
(A Bootloader.bas vonatkozó része a "Cdebug"-októl és felesleges villogtatásoktól megtisztítva)


Kód: Egész kijelölése

Bstatus = Waitkey()                                         ' Várjuk a loader által küldött '123' vagy '124' byte-ot (123-FLASH; 124-EEPROM)

Print Chr(bstatus);                                                    ' Visszajelezzük a loadernek, hogy a byte -ot megkaptuk (ez a 123 látszik a BASCOM-ban MCS Bootloader esetén)

' Itt ugrunk a loader szekcióhoz.
If Bstatus = 123 Then                                       'did we received value 123 ?
   Bkind = 0                                                'normal flash loader
   Goto Loader
Elseif Bstatus = 124 Then                                   ' EEPROM
   Bkind = 1                                                ' EEPROM loader
   Goto Loader
Elseif Bstatus <> 0 Then
   Decr Bretries
   If Bretries <> 0 Then Goto Testfor123                    'we test again
End If

Goto _reset                                                 ' A RESET csak akkor következik be, ha nem érkezett '0'-tól nagyobb érték


'this is the loader routine. It is a Xmodem-checksum reception routine
Loader:
  Do
     Bstatus = Waitkey()                      ' itt mit várunk??
  Loop Until Bstatus = 0

  If Bkind = 0 Then
     Spmcrval = 3 : Gosub Do_spm                            ' erase  the first page
     Spmcrval = 17 : Gosub Do_spm                           ' re-enable page
  End If

Bretries = 10                                               'number of retries

Do
  Bstarted = 0                                              ' we were not started yet
  Csum = 0                                                  'checksum is 0 when we start
  Print Chr(nak);                                           ' firt time send a nack (Visszajelzés a procitól)
  Do

    Bstatus = Waitkey()                                     'wait for statuse byte

    Select Case Bstatus
       Case 1:                                              ' start of heading, PC is ready to send
            Incr Bblocklocal                                'increase local block count (a legelső = 1)
            Csum = 1                                        'checksum is 1
            Bblock = Waitkey() : Csum = Csum + Bblock       'get block (ezt már a BIN-ből veszi? ha igen, akkor ez a legelső byte-ja a BIN-nek?)
            Bcsum1 = Waitkey() : Csum = Csum + Bcsum1       'get checksum first byte
            For J = 1 To 128                                'get 128 bytes
              Buf(j) = Waitkey() : Csum = Csum + Buf(j)
            Next
            Bcsum2 = Waitkey()                              'get second checksum byte (ezt is a BIN-ből veszi?)
            If Bblocklocal = Bblock Then                    'are the blocks the same?
               If Bcsum2 = Csum Then                        'is the checksum the same?
                  Gosub Writepage                           'yes go write the page
                  Print Chr(ack);                           'acknowledge
               Else                                         'no match so send nak
                  Print Chr(nak);
               End If
            Else
               Print Chr(nak);                              'blocks do not match
            End If
       Case 4:                                              ' end of transmission , file is transmitted
             If Wrd > 0 And Bkind = 0 Then                  'if there was something left in the page
                 Wrd = 0                                    'Z pointer needs wrd to be 0
                 Spmcrval = 5 : Gosub Do_spm                'write page
                 Spmcrval = 17 : Gosub Do_spm               ' re-enable page
             End If
             Print Chr(ack);                                ' send ack and ready

             Portb.3 = 0                                    ' simple indication that we are finished and ok
             Waitms 20
             Goto _reset                                    ' start new program
       Case &H18:                                           ' PC aborts transmission
             Goto _reset                                    ' ready
       Case 123 : Exit Do                                   'was probably still in the buffer
       Case 124 : Exit Do
       Case Else
          Exit Do                                           ' no valid data
    End Select
  Loop
  If Bretries > 0 Then                                      'attempte left?
     Waitms 1000
     Decr Bretries                                          'decrease attempts
  Else
     Goto _reset                                            'reset chip
  End If
Loop


Ahol az én kérédéseim vannak az nem egészen világos. (A többi az többé-kevésbé...)
A CSUM változóba tényleg csak simán pakolássuk bele a byte-okat? (+1)

Valakinek ötlet?


Vissza: “Bascom-AVR nyelvű programozás (AVR programozásának lehetőségei)”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 6 vendég