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

sprog - bootloader dla avr [C]

TokamakPl 20 Cze 2010 20:02 23722 56
  • sprog - bootloader dla avr [C]
    Witam!

    Zniechęcony rozwiązaniami dostępnymi w internecie postanowiłem napisać własny bootloader dla mikrokontrolerów z rodziny AVR. Gotowe rozwiązania jakie znalazłem były zbyt rozbudowane lub po prostu nie działały. Projekt powstał w około 6-7 dni ale tylko dla tego że było to zagadnienie zupełnie mi obce i wszystkiego musiałem się nauczyć. Rozwiązanie jest proste i znacząco upraszcza proces programowania. Mam nadzieję że mój projekt będzie dobrą bazą dla własnych rozwiązań!

    Proszę najpierw czytać a następnie zadawać pytania.

    >> Czym jest bootloader <<
    Nazwa pochodzi od angielskiego bootstrap load. Słówko bootstrap pochodzi z kolei od powiedzenia "pull oneself up by one`s bootstraps" czyli dawać sobie samemu radę. Bootloader jest więc programem który "sam siebie wczytuje".
    Bootloader jest uruchamiany jako pierwszy w chwili zresetowania procesora (dzięki ustawieniu odpowiednich fusebitów). Bootloader znajduje się na końcu pamięci flash. Jedynie kod umieszczony w sekcji bootloadera może wykonywać pewne operacje, np zapisywać pamięć Flash, kod położony poza tą sekcją nie ma dostępu do tego typu operacji. Dzięki temu za pomocą bootloadera możemy zmieniać zawartość pamięci a dane do wpisania uC odbiera przez zaprogramowany przez nas interfejs (uart, i2c, ręcznie, ultradźwiękami, mikrofalami, kartą sd ... co tylko programista wymyśli). Pozwala to zrezygnować z programatora.

    Założenia:
    - Komunikacja przez interfejs szeregowy uart( ja korzystam z przejściówki usb->com )
    - Mały rozmiar, do 512 bajtów (początkowo urządzeniem docelowym była ATMega8 ale niestety zabił ją ładunek elektrostatyczny, obecnie wersja jest przygotowana pod ATMega32, rozwiązanie oczywiście bardzo łatwo przeportować na inne µC AVR).
    - Programowanie flash szybciej od avrdude.
    - Kontrola danych "w locie" (dzięki czemu można pominąć odczyt tak jak to dzieje się w avrdude, metoda xor ale sprawdza się bardzo dobrze)
    - Zdalny reset (poprzez linie DTR, RTS)
    - Integracja z WinAVR

    Co udało się dodatkowo "upchnąć":
    - Odczyt Flash
    - Zapis i odczyt EEPROM (w trybie terminalu)
    - Odczyt fusebitów i lockbitów

    Dodatkowe plusy rozwiązania:
    - Dzięki wgranemu wcześniej bootloaderowi można programować nawet jeżeli za pomocą fusebitów zablokujemy ISP,reset itp.
    - Kod całkowicie darmowy, licencja MIT (X11)



    Pytania i odpowiedzi:
    1. Mam zablokowany układ, czy bootloader pomoże mi go odblokować/zaprogramować/cokolwiek?
    > Nie, bootloader musi zostać jakoś wgrany więc zablokowany układ należy wcześniej odblokować.

    2. Dlaczego w ogóle zawracać sobie głowę bootloaderem?
    > Za pomocą bootloadera nie można popsuć fusebitów (bo się nie da ich zmienić :D); bootloader w większości przypadków zaprogramuje układ szybciej niż usbasp, lpt i tym podobne rozwiązania; bootloader korzysta z rs232 więc można wykorzystać np. moduł bluetooth i programować zdalnie!; Jeżeli już nasz projekt wykorzystuje komunikację szeregową to redukujemy znacząco ilość przewodów na płytce, stopień skomplikowania układu.; Podczas projektowania płytki łatwiej wyprowadzić 3 przewody do transferu szeregowego niż gniazdo w standardzie Kanda.

    3. Mam atmegę8 czy mogę użyć do niej tego kodu?
    > Bootloader znajduje się na końcu pamięci flash, więc konieczna jest zmiana (niewielka). Mogę na życzenie skompilować kod pod atmegę8 ale niestety nie posiadam układu więc nie mogę sprawdzić działania (tak nawiasem: jeżeli układy te nie wrócą po 3zł /sztukę to wróżę im marną przyszłość :| )

    4. Czy trzeba grzebać w fusebitach aby bootloader działał?
    > Niestety tak, procesor musi wiedzieć że startuje od adresu np. 0x3F00 a nie od 0x0000

    5. Dlaczego nie można wykorzystać Avrdude?
    > Avrdude nie wspiera mojego rozwiązania, co więcej nie wspiera żadnego prostego bootloadera (tylko takie >= 1kB).

    6. Dlaczego Atmel nie wgrywa fabrycznie bootloadera
    > Może zarabiają na zablokowanych ATMegach8 :D NXP i Microchip (ICSP) wgrywają fabryczny bootloader.

    7. Czy można programować EEPROM?
    > Tak ale tylko po bajcie w trybie terminalu. Teoretycznie mógłbym dodać zapis z pliku ale kasowanie strony dla każdego bajtu w stronie nie wyszłoby na zdrowie układowi. W pełni funkcjonalny zapis EEPROM wymaga rozszerzenia programu bootloadera.

    Proszę o komentarze. Jest możliwość napisania graficznej nakładki, sam nie lubię tego typu rozwiązań, ale jeżeli pojawią się takie sugestie mogę takową napisać.

    Tutaj screen z Programmer's Notepad, czyli jak to działa w praktyce:
    sprog - bootloader dla avr [C]

    Po wgraniu bootloadera wystarczy prosty interfejs, ja zastosowałem przejściówkę com/usb oraz układ max232 jak w zdjęciu poniżej, można użyć ftdi czy adaptera bluetooth (np BTM-222). W porównaniu z usbasp znacząco zredukowałem ilość przewodów na płytce szczególnie że w projektach często wykorzystuje rs.
    sprog - bootloader dla avr [C]

    Przydatne linki:
    *Bootloader kolegi mirekk36, niestety rozwiązanie komercyjne
    *Opis bootloaderów w środowisku arduino
    *Bootloader kolegi master_pablo
    *Kolejny ciekawy bootloader.
    Załączniki:

    Fajne! Ranking DIY
    Potrafisz napisać podobny artykuł? Wyślij do mnie a otrzymasz kartę SD 64GB.
    O autorze
    TokamakPl
    Poziom 16  
    Offline 
    Specjalizuje się w: elektronika cyfrowa, automatyka
    TokamakPl napisał 212 postów o ocenie 50, pomógł 2 razy. Jest z nami od 2005 roku.
  • Computer Controls
  • #2
    gts1991
    Użytkownik obserwowany
    TokamakPl napisał:


    - Można programować nawet jeżeli za pomocą fusebitów zablokujemy ISP,reset itp.

    [/url]

    Dobrze rozumiem że można nim zastąpić "Programator równoległy " :D
  • #3
    TokamakPl
    Poziom 16  
    gts1991 napisał:
    Dobrze rozumiem że można nim zastąpić "Programator równoległy " :D
    Nie do końca. Bootloader nie ma możliwości modyfikacji fusebitów. Jeżeli nawet opcja programowania przez ISP jest zablokowana to bootloader dalej działa i można programować ale bootloader musi być wcześniej wgrany (Przed zablokowaniem ISP). Programowanie równoległe to osobna sprawa i działa zawsze gdy układ jest sprawny.

    Edit: Oczywiście mówiąc o programatorze równoległym mam na myśli coś Takiego. Bo jeżeli chodzi o programator LPT to spokojnie można z niego zrezygnować mając ustawione już fusebity.
  • #4
    michalko12
    Specjalista - Mikrokontrolery
    Trochę wygórowane wymagania co do dotneta, trzeba zaciągać najnowszego z M$. Podoba mi się opcja "wtf" :)
  • #6
    TokamakPl
    Poziom 16  
    Również pozdrawiam :) Nie ma się co zniechęcać, bootloader to świetna sprawa. Atmega8 ma tak fajnie wyprowadzony rst, rx i tx że wystarczą 3 kabelki z samego brzegu do podłączenia ale niestety obecne ceny odstraszają i nie opłaca się kupować nic mniejszego niż mega32 (w obudowie dip). Zastanawiam się nad napisaniem artykułu na temat bootloaderów w atmegach.

    .NET Framework to standard, ale rzeczywiście skompilowałem w VS 2010 gdzie jest najnowszy 4.0 . Jutro wyślę wersję z bardziej popularnym 3.0. Kod jest prosty myślę że można łatwo przenieść go na MONO.
    Edit: Już jest wersja .NET 3.5
  • #7
    Karol966
    Poziom 30  
    Mam 4 zablokowane M8 (nauka fuse bitów nie przyszła mi łatwo :D ) Jakie mam szanse na ich zaprogramowanie? Nie wiem, czy bootloader jest w nich aktywny.
  • #8
    TokamakPl
    Poziom 16  
    Bootloader na 100% nie jest aktywny bo w AVR żaden nie jest fabrycznie wgrywany. Do odblokowania konieczny jest programator rownoległy wysokonapięciowy albo resurektor który pojawił się już na elektrodzie.
    Proszę czytać to co już jest napisane!
    Cytat:
    Jeżeli nawet opcja programowania przez ISP jest zablokowana to bootloader dalej działa i można programować ale bootloader musi być wcześniej wgrany (Przed zablokowaniem ISP)


    Widzę że muszę parę informacji doprecyzować :/
  • Computer Controls
  • #9
    leonow32

    Poziom 30  
    Czy tym bootloaderem dało by się na przykład wgrać program do atmegi z karty SD? Albo jeszcze lepiej - wybierać program, który ma się wgrać?

    TokamakPl napisał:
    niestety obecne ceny odstraszają i nie opłaca się kupować nic mniejszego niż mega32 (w obudowie dip).

    A mnie ATmega8 kosztuje 17zł, a ATmega32 jest za 14zł :D ale ostatnio kupiłem ATmega128 za........ 21zł :D
  • #10
    TokamakPl
    Poziom 16  
    leonow32 napisał:
    Czy tym bootloaderem dało by się na przykład wgrać program do atmegi z karty SD? Albo jeszcze lepiej - wybierać program, który ma się wgrać?

    Niestety założeniem projektu było zmieszczenie się w 512 bajtach, więc obsługa SD odpada przy takim ograniczeniu ale oczywiście mój projekt może być dobrą bazą do rozbudowy! W ATMega32 bootloader może mieć wielkość nawet 4096 bajtów, więc obsługa karty SD to nie problem. Dokładnie takie rozwiązanie jest wykorzystywane w niektórych telefonach i podobnych urządzeniach!

    Ja walczę z timerami, na karty SD przyjdzie pora ;D

    leonow32 napisał:
    A mnie ATmega8 kosztuje 17zł, a ATmega32 jest za 14zł :D ale ostatnio kupiłem ATmega128 za........ 21zł :D

    W Kamami LPC1114 kosztuje jednostkowo 6zł, 32bit ARM Cortex-M0 8KB flash 2KB ram, tylko ta obudowa ... (w farnellu 32K flash około 10 zł :D)
  • #11
    mały naukowiec
    Poziom 20  
    Coś ostatnio nie byłem na bieżąco z cenami avr-ów, a teraz widzę że atmega8 chodzi po 14zł na allegro. Co to się stało, że wszystko takie drogie?
    Pamiętam, jak je kupowałem po 4.5zł...
  • #12
    leonow32

    Poziom 30  
    Ponoć fabryka się nie wyrabia i dlatego takie cuda się dzieją. Okazuje się, że Atmega128 jest niewiele droższa od Atmegi8 :D bo na 8 jest duże zapotrzebowanie i zaraz handlowcy skurczybyki podnieśli ceny :D
  • #13
    damiano713
    Poziom 14  
    Atmega8 nie jest już produkowana. Z tąd podwyżka cen.
  • #14
    TokamakPl
    Poziom 16  
    Ale się zrobił offtopic :P
    Atmel nie ma zbyt rozgarniętego zarządu, najlepiej byłoby dla wszystkich gdyby Microchip ich kupił. Problem rozpoczął się gdy podczas kryzysu Atmel pozamykał część fabryk. Atmega8 jest oczywiście dalej produkowana (i będzie jest cała masa nowych wersji np. u2 u4) ale popyt jest tak duży że układów brakuje i jeżeli jakieś są wyprodukowane to lądują do fabryk w chinach. Wywołało to braki na rynku (stąd ceny). Osobiście chce się przerzucić na coś innego, a Atmel daleko nie zajdzie z obecnym zarządem :(

    Na elektrodzie są już wątki dotyczące tego problemu więc proszę o zaprzestanie tego tematu tutaj. Układy wrócą w przyszłym roku bootloader się jeszcze przyda :D Tylko pytanie ilu elektroników zostanie przy AVR.
  • #15
    damiano713
    Poziom 14  
    Czy program poprawnie steruje wyjściami DTR i RTS przejściówki na FT232?

    EDIT:

    Okazało się, że chińczyki nie dolutowały rezystorów do RTS i DTR w konwerterze od telefonu Nokia. Kable były wyprowadzone. Od to oszczędność :)
  • #16
    TokamakPl
    Poziom 16  
    damiano713 napisał:
    Czy program poprawnie steruje wyjściami DTR i RTS przejściówki na FT232?

    Nie bardzo rozumiem pytanie. Sam posiadam wyprowadzone tylko DTR więc RTS jest nie sprawdzone, przejściówka z jakiej korzystam jest kupna i oparta na układzie profilic. Sterowanie tymi liniami nie zależy od programu lecz od systemu ( tak na prawdę sprowadza się do prostych poleceń: serialport.DTR=true; serialport.RTS=true; w celu ustawienia stanu aktywnego ) Jeżeli coś nie działa na przejściówce ftdi to najprawdopodobniej wina sterownika lub błąd w układzie przejściówki i program nie ma na to żadnego wpływu.

    Edit: Oczywiście zdalny reset nie jest konieczny!! Do makefilie wystarczy zmodyfikować linię flag na: "SPROG_FLAGS = -port:$(SPROG_PORT) -reset:none", teraz wystarczy zresetować przyciskiem (Uwaga! Resetowanie odcinaniem zasilania powoduje powstanie śmieci na uart, nie polecam :wink: )
  • #17
    MasterMatan
    Poziom 21  
    Hmmm... dość interesujące, ciekawe jakby tak pogrzebać w tym bootloaderze Arduino ^^
  • #18
    TokamakPl
    Poziom 16  
    MasterMatan napisał:
    Hmmm... dość interesujące, ciekawe jakby tak pogrzebać w tym bootloaderze Arduino ^^


    W celu? Mój potrafi praktycznie wszystko co trzeba odczyt/zapis flash, eeprom :D praktycznie to samo co arduino :P a zajmuje najmniejszy możliwy obszar w m32.
    Edit: No jest jedno "ale" mój nie współpracuje z AVRStudio (z którego i tak nie korzystam). Ale: arduino: 2KB mój 512B :)
  • #19
    monty_p
    Poziom 18  
    świetny projekt. :) Jest jakaś prosta opcja na kodowanie (jakoś) wsadu i dekodowanie go w bootloaderze, podczas wgrywania ?

    Gdyby ten bootloader miał taką opcję, można by dać program klienta, urządzenie, w którym jest bootloader, i wsad komuś, kto będzie mógł jedynie wgrać wsad do tego jednego urzadzenia. Nie będzie mógł np sklonować urządzenia i samodzielnie klepać do klonów wsadu z oryginału :)
  • #20
    Urgon
    Poziom 36  
    AVE...

    Najprostsze, co mi przychodzi do głowy, to XORowanie danych bit po bicie z kluczem składającym się z kilku bajtów. Tak robiono w czasach WWII przy szyfrowanej łączności dalekopisowej...

    Swoją drogą ciekawe, czy dałoby się to zastosować dla innych rodzin mikrokontrolerów...
  • #21
    tmf
    Moderator Mikrokontrolery Projektowanie
    monty_p napisał:
    świetny projekt. :) Jest jakaś prosta opcja na kodowanie (jakoś) wsadu i dekodowanie go w bootloaderze, podczas wgrywania ?

    Gdyby ten bootloader miał taką opcję, można by dać program klienta, urządzenie, w którym jest bootloader, i wsad komuś, kto będzie mógł jedynie wgrać wsad do tego jednego urzadzenia. Nie będzie mógł np sklonować urządzenia i samodzielnie klepać do klonów wsadu z oryginału :)


    Przecież jedna z not aplikacyjnych Atmela opisuje bootloader z kodowaniem AES, więc nie ma co wynajdywać koła od nowa.
  • #22
    TokamakPl
    Poziom 16  
    monty_p napisał:
    świetny projekt. :) Jest jakaś prosta opcja na kodowanie (jakoś) wsadu i dekodowanie go w bootloaderze, podczas wgrywania ?

    Gdyby ten bootloader miał taką opcję, można by dać program klienta, urządzenie, w którym jest bootloader, i wsad komuś, kto będzie mógł jedynie wgrać wsad do tego jednego urzadzenia. Nie będzie mógł np sklonować urządzenia i samodzielnie klepać do klonów wsadu z oryginału :)


    Wszystko się da wystarczy chcieć i mieć wolną pamięć flash :D Nawet są dostępne odpowiednie biblioteki! Jeżeli ktoś chce rozszerzyć bootloader, wystarczy zmienić fusebity i adres w makefile a wszystkie potrzebne informacje znajdują się w nocie katalogowej (strony od 244, a na stronie 255 znajduje się tabela z odpowiednimi liczbami [tylko należy pamiętać o różnicy pomiędzy słowem a bajtem :!:] )
  • #23
    polprzewodnikowy
    Poziom 26  
    Że się tak zapytam, co cię podkusiło żeby napisać aplikację w C#!? Chętnie bym skorzystał ale niestety posiadam tylko linuxa.
  • #24
    TokamakPl
    Poziom 16  
    Pod linuxem też się da! http://www.mono-project.com/Main_Page (tak myślę, nie korzystam ale linuxomasochiści powinni sobie poradzić) C^# jest obecnie najbardziej efektywnym językiem (razem z frameworkiem) ... Ok przeskanowałem to MoMA (mono migration analyzer), narzędziem sprawdzającym zgodność z mono i zaraz wyślę wersję z poprawkami!

    Edit: Już jest!
  • #25
    tmf
    Moderator Mikrokontrolery Projektowanie
  • #26
    TokamakPl
    Poziom 16  
    Znowu offtop, ale rzeczywiście wyraziłem się co najmniej niejasno. Według mnie C# oraz platforma .NET pozwalają w prosty oraz szybki sposób pisać aplikacje. Dzięki mono można mówić o pewnej przenośności. Generalnie Visual Studio to najlepszy produkt Microsoft (wg. mnie), nie znam żadnego tak wygodnego środowiska. Koniec offtop, aplikacja jest w C# jak komuś się nie podoba to możne napisać swoją nawet w action script jeżeli lubi :D. Protokół komunikacji jest prosty do odczytania z kodu bootloadera.
  • #27
    MasterMatan
    Poziom 21  
    TokamakPl Tutaj również się przyłączę do kolegi, też używam Lin ale mniejsza o to, na zagrabanicznych stronkach raczej standardem jest pisanie programów sterujących w językach których kod jest łatwiej przeportować. Jeżeli znasz C# to pewnie żadną trudnością byłoby napisanie kodu w C++/C/Java już nawet bez tych okienek (niech to działa w TUI) a masochiści niechaj robią sobie GUI, bo nie o to ma chodzić że zrozumie program wąska grupa znająca C#, chodzi o to żeby zrozumieć jak program komunikuje się z urządzeniem, tylko o to. Więc czasem mnie też skręca jak ktoś robi coś w C#/.NET/Delphi bo program ciekawy, pewnie z bajerami w środku, a nijak tego nie "zjeść".
  • #28
    TokamakPl
    Poziom 16  
    MasterMatan napisał:
    Jeżeli znasz C# to pewnie żadną trudnością byłoby napisanie kodu w C++/C/Java już nawet bez tych okienek (niech to działa w TUI) a masochiści niechaj robią sobie GUI, bo nie o to ma chodzić że zrozumie program wąska grupa znająca C#, chodzi o to żeby zrozumieć jak program komunikuje się z urządzeniem, tylko o to.


    Komunikację najlepiej "odczytywać" z kodu bootloadera. Znam C, C++ i trochę Javę, C# najbardziej mi odpowiada, co więcej myślę że nie jest trudny do przeportowania. Nie widzę problemu w odczytaniu kodu C# przez osobę znającą C. Nie do końca rozumiem rozważania o GUI, aplikacja jest konsolowa, mówiąc o masochistach miałem na myśli użytkowników linuxa (na PC), sam mam negatywne doświadczenia z tym systemem, uważam go za niedopracowanego. Myślałem że dyskusja będzie rozwijać się w kierunku bootloadera a nie programu klienckiego, udostępniłem kod w dobrej wierze a podobnych projektów nie uświadczyłem w sieci więc uznałem projekt za wart umieszczenia na elektrodzie.
  • #29
    elektronik999
    Poziom 26  
    [quote="TokamakPl"]
    MasterMatan napisał:
    (...)uznałem projekt za wart umieszczenia na elektrodzie.
    I bardzo dobrze zrobiłeś że podzieliłeś się tym. Admin elektrody powinien Cie wyróżnić jakoś bo mało jest konstrukcji gdzie jest wszystko udostępnione
  • #30
    da.ma
    Poziom 2  
    Może mi ktoś wyjaśnić do czego ma służyć ten układ?