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

ATXMega32d4 - Zmiana zegara taktującego - co jest źle w kodzie?

mag32 11 Wrz 2014 11:45 837 8
  • #1 11 Wrz 2014 11:45
    mag32
    Poziom 19  

    Usiłuję zmienić zegar taktujący procesor ATXMega32D4 na wewnętrzny RC32MHz, niestety, nie udaje mi się tego zrobić. Coś przypuszczalnie robię źle - to oczywiste - i nie w kolejności?
    Posiłkowałem się książką AVR Praktyczne Projekty.
    Wciąż jednak taktowanie to 2MHz i nie da się tego przełączyć.
    Proszę o pomoc, poniżej załączam kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 8
  • #2 11 Wrz 2014 15:10
    tmf
    Moderator Mikrokontrolery Projektowanie

    Co zwraca funkcja OSC_wait_for_rdy? Nie masz timeoutu? Druga sprawa - program kompilujesz z optymalizacja ustawioną na -Os?

    0
  • #3 11 Wrz 2014 15:43
    mag32
    Poziom 19  

    No właśnie, co ona zwraca, a co zwracać powinna, zwraca dekrementowaną wartość zmiennej czas.

    Cytat:
    Nie masz timeoutu?

    Nie wiem, o jaki timeout chodzi?

    Tak. Ustawione mam -Os

    Jeśli OSC.STATUS oraz OSC_XOSCRDY_bm dadzą wartość true to pętla While zostanie opuszczona, poczekamy 1ms po czym zwrócimy wartość zmiennej czas większą od zera czyli true. Jeśli zaś czas zejdzie do wartości 0 zanim oscylacje się wyrównają to funkcja zwróci wartość 0 czyli false.

    0
  • #4 11 Wrz 2014 16:18
    JarekC
    Poziom 27  

    Witam,

    1. Jak rozpoznajesz że masz w dalszym ciągu 2MHz?

    2. Sprawdź czy zegary poprawnie się stabilizują tzn funkcja OSC_wait_for_rdy zwraca TRUE

    3. Pamiętaj przed podaniem na PLLa zegar 32MHz jest zawsze dzielony przez 4

    4. Jeżeli chcesz używać 32MHz to użyj raczej DFLL zamiast PLL (będziesz mógł go dokładnie skalibrować)

    Pozdrawiam
    JarekC

    0
  • #5 11 Wrz 2014 18:00
    mag32
    Poziom 19  

    1. Uruchomiłem timer z przerwaniem i liczę nim do przepełnienia, czy włączam zmianę czy nie częstotliwość generowana na pinie portu jest ta sama - pomiar oscyloskopem.
    2. No tak, to sprawdzę.
    3. Czyli jeśli sygnał zegarowy pobieram z zegara RC2MHz to mam taktowanie 2MHz z PLL a jeśli taktuję RC32MHz to z PLL mam 8MHz? W każdym razie sygnał przepełnienia powinien być po zmianie co najmniej 4 razy częściej. Ustawiałem też mnożnik pętli razy 9 i dopiero powyżej, czyli przy 10 się procesor nie uruchamiał, czyli osiągnął 200MHz a co za tym idzie taktowanie było 2MHz.
    Chcę używać 32MHz a z DFLL pobawię się dopiero jak to opanuję, z tym, że do tego potrzebny jest jeszcze kwarc zewnętrzny a w tym układzie nie mam go jak dopiąć. Czeka mnie i tak zmiana PCB, więc wtedy to ogarnę również, chyba, że dam wtedy zewnętrzny układ generatora taktującego, to się jednak dopiero okaże.

    0
  • Pomocny post
    #6 11 Wrz 2014 19:21
    tmf
    Moderator Mikrokontrolery Projektowanie

    Na PLL idzie RC32/8, ale tylko jeśli z PLL korzystasz, jeśli taktujesz procesor z RC32 bez PLL to żadnego dzielenia nie ma. Masz sprzętowy debuger? Jeśli nie to odpal powyższy kod w symulatorze i sprawdź końcowy stan rejestrów. Szybko dojdziesz gdzie tkwi błąd. Generalnie jeśli korzystasz z RC32 to w CLK.CTRL wybierz jako źródło RC32 a nie PLL.

    0
  • #7 12 Wrz 2014 09:11
    mag32
    Poziom 19  

    Weług PDFa na PLL idzie RC32M/4, na symulatorze debugera w Atmel Studio pokazuje mi 1MHz cały czas i nie potrafię tam znaleźć rejestrów od peryferiów, widzę tylko rejestry rdzenia.
    Mam programator PDI AVRISP mkII, więc bez debugera.
    Ale idąc po kolei:
    Wykonuję Clk_en()

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Czyli włączam oscylator wewnętrzny RC32MHz
    Następnie odblokowuję zmianę konfiguracji
    Kod: c
    Zaloguj się, aby zobaczyć kod

    i tutaj pojawia się pytanie, czy oby na pewno jest to prawidłowa kolejność? Czy nie powinno być to odwrotnie a więc najpierw odblokowanie konfiguracji a dopiero potem włączenie oscylatora?

    Teraz sprawdzamy, czy oscylator pracuje stabilnie i tutaj nieco zmodyfikowałem procedurę OSC_wait_for_rdy(OSC_RC32MEN_bm);
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Procedura zapala mi bit portu a więc zwraca wartość dodatnią czyli generator się stabilizuje.
    Teraz mamy SelectPLL(OSC_PLLSRC_RC32M_gc, 1);
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Jako źródło przekazuję sygnał z generatora RC32MHz przez pętlę PLL a więc podzielony przez 4 zgodnie z AN co powinno mi dać na wyjściu 8MHz a więc w stosunku do zegara systemowego 2MHz jest to cztero krotne przyśpieszenie.
    Wniosek z tego, że przynajmniej o tyle powinny wzrosnąć na wyjściu procesora impulsy generowane w pętli głównej programu.
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    A tak się nie dzieje, czyli, wnioskuję, że jednak nie następuje zmiana częstotliwości taktowania a ja niestety wciąż nie znam tego przyczyny.

    0
  • Pomocny post
    #8 12 Wrz 2014 10:08
    tmf
    Moderator Mikrokontrolery Projektowanie

    Jeśłi chodzi o odblokowanie zmiany konfiguracji to chroniony jest tylko rejestr wyboru źródła taktowania CPU, więc tylko przed tą instrukcją należy odblokować rejestr zezwolenia na zmianę. PLL na razie sobie podaruj, po prostu w CLK.CTRL wybierz RC32M jako źródło zegara taktującego.

    0
  • #9 12 Wrz 2014 11:03
    mag32
    Poziom 19  

    Nareszcie się udało, dziękuję wszystkim za udzieloną pomoc.

    0