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
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ł.
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
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.
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...
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.
..co kawałek niżej w kodzie daje taki rezultat..
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.
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
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.
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
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.Jednym z ostatnich projektów jest samodzielny program do ładowania wsadów. Obsługuje MCS Bootloader i Mkbootloader.
Z jego pomocą można uaktualnić oprogramowanie w procesorze mając tylko plik Hex lub Bin. Nie jest potrzebny plik źródłowy.