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

[Rozwiązano] Synchroniczne taktowanie wielu ATMEGA32/64 z jednym rezonatorem

andrzejlisek 06 Mar 2018 12:19 906 7
  • #1 17083772
    andrzejlisek
    Poziom 31  
    Jak wiadomo, mikrokontrolery ATMEGA są sterowane rezonatorami kwarcowymi. Czy da się wysterować dwa mikrokontrolery (a może nawet trzy) z jednego rezonatora kwarcowego? Jeżeli nie z samego rezonatora, to jak powinien działać generator prostokątny 16MHz zrobiony w oparciu o kwarc 16MHz (lub ewentualnie wielokrotność), żeby dało się podłączyć do XTAL1 i XTAL2?

    Chodzi mi o synchroniczne taktowanie wielu mikrokontrolerów, zakładam, że użycie dwóch niezależnych rezonatorów nie wchodzi w grę, bo zawsze mają jakąś tolerancję i praca może się rozsynchronizować.

    Czy może wystarczy standardowe podłączenie jednego rezonatora z kondensatorami równolegle do wielu ATMEGA64?
  • Pomocny post
    #2 17083852
    tmf
    VIP Zasłużony dla elektroda
    Da się. Piny XTAL to nic innego ja IO wewnętrznego generatora. Z XTAL (nie pamiętam 1 czy 2) możesz sobie pobrać sygna i użyć go do taktowania czegokolwiek, w tym innej ATMegi. Oczywiście jeśli ścieżka będzie dłuższa lub będziesz miał kilka MCU tak połączonych to mogą wystąpić problemy z generowaniem zegara. W takiej sytuacji potrzebny jest dodatkowy bufor lub, co może być prostsze - po prostu kupić nie rezonator kwarcowy, a gotowy układ oscylatora i wykorzystać go do taktowania wszystkich MCU. Pytanie po co? I tak będzie potrzeba synchronizacji działania programów na poszczególnych MCU.
  • #3 17083899
    andrzejlisek
    Poziom 31  
    Mam jeden pomysł w powijakach, ale chodzi mi nie tyle o cel i sens takiego rozwiązania (synchronizacja programów to już inny temat), co o możliwość i sposób jego realizacji.

    Czy chodzi o to, że w jednym użyję generatora wewnętrznego i wtedy z XTAL wyda sygnał prostokątny i z niego mogę wysterować inny MCU, a gdy ten inny MCU to inna ATMega, to tam muszę ustawić taktowanie z generatora zewnętrznego?

    Czy generator wewnętrzny w ATMega32 i ATMega64 ma 8MHz, czy 16MHz? Raz czytałem tak, a raz tak.

    Też myślę, że najprościej jest zastosować taki generator i wysterować z niego wszystkie MCU (tylko nie wiem, czy generuje prostokąt czy sinusoidę):
    https://sklep.avt.pl/generator-kwarcowy-16mhz.html

    Pamiętam, że według dokumentacji ATMegę64 można taktować kwarcem maksymalnie 16MHz. Czy w przypadku generatora, maksymalnie to też 16MHz?
  • Pomocny post
    #4 17083941
    BlueDraco
    Specjalista - Mikrokontrolery
    Nie wygląda mi to na rozsądną decyzję projektową. Może po prostu należy wziąć jeden mikroknroler, który zrobi wszystko, co trzeba, zamiast rozmnażać zadania na trzy ledwie dychające?
  • #5 17084050
    andrzejlisek
    Poziom 31  
    BlueDraco napisał:
    Nie wygląda mi to na rozsądną decyzję projektową. Może po prostu należy wziąć jeden mikroknroler, który zrobi wszystko, co trzeba, zamiast rozmnażać zadania na trzy ledwie dychające?


    Pomysł jest taki, żeby zrobić prosty filtr DSP na Atmega32 lub 64 (akurat ten mikrokontroler znam, mam do niego programator i bardzo łatwo się go programuje i jest dużo opisów obsługi przetworników, timerów itp.), MCU by rejestrował sygnał (np. odpowiednio dostosowany sygnał dźwiękowy), przetwarzał go w czasie rzeczywistym, a potem oddał go jako PWM lub na drabinkę R2R już przetworzony. Chodzi o proste przetwarzanie typu FIR, zakładam, że dla MCU nie będzie to problemem, kiedyś na komputer udało mi się zaimplementować taki algorytm kładąc nacisk na szybkość.

    Głównym problemem jest fakt, że Atmega zawiera tylko jeden ADC. Jak wyczytałem i wyliczyłem, ADC może próbkować z częstotliwością 8-12kHz (w zależności od zegara i preskalera) z rozdzielczością 10bit bądź z wyższą częstotliwością i rozdzielczością 8 bitów, uznałem, że to wystarczy do moich potrzeb. W takim razie, jeżeli chce się mieć dwa ADC (np. dźwięk stereo lub dwa kanały), to już są potrzebne dwa MCU i stąd pytanie o synchroniczne wysterowanie dwóch MCU. Albo, jeżeli bym chciał coś regulować potencjometrem (ADC by odczytywał stan), to też jest potrzebny drugi MCU bądź pogodzenie się z dwukrotnym zmniejszeniem częstotliwości próbkowania.

    Bardzo możliwe, że da się to wszystko zrobić wykorzystując tylko jeden mikrokontroler i wtedy tematu nie ma. To jest raczej "pieśń przyszłości", ale już wiem, że synchroniczna praca wielu MCU jest możliwa i wcale nietrudna.
  • Pomocny post
    #6 17084053
    ghost2000
    Poziom 18  
    W AVR mozna ustawić fuse CLKOUT. Wtedy na wyprowadzeniu CLKO pojawi się zbuforowany sygnał zegarowy.

    Dodano po 2 [minuty]:

    andrzejlisek napisał:
    Głównym problemem jest fakt, że Atmega zawiera tylko jeden ADC. Jak wyczytałem i wyliczyłem, ADC może próbkować z częstotliwością 8-12kHz (w zależności od zegara i preskalera) z rozdzielczością 10bit bądź

    Jak będziesz taktował szybciej niże 200kHz (max 1MHz jak pamiętam) to rozdzielczość spadnie do np 8-bit (szczegóły w nocie). Możesz to wykorzystać i obsłużysz dwa kanały z rodzielczością 8-bit.
  • #7 17084673
    tmf
    VIP Zasłużony dla elektroda
    andrzejlisek napisał:
    Czy chodzi o to, że w jednym użyję generatora wewnętrznego i wtedy z XTAL wyda sygnał prostokątny i z niego mogę wysterować inny MCU, a gdy ten inny MCU to inna ATMega, to tam muszę ustawić taktowanie z generatora zewnętrznego?

    Dokładnie tak. Ten drugi MCU ustawiasz na taktowanie zewnętrzne.
    andrzejlisek napisał:
    Też myślę, że najprościej jest zastosować taki generator i wysterować z niego wszystkie MCU (tylko nie wiem, czy generuje prostokąt czy sinusoidę):
    https://sklep.avt.pl/generator-kwarcowy-16mhz.html

    Może być do taktowania.
    andrzejlisek napisał:
    Pamiętam, że według dokumentacji ATMegę64 można taktować kwarcem maksymalnie 16MHz. Czy w przypadku generatora, maksymalnie to też 16MHz?

    Tak, maksymalna częstotliwość jest taka sama w obu przypadkach.
    andrzejlisek napisał:
    Czy generator wewnętrzny w ATMega32 i ATMega64 ma 8MHz, czy 16MHz? Raz czytałem tak, a raz tak.

    Wewnętrzny oscylator RC może mieć kilka częstotliwości wybieranych fusebitami - np. 1, 2, 4 lub 8 MHz. Dodatkowo może występować preskaler zegara umożliwiajacy dalszy jego podział.
    Wracając do tematu - wrzucenie wszystkiego do jednego MCU, tak jak sugeruje kol. @BlueDraco jest sensowniejszym pomysłem. Możesz zrobić tak jak pisze kol. @ghost2000 i multipleksować wejście ADC, lub użyć innego MCU. Z AVR dwa niezależne przetworniki ADC ma większość XMEGA, w dodatku masz max taktowanie 32 MHz, co da ci niec więcej mocy obliczeniowej. Można też użyć jakiegoś małego ARMa, co da ci zdecydowanie więcej mocy obliczeniowej (operowanie na 32-bitowym słowie), tylko tez trzeba się rozpatrzyć za takim, który ma dwa niezależne ADC lub jeden odpowiednio szybki.
  • #8 17084706
    ghost2000
    Poziom 18  
    andrzejlisek napisał:
    Czy chodzi o to, że w jednym użyję generatora wewnętrznego i wtedy z XTAL wyda sygnał prostokątny

    Nie. Na XTAL bedzie sinus lub cos podobnego do sinusa, na pewno nie prostokąt i amplitusa na pewno nie w zakresie GND...Vcc tylko ok 2V.

    Dodano po 53 [sekundy]:

    tmf napisał:
    Z AVR dwa niezależne przetworniki ADC ma większość XMEGA, w dodatku masz max taktowanie 32 MHz, co da ci niec więcej mocy obliczeniowej. Można też użyć jakiegoś małego ARM

    Nie proponowałem innego CPU bo jak widzę na Elektrodzie, takie rzeczy sa ganione jako pisanie nie na temat.
REKLAMA