• Email
  • Forum

Bootloader przez Bluetooth?

[Rozmiar: 28478 bajtów]

To łatwe!

Zastanówmy się do czego się to może przydać

Mając moduł za kilkanaście złotych i moduł Bluetooth w komputerze możesz podłączyć go do mikrokotrolera swojego projektu.
Może to być zdalnie sterowane autko. Nie dość tego, że możesz nim sterować i odczytywać nawet napięcie baterii to jeszcze możesz trzymając laptopa na kolanach wymienić w autku oprogramowanie gdy te stoi na podłodze na drugim końcu pokoju :D

I to wprost z edytora kodu programu! Bez osobnych programów.

Możesz też zbudować sterownik oświetlenia i zabudować go już pod sufitem. Nie dość, że możesz sterowac światłem w pokoju to możesz zmienić oprogramowanie w sterowniku (jakieś czasy, zalezności, logikę).Wszystko z biurka bez kabli i ekspresem. Możesz przeprogramować dowolny swój sterownik prosto z Edytora naciskając tylko przycisk "PROGRAM"
Przykłady możnaby mnożyć. Z fotela możesz zaprogramować coś co stoi na parapecie i tak dalej :D. To łatwe!

Po tym przewodniku zrozumiesz jakie to proste i dasz radę z każdym innym łączem(USB/MAX232/WIFI).

Ekspresem wyjaśnię co to jest Bootloader

Jest to drugi, mały program w mikrokontrolerze który potrafi podczas swojej pracy wpisać do procesora kod głównego programu.
Taki program musimy w mikrokontrolerze typu Atmega umieścić.
Teraz Twój mikrokontroler po włączeniu zasilania rozpoczyna pracę "czytając wgrany program od początku".
W zapisie szesnastkowym nie mamy tylko 10 znaków. Oprócz tych dziesięciu mamy też sześc liter.
Czyli po ciągu cyfr 0 1 2 3 4 5 6 7 8 i 9 mamy jeszcze A B C D E F co na końcu daje 16 i dlatego system się tak nazywa.
W dużym uproszczeniu teraz procesor zaczyna pracę od miejsca &H00. Chcielibyśmy żeby tak było dalej ale też musimy gdzieś mieć ten program Bootloadera i to tak, żeby nie przeszkadzał.
Wgrywamy go więc na samym końcu flasha.
Program Bootloadera też zajmuje miejsce. Ten z przykładu będzie zajmował 1024słow. Jeśli ma 1024 to żeby go wgrać musimy się od końca cofnąć o tyle żeby się zmieścił.

Na nasz program główny zostanie nam w tym przypadku mniej flasha, ale coś za coś

Procesory Atmega są do bootloaderów przygotowane. Jeśli zaznaczymy odpowiednią opcję w bitach konfiguracyjnych to przy starcie procesor skoczy pod określony adres w pamieci flash. Ten gdzie umieściliśmy nasz bootloader. Trzeba mu tylko pokazać gdzie go znajdzie.

Wiemy że nasz przykładowy Bootloader ma 1024 words. Są inne ale o tym na końcu.
Pomoże nam Nota aplikacyjna procesora. Z tabelki wyczytamy, że żeby zmieścić Bootloader o wielkości 1024 musimy go zacząć wpisywać pod adresem $3C00 dla Atmegi328P która ma większy flash, a pod adresem 0xC00 dla mniejszej Megi8

[Rozmiar: 21583 bajtów]

[Rozmiar: 19802 bajtów]

Tabelki pokazują też ustawienia bitów konfiguracyjnych BOTSZ0 i BOTSZ1
Te bity mówią procesorowi gdzie znajdzie Bootloader. Trzeci bit BOOTRST ustawiamy w procesorze i znaczy on właśnie że procesor prace podjąć ma z miejsca określonego przez te dwa pierwsze bity.

Do zmian bitów konfiguracyjnych i wgrania bootloadera potrzebujemy programatora.

[Rozmiar: 48530 bajtów]

Zauważ, że ustawienia różnią się dla tych dwóch procesorów.

Poniżej przykłady w Burn-o-mat i BASCOM AVR (kliknij by powiększyć)

[Rozmiar: 55381 bajtów]

[Rozmiar: 60540 bajtów]

Po ustawieniu bitów konfiguracyjnych procesor na początku pracy skoczy pod pod podany adres. Nic się nie stanie jeśli go tam nie będzie, ale też nic nie zyskamy. Potrzebujemy Bootloadera...

Program bootloadera

Podczas instalacji BASCOM do folderów "Moje dokument" ładowane są pliki "Samples" - przykładowe kody programów.
W folderze BOOT znajdziemy plik "bootloader.bas". Jest to rekomendowany dla początkujących plik. Po zrozumieniu zasady działania każdy może pójść dalej.
Po otwarciu pliku widać kilka gotowych konfiguracji dla różnych procesorów zakomentowanych za pomocą apostrofów. Odkomentowujemy tylko ten który nas interesuje..
Schody musza być, więc mojego procesora 328P nie było. Jeśli się jednak przyjrzeć to Atmega32 ma taki sam adres dla Bootloadera o wielkości 1024 słów. Przerobiłem więc szybko kod. Podmieniłem pliki DAT.
[Rozmiar: 10129 bajtów]
..co kawałek niżej w kodzie daje taki rezultat..

[Rozmiar: 10451 bajtów]

Teraz BARDZO WAŻNA UWAGA


W pliku trzeba określić prędkość transmisji na jakiej pracuje UART modułu Bluetooth

U mnie jest to $baud = 38400.. i oczywiście właściwą predkość taktowania procesora.

Podczas kompilacji otrzymamy komunikat że pamięć flash jest zajęta już w ~99%. Jest to normalne zjawisko. Programujemy swój procesor i jeśli wszystko przebiegnie pomyślnie to mamy w nim bootloader. Teraz trzeba już odłączyć programator i zmienić wybór programatora w IDE.

Najpierw sprawdzamy na jakim numerze portu pracuje Bluetooth w komputerze oraz we właściwościach ustawiamy tę samą prędkość jaką oferuje moduł BT. Po prostu, samo się nie ustawi a wszędzie musi być tak samo.

[Rozmiar: 102837 bajtów]

W ustawieniach BASCOM wchodzimy w zakładkę Programator i wybieramy MCS Bootloader. Wybieramy port COM który widniał przy połączeniu Bluetooth w Managerze Urządzeń Windowsa

[Rozmiar: 64615 bajtów]

Teraz w drugiej zakładce możemy wpisać jakąś własną komendę która będzie wysyłana do mikrokontrolera. Mikrokontroler po jej odebraniu zresetuje się sam bo tak będzie miał napisane w programie.

[Rozmiar: 64626 bajtów]

Pozostało pokazać jak zdalnie zresetować mikrokontroler, czyli umieszczamy kawałek kodu w swoim programie.

Sprawa jest nieskomplikowana. Bootloader będzie uruchamiany tylko podczas restartu mikrokontrolera. Sprawdzonym sposobem na restart jest uruchomienie Watchdoga z krótkim czasem. Nie zresetowany na czas po prostu zresetuje nam mikrokontroler. Jeśli w swoim projekcie uzywasz już Watchdoga to wiesz że jak program utknie po odebraniu komendy w tej pętli Do Loop też zresetuje mikrokontroler. Poniższy kod to tylko przykład. Każdy może to rozwiązać po swojemu. Wystarczy żeby uruchomić watchdoga po otrzymaniu komendy.

$regfile = "m32def.dat"
$crystal = 18432000
$baud = 38400
$hwstack = 64
$swstack = 16
$framesize = 128

Config Serialin = Buffered , Size = 20

Dim Command As String * 10 , Znak As Byte
Dim Command_timeout As Byte , Got_str As Byte

Enable Interrupts                                           'dla buforowanego UARTu potrzebne sa przerwania

'*** START ***
Do
 '---------------------------------------------------------------------
  'tutaj miejsce na normalny kod programu







 '---------------------------------------------------------------------
  'poniżej odbiór i analiza tego co nadeszło z USART

 If Ischarwaiting() > 0 Then            'jeśli w buforze czeka znak

  Znak = Inkey()
   Command_timeout = 50

   Select Case Znak
    Case 10                             'zignoruj
    Case 13 : Got_str = 1               'nadszedł Enter więc sprawdź komendę
    Case Else
     Command = Command + Chr(znak)      'jeśli to nie ENTER ani LF to dodaj do stringa
   End Select

   If Len(command) > 9 Then Got_str = 1 'zabezpieczenie by nie przepełnić zmiennej

   If Got_str = 1 Then

    If Command = "RST" Then
     Disable Interrupts                 'wylaczenie przerwan
     Start Watchdog                     'uruchomienie Watchdoga
     Do                                 'petla nieskonczona
     Loop                               'w niej czekamy na Reset
    End If

      Command = ""

    'end if Got_str
   End If

 End If

 If Command_timeout > 0 Then            'jesli nadeszły jakieś znaki
  Decr Command_timeout                  'pomału odliczaj

  'najwyraźniej to były błedne znaki więc usuń je i czekaj na poprawne

   If Command_timeout = 0 Then Command = ""
 End If

 Waitms 1                               'tylko na potrzeby tego kodu
                                        'by wolniej odliczało Timeout

Loop
End

Jest jeszcze sposób ze skokiem bezpośrednio do adresu Bootloadera. Przykładowy Bootloader wyłącza przerwania, ale należy pamiętać że nie każdy i wtedy trzeba to zrobić samemu.

Case 999
  GoTo &H3C00  'adres bootloadera
   `lub w Asemblerze
  JMP $3C00    'adres musi się zgadzać z Twoim procesorem

Teraz mamy Bootloader ale w środku nie ma programu i nie zresetuje nam procesora

Musisz za pierwszym razem zresetować procesor ręcznie. Naciskasz ikonkę programatora i pokaże się okienko takie jak na początku strony. Wtedy wciśnij reset. Jeśli się wgra to drugi reset ręczny nie będzie potrzebny.

Miłej zabawy. Coś pewnie poprawię i dopiszę później.
Email

Jeśli mogę w czymś pomóc, napisz.