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

Programowanie kilku mikrokontrolerów przez jedno złącze isp

golas17 19 Sie 2009 20:39 5651 36
  • #1 6910861
    golas17
    Poziom 16  
    Witam,
    Zacząłem bawić się komunikacją między procesorami i już przy pierwszym projekcie mam taki problem: mam dwa procesory komunikujące się poprzez spi na jednej płytce. Prosiłbym o informacje nt. połączenia podczas programowania procesorów. Czy np. kiedy programuję jeden procesor, to muszę odłączać linie MOSI, MISO, SCK, RESET od drugie procesora i odwrotnie? Zakładam że mam jedno złącze isp.
  • #2 6910878
    riddyk
    Poziom 20  
    Witam, wystarczy, że z tego którego nie chcesz programować odłączysz sygnał reset, np po przez zworkę, ale musisz to uwzględnić w płytce pcb. Albo tak sprytnie zrobić program że wyborem odpowiedniego stanu pinu przyjmuje inny algorytm działania.
  • #3 6910899
    loocasm
    Poziom 15  
    Jakikolwiek byłby ten "inny algorytm działania" w danej chwili, reset i tak go zresetuje, jeżeli jest wciąż podłączony... Chyba, że się mylę..
  • #4 6910912
    golas17
    Poziom 16  
    Myślałem o czymś podobnym, ale miałem wątpliwości... Czy to nie spowoduje jakichś niespodziewanych problemów w sytuacji gdy np. załączam zworkę resetu na slave'a i zaczynam programowanie. W tym czasie master dalej wykonuje swój program i może wysyłać dane do slave w tym samym czasie co programator. Nie powstanie jakiś bałagan?
  • #5 6910936
    marek_Łódź
    Poziom 36  
    Może się zrobić kaszana. Trzeba by rozdzielić sygnał a przełączniku wielostykowym ("isostat") albo przez łączniki elektroniczne.
    W ostateczności można je rozdzielić rezystorami (oddzielne rezystory na liniach sygnałowych obu procesorów).
    Oczywiście SPI między procesorami by działało też przez te rezystory, a po uruchomieniu można by wstawić zworki.
  • #6 6911016
    golas17
    Poziom 16  
    Albo zastosować dipswitch? Co myślisz? Spróbuje zaraz namalować jakiś rysunek do kontroli wstępnej

    Dodano po 33 [minuty]:

    Coś w ten deseń będzie pewnie działać.
    Programowanie kilku mikrokontrolerów przez jedno złącze isp
  • #7 6912160
    loocasm
    Poziom 15  
    Dwa dipswitche od strony Atmeg albo zworki na goldpinach - co wygodniej / taniej Ci zrobić :) Wtedy masz 100% pewności, że nic się nie skasztani.
  • #8 6912352
    tmf
    VIP Zasłużony dla elektroda
    Nie musisz przelaczac wszystkich sygnalow, wystarczy sam RESET. I BTW, jakie procesory masz na plytce? Bo np. ATMega128 ma na zupelnie innych pinach ISP i SPI.
  • #9 6914417
    golas17
    Poziom 16  
    Mam Atmega16 i Atmega8. Co do samego sterowania resetem, to kilka postów wyżej doszliśmy z markiem_Łódź do wniosku że lepiej tego nie robić. Najpewniejszym sposobem jest na pewno rozdzielenie wszystkich linii. A bardzo jestem ciekawy tego rozwiązania z rezystorami... Mógłby ktoś kto wie dokładniej o co chodzi wrzucić jakiś schemat? Albo dokładnie wytłumaczyć w dwóch trzech zdaniach. Będę wdzięczny
  • #10 6914436
    janbernat
    Poziom 38  
    Twój schemat na dipswitchach nie przełącza resetu z programatora a powinien.
    Czyli cztery dipswitche.
    A czy wystarczy sam reset przełączać- mam wątpliwości.
    Jak master w trakcie programowania coś zacznie nadawać to slave dostanie g... nie program.

    Dodano po 14 [minuty]:

    Rezystory oddzielające resztę układu od MOSI, MISO itd. sprawdzają się (ok. 470 Ohm w szereg do reszty układu) jeśli te końcówki podłączone są do elementów niskoomowych w układzie- jakaś baza tranzystora np.
    Wtedy we-wy programatora nie jest obciążone i prawidłowo programuje procesor.
    I tak procesor ją wysteruje jak po zaprogramowaniu końcówka MOSI itp. będzie wyjściem.
    Ale jak to będzie SPI to patrz wyżej co napisał marek_Łódź.
  • #11 6914491
    manekinen
    Poziom 29  
    A czy nie lepiej obydwa procesory wprowadzić w stan resetu, a jednemu z nich odłączyć linię SCK? Wtedy był by to tylko przełącznik na jednej linii. Drugi procesor w stanie resetu na pewno nic nie nada, ani nie zareaguje na sygnały od programatora, jeśli nie dostanie sygnału zegarowego. No, chyba że w stanie resetu wyjściowa linia danych jest ściągana do zasilania lub masy to programator będzie miał problem wcisnąć tam przeciwny stan logiczny... ale to już trzeba by było zajrzeć w notę do rozdziału programowania.
  • #12 6914511
    golas17
    Poziom 16  
    Niezła myśl manekinen... A myślisz, że można zewrzeć ze sobą resety i pozwolić programatorowi resetować układy kiedy to będzie potrzebne, czy raczej dać zworki na każdy reset i wtedy sygnał resetu z programatora w ogóle nie byłby używany? Co sądzisz?
  • #13 6914570
    bolek
    Poziom 35  
    diody, pull'upy i zworka na reset?
  • #14 6914578
    golas17
    Poziom 16  
    Może rozwiń myśl bolek...
  • #15 6914597
    bolek
    Poziom 35  
    No bo resety masz tylko do programowania(?). Rozdzielasz je dwiema diodami, jednego usypiasz (zworka) żeby nie kolidował w komunikacji pomiedzy PC a drugim prockiem i gitara. Nie?;/
  • #16 6914649
    manekinen
    Poziom 29  
    No ok, jednego usypiasz resetem, a drugiego programatorem? Więc obydwa będą w stanie resetu i obydwa odpowiedzą na sygnał programatora.

    Albo nie zajarzyłem :)


    DODANO

    golas17 napisał:
    A myślisz, że można zewrzeć ze sobą resety i pozwolić programatorowi resetować układy kiedy to będzie potrzebne, czy raczej dać zworki na każdy reset i wtedy sygnał resetu z programatora w ogóle nie byłby używany? Co sądzisz?

    Oczywiście że może to robić programator. Próbuje doczytać w nocie jak się zachowuje linia MISO po podaniu resetu, nie bardzo widzę. Ale mikroprocesor przejdzie w tryb programowania dopiero po wysłaniu instrukcji "programming enable" liniami SCK i MOSI, więc bez linii SCK takiej instrukcji nie otrzyma nawet - i możliwe że linia MISO będzie wejściem które nie będzie przeszkadzało w kominikacji drugi uC - programator. Musiał byś sprawdzić praktycznie albo doczytać gdzieś w jakiejś dedykowanej nocie atmela o ISP.


    DODANO

    Cytat:
    The Port B pins are tri-stated when a reset
    condition becomes active...

    I tyczy się to wszystkich portów. Więc resetujesz obydwa, od tego niechcianego odłączasz MOSI albo SCK aby nic nie odebrał.
  • #17 6914769
    bolek
    Poziom 35  
    No w sumie tak, masz racje. Nawet nie wiem na tą chwile czy programator daje tylko impuls resetu, czy ciągły stan.

    Można by jeszcze inaczej. Zrobić tak soft że wciśniecie jakiegoś guzika, spowoduje ustawienie ISP jako wejścia. Oczywiście trzeba tez odciąć od niego ten reset
  • #18 6914882
    golas17
    Poziom 16  
    Sprawdziłem na pająku twój pomysł manekinen. Wszystko działa poprawnie. Resety połączyłem i podłączyłem pod programator. Sterowałem tylko linią SCK. Mam jeszcze pytanie: czy jest to uniwersalny? Czy może w przypadku gdybym miał na przykład 8 uC na jednej płytce, to resetów nie mógłbym połączyć razem? (czy nie stało by się nic wyjściu programatora? jakieś przeciążenie etc.?)
  • #19 6915067
    manekinen
    Poziom 29  
    8 układów mówisz? Sporo to będzie przełączników... Na pinie resetu jest wewnętrzny rezystor podciągający (nie pamiętam teraz jaki), najlepiej zmierz ile prądu potrzeba do ściągnięcia resetu w dół, i zakładając że wyjście programatora da 20mA, policz ile procesorów możesz podłączyć... jak się okaże że za mało, dasz odpowiedni tranzystor...

    Dobrze wiedzieć że działa :)
  • #20 6915093
    rpal
    Poziom 27  
    Drogi kolego chcesz wyważyć otwarte drzwi zerknij na ten link który zawiera schemat minimodułu dla Atmega16 i zwróć uwagę na kość 4053B. Dzięki zastosowaniu tego scalaka pozbędziesz się problemu przełączania końcówek SPI podczas procesu programowania. Proste i bezawaryjne poza tym obywa się bez przełączników mechanicznych czy też dip-ów. Koszt rzędu 1-2 zł.Link
  • #21 6917725
    golas17
    Poziom 16  
    Interesująca kostka, ale nie widzę dla niej zastosowania w moim układzie. Dwa komunikujące się procesory i programowanie jednego lub drugiego z nich... To by musiały być trzy komplety sygnałów przełączane przez tą kosteczkę. A ty jak to widzisz rpal?
  • #22 6919515
    rpal
    Poziom 27  
    Dwie kości i jeden przełącznik. Przełączanie kości następuje zerowym poziomem resetu więc przęłącznik spełniałby swoją role nie powodując zakłoceń. Stała dodatnia polaryzacja wymuszona poprzez oporniki pod sygnałem reset dla każdego z procesorów załawia sprawe. No chyba ze wolisz DIP-y wybór nalezy do Ciebie.
  • #23 6920870
    golas17
    Poziom 16  
    Programowanie kilku mikrokontrolerów przez jedno złącze isp
    Coś takiego wykombinowałem. O to chodziło? Proszę o sprawdzenie
    Zakładam zworkę na piny 1 i 2 SV1 wtedy kiedy chcę żeby procesory normalnie pracowały i się komunikowały lub wtedy kiedy chcę programować atmega8 a zdejmuję zworkę wtedy kiedy chcę programować atmega16. Będzie to działać?
    I jeszcze jedno. Połączyłem resety razem. Chyba tak powinno być prawda?
  • #24 6922329
    rpal
    Poziom 27  
    golas17 napisał:
    Połączyłem resety razem. Chyba tak powinno być prawda?

    Przyznam się że nie mam głowy do analizowania schematu ale dwa resety razem to nei najlepszy pomysł ponieważ linia reset podczas programowania wprowadza przez podanie sygnału LOW, procesor w stan programowania więc czym będziesz przełaczał procesory ? co najwyzej przełacznikiem? Dlatego też jeśli linie reset puścisz przez przełącznik podciągając kości przełącznika analogowego przez oporniki do +VCC to własnie w ten sposób osiągniesz wybór odpowiedniego procesora. Zatem jeszcze raz, reset tak jak w podanym przeze mnie przykładzie strobuje przełącznik 4053 natomiast musi on być przełączany w zależności od wyboru procesora na odpowiednią kość 4053.
  • #25 6922605
    golas17
    Poziom 16  
    Tym sposobem który opisujesz da się zaprogramować jeden lub drugi procesor, ale jakoś nie mogę znaleźć sposobu żeby jeszcze normalnie się komunikowały przez spi. Jeżeli znajdziesz chwilę czasu to namaluj jakiś schemacik. Dzięki
  • #26 6923041
    rpal
    Poziom 27  
    W linku masz schemacik. Cała sztuczka polega na tym że stosujesz "elektroniczny przekaźnik". W normalnym stanie któremu odpowiada poziom HIGH na zwartych liniach A,B,C, linie MOSI,MISO,SCK są "wypuszczane" na zewnątrz i można je traktować jak linie procesora używane dowolnie, np. do komunikacji po SPI albo do czegokolwiek innego w twoim układzie.
    Jeśli te linie otrzymają poziom LOW, który jest uzyskiwany z programatora następuje przełączenie linii MOSI,MISO,SCK na końcówki programatora a "układ" wisi w powietrzy bo został rozłączony od procesora. Dzięki temu programowanie nie jest zakłócone co może wystąpić kiedy masz na tych samych liniach MOSI,MISO,SCK układy które są skierowane swoimi wyjściami w stronę tych końcówek procesora. Ma to miejsce np. w ukłądach SPI(pamięci, przetworniki, ect...).
    Ponieważ linie A,B,C są sterowane poziomem napięć od linii RESET i przełączanie wymusza programator z tego powodu, raz muszą być na stałe podłaczone do RESET-u procesora , dwa muszą mieć wymuszony poziom HIGH za pomocą opornika np. 10k podłączonego do +VCC a co najważnejsze dla ciebie powinny być przełączane jakimś przełącznikiem aby wybierać właściwy do zaprogramowania układ. Czy teraz już zajarzyłeś ? :) O schemat mnie nie proś, sam sobie napisz kiedy pojmiesz o co chodzi. Masz wędkę a ryby łów sam :)
  • #27 6923088
    MatrixCat
    Poziom 11  
    Nie prościej byłoby po prostu odcinać zasilania do tych procesorów, które nie mają być zaprogramowane? Czy reset, czy zasilanie, i tak wszystkie procesory muszą stanąć żeby zaprogramować jeden procesor. Przy np 8 procesorach to już trzeba zadbać o jakąś adresację (chociażby ręczną na DIPswitchach) a bez bootloadera a la Arduino i własnej aplikacji programującej... Kiedyś kombinowałem jak po szynie RS485 zdalnie podać program do jednej z wielu jednostek, ale prostsze okazało się wyciągnąć jednostkę przeprogramować i włożyć z powrotem. =)
  • #28 6924079
    golas17
    Poziom 16  
    Myślę, że zajarzyłem. Zamieszczam schemat. W trakcie programowania mastera (atmega16) układ slave (atmega8) dostaje co prawda sygnały mosi, miso, sck, ale nie jest resetowany więc traktuje to jako przychodzące dane z którymi nic nie zrobi(tak mi się wydaje). Natomiast kiedy programuję slave, to master nie ma dostępu do slave - linie mosi, miso,sck są rozdzielone pomiedzy masterem i slavem. Zworką wybieram który układ chcę programować (ewentualnie przełącznikiem).
    Co do odcinania zasilania... Pomysł też pewnie skuteczny, ale jeżeli poniższy układ jest poprawny to zastosuję właśnie takie rozwiązania ponieważ wydaje mi się bardziej eleganckie.
    Programowanie kilku mikrokontrolerów przez jedno złącze isp
  • #29 6924340
    downybear
    Poziom 11  
    [quote="golas17"]Myślę, że zajarzyłem. Zamieszczam schemat.

    Witaj,
    zrobiłem coś takiego kilka lat temu i działa bez problemu.
    Układ może być znacznie prostszy :).

    Wystarczy NIE podawać zegara programującego (clk), na procesor, którego NIE programujesz, a wszystkie pozostałe nogi mogą być zwarte na zawsze (o ile to możliwe w danym systemie).

    W moich systemach załatwiałem to kluczami analogowymi 4066 albo 4052.
    4052 wymaga mniej logiki, tylko adresujesz jedną nogą wyjście na jeden lub drugi procesor.

    405x ma nawet do 4- multiplekserów, a więc elegancko masz nawet 4 procki do programowania i tylko adresujesz na który z nich ma iść CLK.

    Idąc dalej możesz na 405x przełączać więcej niz jeden sygnał, jeśli linie programujące procków nie mogą być zwarte na stałe.

    Mariusz
  • #30 6924798
    golas17
    Poziom 16  
    W momencie kiedy odłączam tylko sam sygnał SCK, a pozostałe linie komunikacyjne są zwarte będzie problem. W sytuacji kiedy akurat trwa programowanie jakiegoś układu slave - w tym samym czasie master może wystawiać na linie danych jakieś informacje które zmieszają się z programem wgrywanym do kości. Także kicha.
REKLAMA