Elektroda.pl
Elektroda.pl
X
PCBway
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Bootloader mikrokontrolera AT90S2313. Potrzebna składnia komend.

24 Sty 2006 22:24 4104 24
  • Poziom 9  
    Potrzebowal bym skladnie komend BootLoadera mikrokontrolera AT90S2313, oraz skladnia plikow stosowanych programatorach. Za pomoc bylbym wdzieczny!
  • PCBway
  • Poziom 21  
    Czesc Sinbad,
    zaluje, ze nie moge
    Ci pomoc. Zaintrygowal mnie tytul. Od pewnego czasu interesuje mnie bootloader. Mam taki jeden uklad w domu i za diabla nie wiem do czego on sluzy.
    Moglbys mi wytlumaczyc mozliwie przystepnie co to jest bootloader?
    Z gory dziekuje, moze taki pozytek z mego posta, ze wywlecze twoj na sama gore.
    Pozdrawiam, Kazik
  • Poziom 13  
    Nie wiem czy sie przyda ale mam opis bootloadera ale na ATmega8 oto on napisany w bascomie:

    Code:

    'Program Bootloadera (monitora) dla ATmega8 umożliwiający ładowanie
    'programu do pamięci Flash przez interfejs RS232 z prędkością 19200
    'bodów

    'Bity fuse należy ustawić, by na Bootloader było przeznaczonych 128
    'bajtów
    'Początek adresu programu Bootloadera: $F80

    'Fuse bity:       Wielkość:  Miejsce:    Bootloader:  Koniec:  Początek:
    'BOOTSZ1 BOOTSZ0
    '  1        1      128      $000 - $F7F  $F80 - $FFF    $F7F     $F80

    'Bootloader pobiera plik w standardzie Intel HEX
    'Przykład pliku HEX:
    ':Size Address Type Data Bytes      Checksum
    ':10 00 00 00 26 C0 B3 C0 B3 C0 B3 C0 B3 C0 C5 C0 C5 C0 D0 C0  A4
    ':10 00 10 00 DB C0 E4 C0 ED C0 30 31 32 33 34 35 36 37 38 39  E7
    '...
    '...
    ':10 05 30 00 55 DF 08 95 57 E5 57 DF 52 E5 55 DF 54 E5 53 DF  A2
    ':10 05 40 00 5C E2 51 DF 53 2F 52 95 49 DF 53 2F 47 DF 01 D0  33
    ':0B 05 50 00 08 95 5D E0 48 DF 5A E0 46 DF 08 95 A2    DC
    ':00 00 00 01                                                     FF

    $regfile = "m8def.dat"                                      'informuje kompilator o pliku
           'dyrektyw mikrokontrolera
    $crystal = 8000000                                          'informuje kompilator
           'o częstotliwości oscylatora
           'taktującego mikrokontroler
    Const Ramend_lo = $5f                                       'ustawienie adresu końca pamięci
           'RAM
    Const Ramend_hi = $04
    Const Pagesize = 32                                         'rozmiar strony pamięci Flash
           'w słowach
    'definicje zmiennych
    !.def Tmp_reg = R16                                         'rejestr tymczasowy
    !.def Hex_reg = R17                                         'rejestr przeliczeniowy HEX
    !.def Ser_reg = R18                                         'rejestr będący buforem
           'szeregowym
    !.def SPM_reg = R19                                         'tymczasowy rejestr dla rozkazu
           'SPM
    !.def Rec_size = R20                                        'numer bajtu danych w linii
           'pliku HEX
    !.def Chk_sum = R21                                         'przechowuje sumę kontrolna

    'początek programu umożliwiającego wywołanie Bootloadera
    Config Pinb.1 = Input                                       'linia PB1 jako wejściowa

    S1 Alias Pinb.1                                             'przypisanie nazwie Pinb.1
           'nazwy S1
    Set Portb.1                                                 'dołączenie do linii PB1
           'rezystora podciągającego
    Do                                                          'nieskończona pętla Do...Loop
     If S1 = 0 Then                                             'jeśli naciśniety przycisk S1, to
      Waitms 25                                                 'opóźnienie 25 ms dla eliminacji
           'drgań styków
      If S1 = 0 Then                                            'sprawdzenie ponownie, czy S1
           'jest naciśniety, jeśli tak, to
       JMP $F80                                                 'skok do programu Bootloadera
      End If                                                    'koniec warunków
     End If
    Loop                                                        'koniec nieskończonej pętli
    End                                                         'koniec programu

    '*********************************************************************

    'Początek Bootloadera napisanego w asemblerze

    $boot = $f7f                                                'ustawienie wektora Boot na
           'adres F7F, od tego adresu
           'zostanie załadowany do pamięci
           'program Bootloadera
     NOP                                                        'instrukcji NOP

    Disable Interrupts                                          'wyłączenie globalnych przerwań

    _bootloader_start:                                          'początek Bootloadera
     LDI   Tmp_reg, Ramend_Hi                                   'wpisanie do Tmp_reg górnej
           'wartości adresu pamięci SRAM
     !OUT   SPH, Tmp_reg                                        'ustawienie bardziej znaczącego
           'bajtu wskaźnika stosu
     LDI   Tmp_reg, Ramend_Lo                                   'wpisanie do Tmp_reg dolnej
           'wartości adresu pamięci SRAM
     !OUT   SPL, Tmp_reg                                        'ustawienie mniej znaczącego
           'bajtu wskaźnika stosu
     LDI   Tmp_reg, $00                                         'wpisanie do Tmp_reg ustawienia
     'usartu
     !OUT   UCSRA, Tmp_reg                                      'ustawienie USARTu
     LDI   Tmp_reg, $18                                         'wpisanie do Tmp_reg następnych
           'ustawień USARTu
     !OUT   UCSRB, Tmp_reg                                      'ustawienie USARTu
     LDI   Tmp_reg, $86                                         'wpisanie do Tmp_reg następnych
           'ustawień USARTu
     !OUT   UCSRC, Tmp_reg                                      'ustawienie USARTu
     LDI   Tmp_reg, $00                                         'wpisanie do Tmp_reg bardziej
           'znaczącego bajtu, który określa
           'prędkość
     !OUT   UBRRH, Tmp_reg                                      'ustawienie USARTu
     LDI   Tmp_reg, 25                                          'wpisanie do Tmp_reg mniej
           'znaczącego bajtu, który określa
           'prędkość
     !out   UBRRL,tmp_reg                                       'ustawienie USARTu
     CLT                                                        'zerowanie flagi T, użytej do
           'wskazania końca pliku HEX
    _send_boot_msg:                                             'wysyła znak B oznaczający start
           'Bootloadera
     LDI   Ser_reg, Asc("B")                                    'wpisanie znaku B do Ser_reg
     RCALL _send_ser                                            'wysłanie znaku B przez RS232

    _read_lines:                                                'odczytuje linie z szeregowego
           'interfejsu RS232 do pamięci
           'SRAM
     RCALL _receive_hex_line                                    'otrzymanie pojedynczej linii
           'zapisanej do pamięci SRAM
    _parse_line:                                                'dekoduje wybrana linie HEX
     LDI   XH, $01                                              'początek linii, bardziej
           'znaczący bajt, od $0100
     LDI   XL, $00                                              'początek linii, mniej znaczący
           'bajt
     CLR   Chk_sum                                              'wyzerowanie rejestru sumy
           'kontrolnej dla tej linii
    _read_header:                                               'odczytuje dane
     LD    Tmp_reg, X+                                          'pierwszym otrzymanym znakiem
           'powinien być znak :
     CPI   Tmp_reg, Asc(":")                                    'porównanie czy otrzymano : i
           'ustawienie flagi błędu
     BREQ  _header_ok                                           'odczytanie kolejnego rekordu

    _header_err:                                                'jeśli nie otrzymano :
     LDI   Ser_reg, Asc("!")                                    'wpisanie znaku błędu !
     RCALL _send_ser                                            'wysłanie znaku błędu

    _header_ok:                                                 'odczyt następnego rekordu
    _read_record_size:                                          'odczytanie danych wybranej
           'linii
     RCALL _char_to_byte                                        'wywołanie podprogramu konwersji
           'znaku na bajt
     MOV   Rec_size, Hex_reg                                    'zapis numeru bajtu w tej linii
     TST   Rec_size                                             'test, czy rekord ma wartość 0
           'dla tej linii
     BRNE _read_address                                         'jeśli nie, to nie koniec linii
           'i kontynuacja odczytu
     !SET                                                       'ustawienie flagi T kiedy
           'wskazywana jest ostatnia strona
     RJMP _write_current_page                                   'koniec linii, zapisanie
           'aktualnej strony i wyjście do
           'głównego programu
    _read_address:                                              'odczytanie bajtu bardziej
           'i mniej znaczącego adresu
           'i zapis do ZH/ZL
     RCALL _char_to_byte                                        'wywołanie podprogram konwersji
           'znaku na bajt
     MOV   ZH, Hex_reg                                          'wpisanie do ZH strony z bajtem
           'bardziej znaczącym adresu
     RCALL _char_to_byte                                        'wywołanie podprogramu konwersji
           'znaku na bajt
     MOV   ZL, Hex_reg                                          'wpisanie do ZH strony z bajtem
           'mniej znaczącym adresu
    _read_record_type:                                          'odczyt typu rekordu linii
     RCALL _char_to_byte                                        'wywołanie podprogramu konwersji
           'znaku na bajt
    _read_data_pairs:                                           'odczyt pozostałych bajtów
           'danych
     RCALL _char_to_byte                                        'wywołanie podprogramu konwersji
           'znaku na bajt
     MOV   R0, Hex_reg                                          'zapisanie w R0 mniej znaczącego
           'bajtu strony zapisanej
           'w buforze
     RCALL _char_to_byte                                        'wywołanie podprogramu konwersji
           'znaku na bajt
     MOV   R1, Hex_reg                                          'zapisanie w R1 bardziej
           'znaczącego bajtu strony
           'zapisanej w buforze
    _store_word:                                                'zapisanie aktualnych R1/R0
           'słowa w stronie bufora pod
           'odpowiednim adresem
     LDI   Spm_reg, 1                                           'włączenie SPM (Enable (SPMEN))
     RCALL _exec_spm                                            'wykonanie aktualnego SPM

    _check_byte_count:                                          'sprawdzenie, czy było to
           'ostatnie słowo linii
     SUBI  Rec_size, 2                                          'zmniejszenie Rec_Size o dwa
           'bajty
     BREQ _read_checksum                                        'po zapisie danych czytana jest
           'suma kontrolna
     SUBI  ZL, $FE                                              'gdy dane jeszcze nie zapisane,
           'to inkrementowane dwa mniej
           'znaczące bajty adresu
     RJMP  _read_data_pairs                                     'odczytanie następnych dwóch
           'znaków

    _read_checksum:                                             'sprawdza sumę kontrolna
           'następnej linii
     RCALL _char_to_byte                                        'wywołanie podprogramu konwersji
           'znaku na bajt
     BREQ  _checksum_ok                                         'jeśli 0, to suma kontrolna
           'prawidłowa

    _checksum_err:                                              'jeśli suma kontrolna
           'nieprawidłowa lub inny
           'znaleziony błąd, to
     LDI   Ser_reg, Asc("!")                                    'wpisanie znaku ! będącego flagą
           'błędu
     RCALL _send_ser                                            'wysłanie załadowanego znaku

    _checksum_ok:
    _chk_page_full:                                             'sprawdza, czy strona jest pełna
     MOV   Tmp_reg, ZL                                          'wpisanie mniej znaczącego bajtu
     'adresu Do Tmp_reg
     ANDI  Tmp_reg, ((Pagesize - 1 )*2)                         'iloczyn logiczny z wielkością
           'strony
     CPI   Tmp_reg, ((Pagesize - 1 )*2)                         'porównanie z wielkością strony
           'dla tego adresu
     BRNE  _read_lines                                          'strona bufora nie jest pełna,
           'odczyt następnej linii
    _write_current_page:                                        'zapis aktualnej strony
    _erase_page:                                                'wyczyszczenie strony
     LDI   Spm_reg, 3                                           'odblokowanie SPM
     RCALL _exec_spm                                            'wykonanie SPM

    _write_page:                                                'zapisuje stronę
     ANDI  ZL, $C0                                              'zapewnienie, że bity Z5...Z0 są
           '0
     LDI   Spm_reg, 5                                           'zapis strony i odblokowanie SPM
     RCALL _exec_spm                                            'wykonanie SPM

    _enable_page:                                               'włączenie strony dla sekcji
           'Read-While-Write
     RCALL _wait_spm                                            'sprawdzenie, czy zapis kompletny
     LDI   Spm_reg, 11                                          'ustawienie tylko RWWSRE i SPMEN
     RCALL _exec_spm                                            'wykonanie SPM

    _check_end_of_file:                                         'sprawdzenie, czy to nie jest
           'koniec pliku
     BRTC  _read_lines                                          'jeśli nie jest to ostatnia
           'strona, to kontynuacja odczytu
           'linii

    _exit_bootloader:                                           'wyjście z programu Bootloader
     JMP $0000                                                  'skok do wektora Reset

    '********************************************************************
    _send_ser:                                                  'wysyła znak przez RS232
     SBIS  UCSRA,UDRE                                           'sprawdza, czy rejestr nadawczy
           'USARTu jest pusty
     RJMP  _send_ser                                            'jeśli nie, to czekaj
     !OUT   UDR,ser_reg                                         'wysłanie znaku
     RET                                                        'koniec podprogramu

    '********************************************************************
    'pobiera jedna linie przez RS232 i zapisuje ją od początku pamięci
    'SRAM
    _receive_hex_line:
     LDI   XH, $01                                              'ustawienie wskaźnika do SRAM na
           'adres $0100
     LDI   XL, $00                                              'powyżej są wszystkie rejestry

     LDI   Ser_reg, Asc("?")                                    'ładuje znak ? dla żądania
           'następnego znaku
     RCALL _send_ser                                            'wywołanie podprogramu wysłania
           'znaku

    _receive_hex_line_char:                                     'pobiera znak z USARTu i dodaje
           'go do bufora
     SBIS  UCSRA, RXC                                           'sprawdza, czy otrzymano znak
           'z USARTu
     RJMP  _receive_hex_line_char                               'jeśli nie, to ponowne
           'sprawdzenie
     IN    Tmp_reg, UDR                                         'zapisanie otrzymanego znaku do
     'tmp_reg
    ' MOV   Ser_reg, Tmp_reg    'echo dla kontroli odebranych
           'znaków
    ' RCALL _send_ser     'wywołanie podprogramu wysłania
           'znaku

     CPI   Tmp_reg, 13                                          'porównanie otrzymanego znaku
           'z CR,
     BREQ  _receive_hex_line_end                                'jeśli taki sam, to koniec
           'linii,
     ST    X+, Tmp_reg                                          'w przeciwnym razie zwiększenie
           'wskaźnika buforu
     RJMP  _receive_hex_line_char                               'i odczytanie następnego znaku

    _receive_hex_line_end:                                      'linia wykonywana, gdy koniec
           'linii
     RET                                                        'powrót z tego podprogramu

    '********************************************************************
    'pobiera dwa znaki z bufora, dodaje sumę kontrolna i zwraca rezultat
    'zamiany znaków na bajty w Hex_reg
    _char_to_byte:
     LD    Hex_reg, X+                                          'wpisanie znaku do Hex_reg
           'i zwiększenie X
     SUBI  Hex_reg, $41                                         'odjęcie znaku ASCII $41, (A)
     BRCC  _char_to_byte1                                       'skok, gdy wartości są większe
           'od $41,
     SUBI  Hex_reg, $F9                                         'gdy nie większe, to odejęcie
           '$F9
    _char_to_byte1:
     SUBI  Hex_reg, $F6                                         'odjęcie $F6
     LSL   Hex_reg                                              'przesunięcie bitów w Hex_reg o
     LSL   Hex_reg                                              '4 pozycje w lewo
     LSL   Hex_reg
     LSL   Hex_reg
     LD    Tmp_reg, X+                                          'pobranie następnego znaku
     SUBI  Tmp_reg, $41                                         'odjęcie znaku ASCII $41, (A)
     BRCC  _char_to_byte2                                       'skok, gdy wartości są większe
           'od $41,
     SUBI  Tmp_reg, $F9                                         'gdy nie większe, to odjęcie $F9
    _char_to_byte2:
     SUBI  Tmp_reg, $F6                                         'odjęcie $F6

     ADD   Hex_reg, Tmp_reg                                     'dodanie Tmp_reg do Hex_reg
     ADD   Chk_sum, Hex_reg                                     'dodanie do sumy kontrolnej
           'Hex_reg
     RET                                                        'powrót z podprogramu

    '********************************************************************
    _exec_spm:                                                  'wykonuje rozkaz SPM
     !OUT   SPMCR, Spm_reg                                      'wysłanie do SPM wartości
           'Spm_reg
     SPM                                                        'rozkaz SPM

    _wait_spm:                                                  'sprawdzenie, czy zapis do
           'pamięci Flash kompletny
     IN    Spm_reg, SPMCR                                       'pobranie do Spm_reg SPM
     SBRC  Spm_reg, SPMEN                                       'sprawdzenie, czy SPM Enable
           'flaga jest wyzerowana
     RJMP  _wait_spm                                            'jeśli nie, to czekanie aż flaga
           'będzie wyzerowana
     RET                                                        'flaga wyzerowana, powrót
           'podprogramu
    '********************************************************************


    jedyna dodatkowa rzecza jest podłaczenie przycisku do do portu PB1 do masy. poniewaz zwarcie tego pinu do masy bedzie podowalo uaktywnienie sie bootloadera. kolejną rzecza jest ustawienie bitów Fuse BOOTSZ0 i BOOTSZ1 na wartość 1 czyli okreslnoy zostanie obszar zajmowany przez niego w pamięci Flash na 128 słów od adresu &HF80.
    Jezeli juz zaladowalismy bootloadera do procesora i chcemy wgrac jakis program przez niego nalezy przejsc do terminala.Oczywiscie najpierw musimy ustawic w nim pretkosc na 19200bodów poniewaz z taka pretkoscia bedze pracowal nasz uklad. jezeli mamy juz wszytko gotowo i odpalony terminal napiskamy przycis S1 czyli zwieramy pin PB1 do masy w terminalu powinnismy dostac sgloszenie sie bootloadera co sygnalizuje nam pokazanie sie B? w oknie terminala teraz mozemy za pomoca File->Upload file po wybraniu tego polecenia pc zaczyna wysylac plik w postaci hex ktory wczesniej musielismy juz przygotowac. w oknie teriminala powinnismy dostawac znaki zapytania co oznacza ze bootloader jest gotowy na odbior kolejnych porcji plku. Po zaladowaniu porgramu mikrokontroler nalezy zresetowac, po czym program powinien juz zacząć działać.
  • PCBway
  • VIP Zasłużony dla elektroda
    @desa :arrow: To co zamieściłeś, jest de facto w asemblerze, tyle, że przepisane do składni Bascoma. Najprostsze przykłady bootloadera są w pdf-ach układów AVR mających wbudowane wsparcie dla tej metody programowania (ATmega, część ATtiny).
    Sinbad23 napisał:
    Potrzebowal bym skladnie komend BootLoadera mikrokontrolera AT90S2313, oraz skladnia plikow stosowanych programatorach. Za pomoc bylbym wdzieczny!

    Kolega chyba nie ma pojęcia o czym pisze ?
    1. Ten mikrokontroler nie obsługuje programowania bootloaderem, gdyż nie ma wbudowanych rozkazów, ani rejestrów, służących do samoprogramowania pamięci programu.
    2. Pliki to pojęcie umowne i w PC oznacza ono logiczny i spójny z pewną strukturą układ danych na ich nośniku. Programator nie jest nośnikiem danych oraz jest to pojęcie ogólne, oznaczające samodzielne urządzenie zdolne do programowania. Konsekwencją tegoż jest wątpliwa sensowność zapytania, pomijając jego niegramatyczność.
    Jakieś konkretniejsze pytania ?
  • Poziom 9  
    :arrow:Light-I
    Te jak mowisz pytania bezsensowne zadal mi moj wykladowca i musze to opracowac. Tak w najprostrzym skrocie jakbys mi mogl wyjasnic co to jest Bootloader i wlasnie pokazal mi te proste przyklady takich bootloaderow to bylbym wdzieczny. Wiem ze zajmuja jakasc czesc pamieci flesh. Za pomoc bylbym naprawde wdzieczny!
  • Użytkownik usunął konto  
  • Poziom 9  
    Czyli jako programisci mamy dostep do tej pamieci. Czy ona tylko raz jest programowana przez producenta i my nie mamy na nia wplywu, czy jednak mozemy w niej grzebac i dostosowac ja dla swoich potrzeb.
    W µC AVR pamięć bootloadera jest zapisywalna przez uzytkownika. Uzytkownik równiez mże włączyć zabezpieczenia przed nadpisaniem obszaru bootloadera załadowanym programem, jak i również odczytania zawartości tej pamięci. W każdym przypadki bootloader może być samodzielnie napisany przez użytkownika i za pierwszym razem zaprogramowany programatorem.
  • Poziom 32  
    Bootloader jest jak każda inna aplikacja umieszczona w pamięci programu od specjalnego wektora, którego wartość wybiera się przez ustawienie odpowiednich bezpieczników. Sam bootloader ma generalnie za zadanie załadowania właściwej aplikacji programu w sposób określony przez programistę a nie standardowy programator ISP albo wysoko napięciowy programator równoległy. Przeważnie wykorzystuję się do tego interfej USART.
  • VIP Zasłużony dla elektroda
    Myślę, że należałoby spytać wykładowcę o dokładną treść pytań (nie wszystkie mikrokontrolery są przystosowane do implementacji bootloadera, oraz nie istnieje coś takiego jak "spis komend" - wszystko zależy od własnej inwencji programisty i mozna za każdym razem napisać coś innego.) i dopiero wtedy można by było się nad nimi zastanowić. Również nalezałoby się zastanowić, czy forum jest od odwalania w całości twojej pracy domowej - sporo informacji jest powszechnie dostępna za pomocą wyszukiwarek internetowych.
    Pozdrawiam, Daniel
  • Poziom 9  
    Ja nie mowie ze forum ma sluzyc do odwalania mojej pracy domowej ale chyba lepiej pozbierac informacje od kogos kto mial z tym kiedy kolwiek stycznośc niz czytac suche informacje. Nie rozumiem dlaczego nie kazdy mikrokontroler moze miec bootlodare zwasza ten mikrokontroler, ktory posiada pamięc Flesh. Przeciez w kazdym mozna napisac jakos sekwencje programowa, ktora po wlaczeniu mikrokontrolera za kazdym razem np sprawdza diody, sygnal dzwiekowy, czy wyswietlacz. Pprostu zajmujemy pewien obszar pamieci i tyle. Chyba ze musi posiadac cos co by automatycznie odwowywalo sie do tego obszaru pamieci gdzie ten program jest zapisany.

    Pozdrawiam Grzegorz
  • VIP Zasłużony dla elektroda
    Sinbad23 napisał:
    Nie rozumiem dlaczego nie kazdy mikrokontroler moze miec bootlodare zwasza ten mikrokontroler, ktory posiada pamięc Flash.
    Z tej prostej przyczyny, ze bootloader powinien być zdolny do programowania, a jeśli np. AT90S2313 nie ma rozkazu spm(Store Program Memory), to nic, pomimo największych chęci nie zapiszesz... W nowszych AVR jest poza tym wsparcie sprzętowe w postaci wydzielenia obszaru bootloadera od reszty pamięci programu (na jej końcu), gdzie można sobie kombinować z uprawnieniami zapisu i odczytu (Lockbits). Szczegóły jak zwykle w pdf-ach :
    http://www.atmel.com/dyn/products/datasheets.asp?family_id=607

    Pozdrawiam, Daniel
  • Poziom 42  
    Sinbad23 napisał:
    Nie rozumiem dlaczego nie kazdy mikrokontroler moze miec bootlodare zwasza ten mikrokontroler, ktory posiada pamięc Flesh. Przeciez w kazdym mozna napisac jakos sekwencje programowa, ktora po wlaczeniu mikrokontrolera za kazdym razem np sprawdza diody, sygnal dzwiekowy, czy wyswietlacz.
    Jeśli mikroprocesor jest w architekturze von Neumana, to zawsze można zapisać do pamięci RAM czy jakiekolwiek innej i skoczyć pod określony adres. Jeśli natomiast jest w architekturze Harvardzkiej to nie ma programowej możliwości wystawienia danych i adresów na liniach pamięci programu, do tego konieczny jest odpowiedni sprzęt i dodatkowe układy wewnątrz procesora. Operacje zapisu do pamięci flash np w procesorach atmel robi się specjalnym rozkazem, natomiast w procesorach microchip przy pomocy rejestrów które służą do zapisu pamięci eeprom.
  • Poziom 9  
    Poszukuje materiałow na temat składni komend - podanie kodu komendy i wymaganych parametrów, np. adresów, bloku danych, sum kontrolnych itp. Chodzi mi tu o taki ogolny opis zasad wykorzystania poleceń BootLoader w trybie ISP. Znalzłem ksiązke Mikrokontrolery AVR ATmega w praktyce Rafał Baranowski i nie wiem czy warto ja kupić, czy ona mi pomoże z tym Bootloaderem?
  • Poziom 27  
    Witam.
    Jesli ohodzi o praklyczna kwestie rozwiazania bootloadera to zamieszczam kod w ASM bootloadera dla Atmeg16. Do wgrania programu mozna wykorzystac darmowy AVRprog. Troche informacji mozna znalesc na stronie www.microsyl.com - jest tam kod bootloadera napisany w C i dodatkowo program do sciagniecia MegaLoad, ktory obsluguje tego bootloadera.
  • Poziom 9  
    Czy kazdy mikrokontroler ma swojego nie powtarzalnego Bootloadera czy moze miec kilka (chodzi tu mi o mikrokontrolery które moga mieć Bootloadery). I czym to sie rózni od normalnego napisanego programu czy Bascomie czy w C i wgranego do pamieci mikrokontrolera. czy sa jakies komendy, które wyrozniaja BootLoadera od innych programów?
  • Poziom 35  
    Bootloader to jest taki sam program jak każdy inny. Nie ma różnicy, w jakim języku jest napisany Bascom, C czy Asm. W czym byś to nie napisał to i tak, aby załadować program do mikroprocesora to musisz go zamienić na kod maszynowy. Czy każdy ma niepowtarzalny, to zależy, dla jakiej rodziny procesorów był napisany? Umiejętny programista napisze jeden dla całej rodziny mikroprocesorów i wtedy będzie identyczny. To wszystko kwestia programu a ten może być napisany dowolnie, wtedy nie będzie identyczny.
    Idea działania bootloadera jest taka ze w mikroprocesorze są zawarte funkcje, które umożliwiają procesorowi na dostęp do pamięci programu, na dokonywanie tam wpisów. Nie wszystkie mikroprocesory mają taką możliwość i stąd niektóre mają możliwość wgarnia bootloadera a niektóre nie. Czy są jakieś komendy..... ? I tak i nie.
    Tak, dlatego że musza zawierać komendy umożliwiające dostęp do pamięci programu bez nich program by był tylko zwykłym programem np. w przypadku AVR’ów smp.
    Nie, dlatego że w każdym innym programie, który nie jest bootloaderem też mogą wystąpić te komendy, choć celowości ich użycia nie mogę sobie wyobrazić.
  • Poziom 9  
    Pisząc program w C czy Bascomie czy ASM w czasie kompilacji tego programu każdy zostaje zamieniony na kod hex, który najcześciej wgrywamy do mikrokontrolera a wiec piszac program dla bootloadera w c czy w innym on tez po kompilacji zostaje zamieniony na kod hex wiec wydaje mi sie ze jest identyczny chyba ze rozkaz smp jest jakos inaczej interpretowany w tym kodzie. Troche nie rozumiem czemu ma służyc rozkaz skoku do pamięci programu (i gdzie ta pamięc sie znajduje) Jak mozemy zmieniac program, który jest już wgrany do mikrokontrolera. Bo dla mnie żeby zmienić program to trzeba go napisać od nowa i za pomoca programatora wgrać.
  • Poziom 35  
    Jeśli decydujesz sie na Bootloader to część pamięci jest dla niego zarezerwowana i zapewne rozkaz SMP nie mam możliwości nadpisania tej części.
    Cytat:

    Troche nie rozumiem czemu ma służyc rozkaz skoku do pamięci programu (i gdzie ta pamięc sie znajduje) Jak mozemy zmieniac program, który jest już wgrany do mikrokontrolera.

    To nie jest rozkaz skoku tylko rozkaz umożliwiający dostęp do pamięci programu np. do operacji zapisu lub odczytu.
    Jak możemy zmieniać to proste w mikrokontrolerze są dwa programy Bootloader i ten właściwy.
    Nigdy nie próbowałem przy pomocy Bootloadera wgrać Bootloadera ale to raczej jest nie wykonalne.
  • Poziom 25  
    Sinbad23 napisał:
    Potrzebowal bym skladnie komend BootLoadera mikrokontrolera AT90S2313....

    Dla 90S2313 to jest to niemożliwe w wypadku tego procesora a jeśli chodzi o inne układy rodziny AVR udostępniajace taką możliwość to w necie jest napradę sporo materiałów na ten temat począwszy na kodzie w C a smończywszy na asm. Odpowiedz jest może lakoniczna jednak tez\ przytaczanie strony linków tez byłoby bezsensowne.

    Bardzo dobrze opisany bootloader dla AVR jest w ksiązce "Mikrokontrolery AVR ATMEGA w praktyce" z kodem asm włącznie. Pliki są do ścignięcia ze strony wydawnictwa BTC, interfejs programowania to RS232.
  • Poziom 9  
    To zeby wgrac jakis inny program to musze posiadać bootloadera? A to dlaczego do ATtiny2313 wgrywam program, chodz ten nie posiada bootloadera. Czemu ma sluzyć ten cały bootloader. Przepraszam ze tak mecze ale nie moge zajazyc jaki on ma cel siedzac w mikrokontrolerze. Bo np jaki pisze jakis program to wiem co ma robic czym ma sterowac ale co takiego ma robic ten bootloader to nie moge skumać.
  • Poziom 13  
    Witam
    Bootloader to doskonałe narzędzie do zmiany wersji oprogramowania urządzenia. Jeśli urządzenie wyposażone jest w złącze RS-232, przez które komunikuje się z komputerem, aby przesłać dane lub przy pomocy, którego jest sterowane, to można przy pomocy tego samego złącza, bez konieczności wyjmowania mikroprocesora czy wyprowadzania dodatkowego złącza programującego, przeprogramować ten mikrokontroler. Po co przeprogramowywać? Po to, żeby wprowadzić poprawki do programu urządzenia, rozszerzyć funkcjonalność urządzenia na poziomie programu itp. Wszystko to może przeprowadzić użytkownik, który dostaje tylko plik od projektanta i nie jest wymagana od niego jakaś zaawansowana znajomość tematyki programowania procesorów, wpinania się gdzieś wgłąb układu...użytkownik uruchamia tylko odpowiedni program na komputerze, wgrywa nowy program do urządzenia i już jest szczęśliwym posiadaczem "nowego" urządzenia.
    Innym zastosowaniem bootloadera może być dostosowywanie się układu sterującego urządzenia zbudowanego na mikrokontrolerze z bootloaderem do podłączanych modułów (np. w modularnych systemach pomiarowych). W zależności od podłączonego modułu i jego funkcji można automatycznie wgrywać do mikrokontrolera odpowiedni program zapisany w pamięci znajdującej się na podłączanym module.
    Zastosowań pewnie można znaleźć wiele...bootloader to możliwość mikrokontrolera do samoprogramowania.
    Pozdrawiam
  • Poziom 9  
    Czyli jak mamy zastosowany w jakims tam urzadzeniu mikrokontroler, który ma mozliwosc obsługi bootloadera to nie potrzebujemy jakis tam specjalnych programatorów zeby zmienic program tylko wystraczy przez coma i odpowiedni program mikrokontroler sam pobierze aktualizacje. Czyli wsumie skraca sie nam droga bo mamy tylko urzadzenie i komputer, a tak jesli mikrokontroler nie posiada bootloadera musi być komputer - programator (jako urzadzenie) - urzadzenie docelowe z mikrokontrolerem.
  • Poziom 13  
    Jedynie do wgrania programu bootloadera w odpowiedni obszar pamięci programu mikrokontrolera potrzebny jest programator. Potem to już bootloader jest w stanie wgrać dowolny program przez COMa, właśnie tak jak mówisz. Jedyne co, to program bootloadera w mikrokontrolerze i program w komputerze muszę być ze sobą zgrane, żeby dobrze współpracować.
  • Poziom 9  
    A czy bootloader moze mieć zapisane oprócz tego ze sie aktualizuje np inne czynosci np zapalanie jakies diody załaczenia buzera. Np wyobrazmy sobie ze mamy wgrany program bootloadera ktory zapala jakos diode gdy cos sie dzieje np włamanie ale programista nagle zmienił i pomyslal ze zamiast swiecenia diody ma wlaczyc sie buzer. I teraz podłaczajac to urzadzenie z mikrokontrolerem które posiada bootloadera do komputera za pomoca RS232 sparwdza czy program sie nie zmienil i jesli tak sama aktualizuje to miejsce gdzie nastała zmiana, ale oprocz tego steruje tez innymi czynościami. Czy tylko bootloader sluzy do aktualizacji? A na urzadzenia sterujace musimy napisac inny program. I jak mozemy wgrac takiego bootloadera do mikrokontrolera, np za pomoca AVRstudio czy AVRPROG (chodzi mi tu o rodzine AVR), czy sa do tego juz inne programy?
  • Poziom 13  
    Bootloader to program jak każdy inny zapisywany do mikrokontrolera, więc nawet bootloader może sterować diodą, buzerkiem czy czymkolwiek.Ale jego zadaniem jest przeprogramowanie właściwego obszaru pamięci programu, czyli wgranie właściwego programu np. sterującego, a nie zaktualizowanie samego siebie, aktulizować może tylko program, który wykonywany jest podczas normalnej pracy urządzenia. W AVRach, przynajmniej tych znanych mi, nie ma możliwości przeprogramowania/zmiany części programu, trzeba nowy program wgrać w całości. Natomiast wprowadzenie obszaru bootloadera do mikrokontrolera daje w pewnym sensie taką możliwość, ponieważ podczas programowania przy użyciu bootloadera, zapisywany jest tylko obszar poza obszarem zajmowanym przez bootloader, a sam program bootloadera jest nienaruszalny, ale nie jest możliwe zminianie pojedynczych komórek programowanej pamięci programu bez naruszania innych. Obszar zajmowany przez bootloader jest programowany w sposób konwensjonalny (czyli programowanie przy użyciu zwykłych programatorów sprzętowych i programowych).
    Pozdrawiam