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

[Atxmega128A1U][Bascom] - Niestabilna praca na zewnętrznym kwarcu 16MHz

KJ 15 Kwi 2016 02:58 1872 12
  • #1 15604591
    KJ
    Poziom 31  
    Witam.

    Mam w urządzeniu cztery Xmegi128A1U. Wybrałem takie z powodu dużej ilości dostępnych timerów. Moduł z xmegami stanowi generator "instrumentu" midi. Zadanie do wykonania jest bardzo proste: odebrać dane z midi i wrzucić odpowiednią wartość (odczytaną z tabeli) do odpowiedniego timera. Wszystko w sumie bardzo dobrze działa do puki układy pracują na wewnętrznym zegarze. Problem zaczyna się gdy chcę przełączyć na kwarc który wydaje mi się że powinien być mimo wszystko dokładniejszy od wewnętrznego - dokładność generowanej częstotliwości wyraźnie się poprawiła. W praktyce i tak muszę ograniczyć taktowanie xmeg do 16MHz gdyż zakres częstotliwości które chcę generować daje się przy takim taktowaniu i prescale dla timerów równym 8 uzyskać z bardzo małym błędem czego nie mogę zrobić przy zegarze 32MHz i w sumie niema potrzeby podnosić taktowania. Podobne urządzenie z powodzeniem działa od kilku lat na zwykłych megach8- skusiłem się na xmegi jak już pisałem ze względu na ilość timerów co umożliwia generowanie większej liczby "głosów" bez konieczności wkładania większej ilości uC. W czym problem? Jedna z xmeg nie zawsze chce ruszyć na kwarcu. W chwili obecnej do wszystkich czterech uc jest wgrany dokładnie ten sam hex z programem testowym. Efekt jest taki że jeden uC co któreś włączenie zasilania nie startuje ale wystarczy zbliżyć palec lub sondę oscyloskopu aby zaczął działać - co swoją drogą skutecznie uniemożliwia jakąkolwiek diagnostykę przyczyny. Wszystkie wyprowadzenia VCC i GND są poprawnie podłączone na pewno dolutowane i posiadają w niewielkiej odległości kondensator ceramiczny 100n - sprawdziłem to już 5 może więcej razy. Kwarc posiada kondensatory 18pF do masy - próbowałem je także zamienić na 22pF i usunąć całkowicie - bez zmian co jest dla mnie dość dziwne. Generator startuje(lub nie) bez kondensatorów tak samo jak z. W dodatku layout pcb wokół wszystkich czterech uc jest w zasadzie identyczny tak pod względem ilości zastosowanych elementów jak pod względem geometrycznym - zaprojektowany dla jednego uC i skopiowany dla pozostałych 3 wiec nie upatrywałbym tu problemu. Ostatecznością jest wymiana uC na inny egzemplarz ale wolałbym tego uniknąć ze względu na ryzyko uszkodzenia PCB - oprócz xmeg jest jeszcze układ cpld Xilinx XC95144XL, wszystko w obudowach TQFP100 a PCB dwustronne. Czy ktoś miał podobny przypadek z tą xmegą i ma pomysł co jeszcze można sprawdzić? Dołączam kod z moja konfiguracją zegara:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #2 15605073
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #3 15605131
    tmf
    VIP Zasłużony dla elektroda
    Tak jak pisze @atom1477 pokaż layout płytki, dla kwarcu 16 MHz kondensatory powinny być rzędu 8-12 pF, ale dokładnie możesz je policzyć jeśli poznasz pojemności kwarcu z noty. Jest jeszcze jeden problem - BASCOM. Zobasz na wygenerowany asembler, jak wygląda procedura przełączania zegara. Być może tu jest problem. Próbowałeś odpalić program w debuggerze i sprawdzić krok po kroku konfigurację zegara? XMEGA ma bity stanu poszczególnych generatorów, więc od razu zobaczysz czy generator się wzbudza, czy nie. Być może problemem w funkcji konfiguracji zegarów jest to, że nie czeka na stabilizację drgań generatora i w efekcie układ dystrybucji zegara odrzuca taką konfigurację.
  • Pomocny post
    #4 15605228
    Jaca
    Poziom 31  
    Zobacz, czy masz ustawiony XOSCPWR w XOSCCTRL (4 bit). Jeśli nie - ustaw go.

    EDIT:

    W BASCOM'ie będzie to:

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #5 15605289
    KJ
    Poziom 31  
    Ustawienie OSC_XOSCCTRL.4 rozwiązało problem. Kondensatory wymienię na mniejsze tylko muszę zamówić. Po zmianie OSC_XOSCCTRL.4 na jeden nawet na oscyloskopie widzę że przebieg na kwarcu jest wyraźnie bardziej stabilny.
  • #6 15605900
    ZbeeGin
    Poziom 39  
    "And now for something completely different". Skoro masz cztery procesory taktowane 16MHz to można było pokusić się o jeden zewnętrzny scalony generator i sygnał zegarowy dystrybuować do wszystkich procesorów... Jest duża szansa, że wszystkie procesory pracowałyby synchronicznie, co w przypadku wykorzystania procesorów jako wielogłosowego syntezatora miałoby niebagatelne znaczenie.

    Co prawda, teraz jest już "po ptokach", ale możesz to rozważyć konstruując kolejne wersje.
  • #7 15610039
    KJ
    Poziom 31  
    Myślałem o tym prawdę powiedziawszy ale ostatecznie zdecydowałem się na osobne kwarce. podobne rozwiązanie sprawdza się na zwykłych AVR - tam każdy uc generuje częstotliwości dla jednego kanału midi - 4 kanały bez polifonii. Teraz próbuję zrobić 4 kanały z 4 głosową może nawet 8 głosową polifonią - xmegowe timery się do tego dobrze nadają. Mam jednak przy okazji inne pytanie - wiem że jest na tych uC możliwa konfiguracja w której peryferia taktowane są wyższą częstotliwością niż rdzeń. Pytanie czy jest możliwa konfiguracja odwrotna - timery pracujące z zegarem 16MHz a rdzeń 32MHz - obecnie wszystko działa sprawnie ale chętnie bym wypróbował taką konfigurację o ile to możliwe.
  • #8 15610086
    tmf
    VIP Zasłużony dla elektroda
    Zegar taktujący peryferia może mieć tylko częstotliwość wyższą lub taką samą jak zegar taktujący rdzeń. Niemniej każdy timer ma preskaler, więc nie ma problemu, żeby wszystko puścić na 32 MHz i użyć preskalera dzielącego przez dwa, w efekcie timer będzie taktowany zegarem 16 MHz. Ba, możesz, jeśli preskaler nie ma byc potęgą dwójki wykorzystać jako preskaler dla wszystkich timerów jeden z nich. Zegar można dystrybuować przy pomocy event system.
  • #9 15610599
    KJ
    Poziom 31  
    W tej chwili preskalery w timerach są ustawione na 8 i to jest mój problem - przy 16MHz prescale 8 mam idealną dokładność generowania dźwięków. Przy 32MHz musiałbym mieć prescale 16 w timerach a z tego co widzę kolejnym dostępnym jest 64 co spowoduje że błąd generowanej częstotliwości będzie duży dodatkowo zmniejszy się rozdzielczość regulacji czasu trwania impulsu który jest dość krytyczny. W sumie nie rozumiem dlaczego podział preskalerów w timerach AVR od zawsze jest 1, 2, 4, 8, 64, 256, 1024. Niejednokrotnie przydałby się podział 16 i 32 którego niema :(. Z kolei przy 32MHz prescale 8 braknie timera. Zostawiam wiec jak jest. Będzie musiało się wyrobić przy 16MHz taktowania rdzenia.
  • #10 15610667
    tmf
    VIP Zasłużony dla elektroda
    Masz rację, z zegara taktującego peryferia masz tylko preskaler 8 i potem 16. Ale nic nie stoi na przeszkodzie, aby jeden timer taktować z zegara CLKPER, ustawić na nim zliczanie do 16 i wyjście z tego timera podłączyć pod event system z którego będziesz taktował inne timery. W takim układzie będą one taktowane z 32MHz/16, czy przez dowolną liczbę z zakresu 1-65536 jaką sobie wymarzysz. Co prawda tracisz na tym jeden timer, ale masz to co chcesz.
  • #11 15900106
    KJ
    Poziom 31  
    Ostatecznie pomogło przestawienie bitu XOSCPWR w rejestrze XOSCCTRL na 1 i wymiana kondensatorów przy kwarcach z 18p na 10p. (przy 18p problem po jakimś czasie powrócił) Puki co problemu nie ma ale jakoś nie mam pewności czy to ostateczne rozwiązanie czy za jakiś czas znowu będę kombinował.
  • #12 15900327
    Konto nie istnieje
    Poziom 1  
  • #13 15900801
    KJ
    Poziom 31  
    Generalnie pcb jest i tak do przeprojektowania z kilku innych powodów m.in źle poprowadzonej masy. Co do Slewrate w XC95144XL to z datasheeta wynika że jest on programowalny dla wyjść niemniej jednak nie zwróciłem uwagi na to jak go ustawiam - wydawało mi się to mało istotne przy sygnałach o częstotliwościach nie przekraczających 5kHz.
REKLAMA