logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ATMega8][ISP] - Automatyczny update programu w kilku procesorach na raz

jayo 22 Paź 2013 19:37 2232 8
REKLAMA
MediaMarkt Black Week
  • #1 12870335
    jayo
    Poziom 12  
    Problem
    Poszukuję automatycznego sposobu wymiany (unowocześnienia) oprogramowania w kilku procesorach ATMega8 za pomocą ISP bez odłączania tych procesorów od płytki (będą SMD) oraz bez przepinania kabli i zworek. Proces wymiany oprogramowania ma być wystarczająco prosty aby mógł go przeprowadzić niewtajemniczony użytkownik. Po przeanalizowaniu sporej ilości materiałów stworzyłem projekt takiej operacji i proszę Forumowiczów o opinię czy to może zadziałać oraz wskazanie słabych punktów mojego rozumowania.

    Kontekst
    System będzie złożony z kilku procesorów atmega8 (slave) i sterowany za pomocą jednego atmega8(master) podłączonego do tabletu z systemem Android (serial to usb na układzie pl2303).
    Ważne jest, że programator ma być częścią systemu i dać się sterować z tabletu. Problem połączenia tablet - ATMega udało się osiągnąć dzięki felixhaedicke-usb-serial-for-android (http://code.google.com/r/felixhaedicke-usb-serial-for-android/)

    Moje rozwiązanie
    Fragment rozwiązania znajduje się na obrazku ze schematem.
    3x Slave na górze rysunku, na dole Master.
    [ATMega8][ISP] - Automatyczny update programu w kilku procesorach na raz


    Decyzje projektowe
    Jeśli moje rozumowanie jest błędne to proszę o pomoc.
    ISP używa linii MISO, MOSI, RESET i SCK do programowania. MISO, MOSI i SCK każdego procesora można połączyć równolegle. Jeśli procesory nie używają SPI to nie będzie to przeszkadzało w programowaniu.

    RESET zachowuje się trochę jak Slave Select (SS) - w stanie niskim włącza tryb programowania więc każdy procesor ma wyprowadzony RESET do Mastera. Master wybiera, który procesor programować za pomocą odpowiedniego pinu (tutaj 14, 15, lub 23 w masterze), który ustawia w stan niski na czas programowania i resztę wykonuje tak samo jak programator USBasp czy jakikolwiek inny programator ISP. Pozostałe procesory mogą w tym czasie pracować normalnie. Linie MISO, MOSI i SCK są zajęte przez programator ale pozostałe slave'y ich nie słuchają ponieważ nie używają SPI. Master gdy skończy może przystąpić do programowania kolejnego slave'a.

    Program w masterze będzie zmodyfikowaną wersją ArduinoISP, który będzie kolejno przełączał się pomiędzy slave'ami. Jeśli będzie ich np 8 to wystarczy 8 razy włączyć programowanie na tablecie aby zaprogramować wszystkie. Numer ostatnio programowanego slave'a można zapisywać w eppromie. Z punktu widzenia tabletu nie będzie widać ile jest układów. Tablet będzie dostarczał nowy kod, który będzie pobrany z internetu.

    Moje pytania:
    1. Czy to w ogóle zadziała? (Mam na myśli programowanie w ten sposób)
    2. Czy muszę podłączyć kwarce w jakimś miejscu jeśli wystarczy mi prędkość 8MHz?
    3. Czy jeśli będę chciał aby Master pracował z prędkością 16Mhz a slave'y 8Mhz to czy nadal będzie się dało je programować?
    4. Czy mogę używać pinu SS (pin 16) w slave bez przeszkód dla programowania?
    5. Jeśli nie chcę resetować slave'a to muszę ustawić pin, do którego jest podłączony jego Reset w stan wysoki czy wystarczy w stan wysokiej impedancji jeśli mam rezystor podciągający (R2, R4, R5)?
    6. Czy resetowanie Mastera nie spowoduje resetu któregoś Slave'a lub odwrotnie?
    7. Czy niezaprogramowany układ jest w stanie zakłócić programowanie innych? Np gdy pierwszy raz wgrywam oprogramowanie do pierwszego slave'a to czy kolejne podłączone nie przeszkadzają?
  • REKLAMA
    MediaMarkt Black Week
  • #2 12870502
    BlueDraco
    Specjalista - Mikrokontrolery
    Skąd pomysł, że musi to być horda ATmega8, a nie układ, który potrafi to wszystko, co one razem wzięte i przy okazji nie ma problemów z samoprogramowaniem, np. przez USB?

    ATmega8 też ma jakieś minimalne wsparcie dla bootloadera. Czemu z niego nie skorzystasz?
  • REKLAMA
    MediaMarkt Black Week
  • Pomocny post
    #3 12870733
    tmf
    VIP Zasłużony dla elektroda
    Tak, ma to szansę zadziałać. Co prawda od takich rzeczy są bootloadery, lecz rozumiem, że np. nie masz na nie miejsca w pamięci (znaczy źle wybrany procek).
    ad 1. Tak, może zadziałać.
    ad 2. Nie, kwarce nie są potrzebne.
    ad 3. Będzie, ważna jest częstotliwość SCK na ISP, która w tym przypadku musi być <2 MHz.
    ad 4. Możesz.
    ad 5. Wystarczy stan wysokiej impedancji, lecz jeśli możesz po prostu wystawić stan wysoki, to znika konieczność stosowania tej całej drobnicy na RESET.
    ad 6. Nie spowoduje, jeśli na RESETach masz pull up, a masz.
    ad 7. Nie, gdyż domyślnie wszytkie piny ISP są wejściami.
    Pamiętaj, że aby to działało wczystkie piny ISP wszystkich procków muszą być ustawione na wejście. Nie możesz z nich w programie korzystać.
  • #4 12871066
    jayo
    Poziom 12  
    BlueDraco napisał:
    Skąd pomysł, że musi to być horda ATmega8, a nie układ, który potrafi to wszystko, co one razem wzięte i przy okazji nie ma problemów z samoprogramowaniem, np. przez USB?

    ATmega8 też ma jakieś minimalne wsparcie dla bootloadera. Czemu z niego nie skorzystasz?


    Zgadzam się i teraz widzę, że zapomniałem dodać, że te procesory będą rozmieszczone co 20cm na osobnych modułach których może być nawet 20. Każdy moduł będzie posiadał zestaw ok 8-10 LEDów. Wykonanie tego na jednej płytce lub budowanie wszystkiego na jednym procesorze chyba więc odpada.

    Jak się zawezmę to zrobię na mniejszej ilości większych procesorów, ale i tak powyższa idea będzie aktualna.

    Myślałem nad USB, ale z androidem miałem problem z komunikacją, a poza tym licencja hobbystyczna na wirtualne usb jest do kilku sztuk procesorów i to bez celów sprzedażowych, a to urządzenie chce sprzedać. Powyżej tego muszę płacić więcej niż w przypadku pl2303.

    Zastanawiałem się nad bootloaderem na i2c bo można to wtedy podłączyć równolegle i odpada duża ilość pinów, które trzeba ciągnąć przez całe urządzenie, ale nie znalazłem by ktoś coś takiego zrobił. Poza tym programator na i2c, który by ściągał program z androida to już chyba wyższa szkoła jazdy (przynajmniej na moim etapie).
  • #5 12871102
    michalko12
    Specjalista - Mikrokontrolery
    Zależy co te LEDY miałby prezentować a może i nie zależy, ale jak już to trzeba było zwykłe sterowniki LEDów zastosować a nie uC np. SCT2024
  • #6 12871237
    tmf
    VIP Zasłużony dla elektroda
    Dokładnie, LEDami nie musi sterować bezpośrednio procesor. Z drugiej strony jeśli to ma być nawet 20 modułów oddalonych od siebie o 20 cm, to daje nam to 4 metry pomiędzy skrajnymi modułami. Ani SPI, ani tym bardziej ISP nie ma szans zadziałać na takie odległości. Z I2C też będzie problem. Stąd też IMHO warto przemyśleć RS485 i wykorzystanie dostępnego w M8 trybu pracy USART - MPCM. Dodać bootloadery i masz prosty, niezawodny układ bez kombinowania. Ew. do pierwszego modułu dodać moduł BT, co zapewni komunikację z Androidem.
  • #7 12872313
    BlueDraco
    Specjalista - Mikrokontrolery
    No niezupełnie - te skrajne moduły będą zapewne dostawały sygnały SPI z poprzednich modułów, czyli długość pojedynczej "szyny" SPI nie przekroczy umownych 20 cm. SPI tu akurat zadziała dobrze, zresztą tak to się właśnie robi w średnich matrycach LED.
  • #8 12872678
    jayo
    Poziom 12  
    A gdyby jako Slave ściągać program po Serialu (RX, TX), tak jak to robi arduino, to jak by musiał wyglądać Master aby obsługiwać takie pobieranie? Seriala nie można połączyć równolegle prawda? Symulować programowo na różnych pinach?
  • #9 12872708
    tmf
    VIP Zasłużony dla elektroda
    Jak z poprzednich? Jest jeden master, który steruje 20 układami slave. Ponieważ żaden sygnał nie przechodzi przez SPI poszczególnych procków, nie jest regenerowany. Ponieważ nie wyobrażam sobie 20 modułów podłączonych do jednego mastera 20 cm przewodami, z konieczności połączenia będą znacznie dłuższe lub dłuższe + wiele rozgałęzień. Tak, czy tak bardzo niedobrze dla sygnałów.
    Chyba, że myślisz o podłączeniu poszczególnych slave szeregowo, tak, aby tworzyły jeden, wielki rejestr przesuwający, zatrzaskiwany wspólnym sygnałem CS? Wtedy trzeba regenerować tylko sygnał SCK.

    Dodano po 5 [godziny] 39 [minuty]:

    jayo napisał:
    A gdyby jako Slave ściągać program po Serialu (RX, TX), tak jak to robi arduino, to jak by musiał wyglądać Master aby obsługiwać takie pobieranie? Seriala nie można połączyć równolegle prawda? Symulować programowo na różnych pinach?


    Można podłączyć równolegle, lecz trzeba zapewnić aby na raz aktywny był wyłącznie jeden nadajnik Tx USART. Stosunkowo prosto można to zapewnić. Przy okazji odpada ci konieczność prowadzenia CS do każdego układu, ale musisz wykorzystać synchroniczny USART, chyba, że każda M8 ma kwarc. A wtedy de facto sprowadzasz USART do SPI.
REKLAMA