Nowy soft przez USB/RS232 czyli BOOTLOADER


Witam. Do nowego projektu zainteresowałem się możliwością załadowania do procesora nowego uaktualnionego softu przez istniejące połączenie z komputerem. Okazało się to bardzo wygodne i nie takie straszne jak się za chwilę, mam nadzieje, okaże.
Jeśli masz płytkę testową z MAX232 dla COM lub FT232 dla USB->COM lub budujesz urządzenie które będzie miało możliwość komunikacji z komputerem to możesz załadować Bootloader i program "wgrywać" przez to łącze.
Użyłem do tego programu Bootloadera dostarczanego z Bascom`em i wbudowanej w Bascom jego obsługi.
Normalnie Twój program może wykorzystywać Port do tego do czego chcesz. Bootloader zajmuje go tylko przy resecie mikrokontrolera. Dzięki podłączeniu linii DTR poprzez MAX232 lub FT232 do pinu RESET można resetowac mikrokontroler "zdalnie". Jesli ktoś ma już RS podłączony to dołacza tylko ten szczegół.

FT232 podłączamy według noty producenta.

Teraz program Bootloadera. W katalogu z przykładowymi programami do Bascom znajduje się katalog BOOT. W nim wybieramy BootLoader.bas.
W środku są gotowe konfiguracje dla kilku procesorów które można "odkomentować" i użyć od razu. Mojego 328p akurat nie było więc musiałem doczytać resztę :)
Bootloader to program który jest umieszczany na końcu Flasha za programem głównym. W procesorach ATmega jest na niego przewidziane miejsce i w zależności od wielkości Flasha i wielkości samego Bootloadera jego kod zaczyna się pod konkretnym adresem. Z pomocą przychodzi Pdf z notą aplikacyjną. MCS bootloader (akurat ten, bo sa inne) ma rozmiar 1024. W nocie mamy wszystkie potrzebne informacje.

Okazuje się że ATmega 328p ma te same co ATmega32 ustawienia. To widać zależne od wielkosci Flasha. Przerobiłem więc na swoje potrzeby tylko jej konfigurację.

Daje to taką konfiguracje dalej w programie.

Kompilujemy taki bootloader i zapisujemy w mikrokontrolerze.
Teraz pozostało jeszcze ustawić FuseBity które sa odpowiedzialne za to czy mikrokontroler ma zaczynać prace od Bootloadera czy od Programu, jak przedtem. Ustawić też należy adres pod którym mikrokontroler znajdzie Bootloader.
Do pierwszego służy BOOTRST a do drugiego kombinacja BOOTSZ0 i BOOTSZ1. Wartości BOOTSZ są zależne od wielkości Bootloadera i można je odczytać z tabelki. Proszę jednak zauważyć że dla wielkości 1024 i procesora ATmega8 sa one inne niż dla mojego ATmega328p.

Tak więc u mnie zaznaczyłem tak i zaprogramowałem.

(EESAVE mam włączone by nie kasowało mi EEPROMU przy programowaniu - to dla mnie przydatne)

Teraz wystarczy w BASCOM ustawić sobie MCS Bootloader jako programator i możemy swoje programy wgrywać nie dotykając programatora :D
Ustawić trzeba tylko prędkość na te z programu Bootloadera i sygnał Resetu.

Życzę miłej zabawy :D
Myślę że to przydatne i wygodne jesli urządzenie można zaktualizować nie rozbierając go.
Wszystkie tu zebrane ustawienia przetestowałem ze skutkiem bardzo pozytywnym :D
Należy też wiedzieć i pamiętać, że:
1.Przy kompilacji Bootloadera pisze że wykorzystaliśmy 98% Flasha. To nic dziwnego. Wolne miejsce mierzone jest "do końca" Flasha, a adres pod którym wpisujemy Bootloader jest własnie bliski końcowi.
2. Bootloader wgrywa się długo, bo własnie zapisuje początek naszego Flasha FF`ami by pod koniec dopiero zapisać program.
3. Użycie programatora ISP do wgrania głównego programu kasuje Bootloader bo najczęściej programator automatycznie kasuje Flash metodą Bulk Erase. Metody na ominięcie tego sa conajmniej dwie. Pierwsza to dołączenie Bootloadera do programu głównego i wgrywanie ich razem. Druga to jednorazowe zaznaczenie opcji w programatorze "Disable automatic Flash erase when writing"..lub jeśli ma ktoś po polsku to już wie ;)




Portret użytkownika EDC

Bootloader ;)

Dziś miałem szczęście w nieszczęściu. Przez nieuwagę podłączyłem zasilacz do gniazda którym programuję płytkę testową. Uszkodziło mi pin zewnętrznego Resetu w procesorze. Zwarcie 60 Ohm do masy. Procesor nie startował bo miał ciągle 0V na tym pinie. Działał jednak jeszcze programator ISP. Zdecydowałem się poprzez FuseBit wyłączyć sygnał zewnętrznego Resetu. Od teraz nie mogę już przez ISP programować, ale procesor ożył :D
Bootloaderem można do niego wpakować co sie chce...ot taki przypadek.

-

BARTek
Moja strona

Portret użytkownika matrix

Re: Bootloader

Fajnie że ogarnąłeś bascomowy bootloader, tylko on ciut sporo waży Kolega Mirekk36 ma fajny bootloader który do działania potrzebuje ustawienia na 512 słów.
Ale gratulacje.

Portret użytkownika EDC

Odp. Bootloader

To było moje pierwsze podejście do tego tematu. Musiałem dołączyć MAX`a, przestawić Fusy i przerobić ciut Listing. Chciałem więc skalę trudności obniżyć i czytając to: 'IMPORTANT : Look at BOOTLOADER.BAS which is simpler ' wybrałem go :)
Teraz widze że dla ATmega8 jest tam Bootloader na 128 słów, a inne na 512. Reagują też na "magic word" czyli włączenie bootloadera wysyłając odpowiednią sekwencję na Port. Pobawie się później i dam znać. Narazie buduję coś ciekawego ;)

-

BARTek
Moja strona

Portret użytkownika matrix

Re: Bootloader

Bardzo chętnie poczytam jeśli się podzielisz.

Portret użytkownika EDC

ATmega przez FT232BL

Witam. Żeby nie być gołosłownym, a przy okazji sobie życie znów ułatwić podłączyłem dziś mikrokontroler przez USB i układ FT232BL. Taki akurat miałem luzem. Gdybym miał kupić to lepszy jest, nowszy, ulepszony FT232R. Potrzebuje on jeszcze mniej elementów zewnetrznych.
Ciekawostką jest to, że musiałem wstawić rezystory 1kOhm na liniach RX i TX pomiędzy ATmegą a FT232. Napięcie które wydaje z siebie FT232 zasilało mi bowiem ATmegę :D
Nie zdziwiło mnie to bardzo bo wiem że w środku ATmegi przy pinach są diody podłączone do VCC. Gdy przyłożymy napięcie wyższe od 5V ma to za zadanie, w celu ochrony pinu, odprowadzić tą nadwyżkę do zasilania.
Sterowniki do FT232 mam od zawsze ;) więc wykryło mi kolejny wirtualny port Com21. We własciwościach portu, w Menagerze urządzeń zmieniłem mu tylko prędkość z domyślnej 9600 na tą dla Bootloadera.
Wyjaśnię jeszcze jedno. Prędkość ta jest "polecana" dla mikrokontrolerów z ustawionym wewnętrznym oscylatorem. Nie jest obowiązkowa, czy wymagana. Po prostu - zalecana.
Po ustawieniu numeru portu dla programatora w Bascom bezproblemowo udało mi się wgrać nowy soft do Megi :D

-

BARTek
Moja strona

Portret użytkownika EDC

Własna aplikacja na Windows do sterownika na ATmega :D

Wiecie, że apetyt rośnie w miarę jedzenia? :D
Otóż, wczoraj rano wpadłem na pomysł, ze fajnie byłoby umieć napisać własna aplikację współpracującą z budowanym sterownikiem. Wczoraj nie miałem jeszcze o tym żadnego pojęcia. Trochę powęszyłem i ściągnałem darmowe Visual Studio Express. Nie powiem, łatwo nie było :D
Na końcu jednak, tak zupełnie do testów, bo mi na razie takie urządzenie niepotrzebne powstał ten tandem.
ATmega mierzy temperature radiatora i w zaleznosci od niej steruje PWM wentylatorka. Wartość temperatury i PWM wysyła na żądanie do programu na pulpit :D
W programie mam możliwość wyłączenia automatycznej regulacji temperatury i recznego ustawienia parametrów oraz przesłania tego wszystkiego do Megi :D
Program sam też odnajduje Dostępne porty Com :D Nieużywane przyciski są niedostępne..itd
Ogólnie mówiąc, cud, miód i malinki :D
Teraz można sie pokusić juz o jakiś bardziej skomplikowany setup, ale na razie nie mam pomysłu co zrobić z tym odkryciem.
Jak widać dwa popołudnia wystarczyły żeby to trochę ugryźć. Jeśli mogę ja, może każdy jeśli chce :D

Jest możliwość budowy programu na urzadzenia mobilne..muszę sie zaopatrzyc w jakis moduł radiowy :D

-

BARTek
Moja strona

Portret użytkownika matrix

Re: Własna aplikacja na Windows

Może rzucisz jakimś tutorialem. Zawsze chciałem się nauczyć pisać aplikacje okienkowe na kompa.

Portret użytkownika EDC

Odp. Własna aplikacja na Windows

Zrobie oczywiście :D
Tylko chciałbym być rzeczowy i jeszcze trochę sie poucze i doczytam. Teraz dopieściłem interfejs grafiką i wyskakującym okienkiem z Info :D
Po to właśnie chciałem sie nauczyć C żeby aplikacje na Winde pisać. Nie jest to niezbędnie konieczne się okazało :D
Visual Studio waży 100MB a nawet aero2 dało radę go ściągnąć ;)

Miłego dnia :D

-

BARTek
Moja strona

Portret użytkownika matrix

Re: Własna aplikacja na Windows

Niestety po ściągnięciu pakietu okazało się że nie mogę z niego korzystać bo jest na nowszą wersję windowsa a ja mam win7

Portret użytkownika EDC

Odp. Visual Studio Express

Ja to mam na Windows7 właśnie.
Jak linka znajde to zaraz dodam. Jedno co wiem to to że mi sie zaktualizował zaraz wieczorem wczoraj do 160MB.

Link do instalatora typu WEB (ściąga sobie tylko potrzebne elementy) w poście niżej.

-

BARTek
Moja strona

Portret użytkownika EDC

ThermoControl - monitorowanie i kontrola sterownika

Udało mi się zbudować sterownik który można sterować enkoderem lub za pomocą programu komputerowego.

Sterownik, gdy pokrecimy enkoderem, przechodzi z automatycznego na tryb "ręczny" Pokręcanie ustawia wtedy PWM dla wentylatora. Krótkie naciśnięcie enkodera włącza z powrotem tryb automatyczny który porównuje temperaturę chłodzonego urządzenia z zapisana w programie. Pilnowaną temperaturę można zmienić przez dłuższe naciśniecie enkodera. Wszystkie wartości: PWM, Pilnowana temperatura, Temperatura zmierzona, Tryb pracy i Histereza widoczne są na LCD.
Program w ATmega8 zajmuje 60% flasha, ale napisałem go tak, że ustawiając trzy parametry w listingu może być kompilowany do różnych procesorów i z opcjami: z lub bez LCD, z lub bez enkodera (tylko program PC do obsługi).
Nauczony doświadczeniem, że należy korzystać ze sprawdzonych rozwiań, zrobiłem to tak jak producenci modułów GPS.
Sterownik nadaje zakodowaną w formacie ASCII wiadomość, a program komputerowy ją dekoduje.

Tekst_pwm = Str(x)
 Tekst_t = Str(odczyt)
 Tekst_tryb = Str(tryb)
 Tekst_pilnuj = Str(pilnuj)
 Tekst_hist = Str(hist)
Message = Tekst_tryb + " " + Tekst_t + " " + Tekst_pwm + " " + Tekst_pilnuj + " " + Tekst_hist + " "
Print Message

To mój pierwszy program, więc proszę o wyrozumiałość. W programie na PC wykorzystałem możliwośc dzielenia zmiennych typu String np. przez spacje.
Program dzieli wiadomość, indeksuje i wartości wyświetla w okienkach lub zmienia napisy (tryb automatyczny lub sterowany).
Program sam wykrywa dostępne porty przy starcie. Ustawienia portów, auto połączenia przy starcie i nazwy wyjść dodatkowych zapamiętuje przy zamykaniu aplikacji. Tak, nazwy wyjśc mozna zmienić sobie w programie i podpisac np. "Pompa obiegowa" lub cokolwiek i sterowac sobie portami w sterowniku.
Połozenia suwaków odczytywane są ze sterownika po połączeniu. Ruch suwakiem jednak na 5 sec daje możliwośc zmiany wartości i zapisu nowej do sterownika. Niektóre funkcje dostępne sa dopiero po zmianie trybu pracy sterownika. Co ciekawe nic nie koliduje z ustawieniami czynionymi poprzez enkoder. Sa one od razu widoczne w programie (nawet zmiana trybu pracy). Tak samo w drugą stronę. Zmiana parametrów w programie widoczna jest na LCD.


Gdyby ktoś był zainteresowany przetestowaniem to udostępniłem aplikację na swoim koncie GoogleDrive pod tym linkiem MyGoogleDrive
Można pobrać folder lub zgrabny instalator ;) (mam wprawę w ich budowie z innego projektu).
Jesli ktoś nie ma potrzebnego NET.Framework4 to w katalogu jest też instalator Microsoftu.
Wszelkie uwagi i sugestie bardzo mile widziane. W wolnej chwili poprawie bugi które napewno jeszcze są.

Umknęło mi jakoś by napisać jak nadaje program. Program nadaje trzy znakową wartość typu String. Dlatego w Atmedze zadeklarowana jest taka zmienna i zamieniana na jej wartość.. Dopisywałem "Case" sobie w miarę rozbudowywania i dodawania funkcji więc są poukładane tak a nie inaczej ;) Jak będę coś budował to może rozwiążę to inaczej. Na razie, to, trzeba w swoim programie umieścić by móc dekodować wiadomość z PC w mikrokontrolerze.

Config Serialin = Buffered , Size = 4
Echo Off
Dim  Y As String * 3 , Z As Word 
 
'------------------------------------- zmiany przez port ----
If Ischarwaiting() = 1 Then
Input Y
Z = Val(y)
 
 Select Case Z
 
  Case 0 To 255                                             ' 0 - 255 bezposrednio PWM
     X = Z
  Case 300                                                  'zmiana na tryb automatyczny
    Tryb = 0
    Status = Chlodzenie_start
    X = 0
    Old_odczyt = 0
  Case 301                                                  'zmiana na tryb sterowany
    Tryb = 1
    Status = Tryb_reczny
  Case 600 To 700
    Hist = Z - 600
    Writeeeprom Hist , 4
  Case 800 To 900                                           'zmiana pilnowanej temp
    Pilnuj = Z - 800
    Old_odczyt = 0
    Writeeeprom Pilnuj , 2
  Case 900                                                  'sterowanie dodatkowymi wyjsciami
    Set Aux1
    Set Aux2
  Case 901
    Reset Aux1
    Set Aux2
  Case 910
    Set Aux1
    Reset Aux2
  Case 911
    Reset Aux1
    Reset Aux2
 
  End Select
End If
'----------------------------------------------------------

Życzę miłego dnia :)

-

BARTek
Moja strona

Portret użytkownika matrix

Re: ThermoControl - monitorowanie i kontrola sterownika

No wyszło całkiem ciekawie. Muszę przyznać.

Portret użytkownika EDC

Echo Off, Input i Bootloader

Gdy pisałem aplikację to nie wiedziałem skąd mi się krzaki brały czasem przy ustawianiu parametrów przez PC i wysyłaniu ich na RS232. Rozwiązałem to programowym filtrowaniem. Dopiero gdy wartość String ma odpowiednią ilość spacji w sobie to jest uznawana za prawidłową.
Doczytałem po fakcie, że Bascom automatycznie i domyślnie zwraca wprowadzony na RS232 znak. Żeby tego uniknąć trzeba w programie wpisać Echo Off.
Druga sprawa, to to, że polecenie Input czeka na "Enter" i potrafi powiesić tak napisany program na ATmela. W przypadku wiadomości z ThermoControl nie ma problemu bo on zawsze automatycznie dodaje vbCr. W przypadku Terminala program w sterowniku czeka na Enter. Na wszelki wypadek oprogramuję sobie jakoś Watchdoga albo jakiś Timer by nie skasowany wyskoczył z tego czekania gdyby pojawiły się na linii śmieci, lub po prostu znajdę inny sposób i inaczej to napiszę.
Co do programowego resetu i skoku do Bootloadera to dopisując Case w programie np. 999 można go wywołać.
By MCS Bootloader włączył się automatycznie w opcjach programatora w wyborze źródła Resetu trzeba wybrać "Soft" i wpisać "999{13}".
Czekam na części i jak wszystko sprawdzę to zdam pełną relację ;)

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

można też sprytnie użyć Watchdoga jeśli ma się oprogramowany w FuseBitach start od Bootloadera, czyli BootResetVector. Watchdog potrafi zresetować procka ;)
Config Watchdog = 16
 
 
Select case Z
.
.
 Case 999
  Start Watchdog

Miłego dnia :D

-

BARTek
Moja strona