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.

[LPC1114][C] - częstotliwość timera CT32B0, generowanie przerwania co 1us

Piecia 22 Maj 2014 11:54 1110 13
  • #1 22 Maj 2014 11:54
    Piecia
    Poziom 14  

    Witam,
    Na początek przestawię kod konfiguracji timera:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Funkcja przerwania:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Czyli w skrócie:
    SystemCoreClock = 48MHz,
    W przerwaniu realizowana jest funkcja zmiany stanu na wyprowadzeniu GPIO,
    Przerwanie na MATCH0 skonfigurowane na 1us,

    Podłaczyłem oscyloskop pod wyprowadzenie GPIO i wychodzi że stan jest przełączany co 2us, zamiast 1us, którą chcialbym osiągnąć. Czy w LPC jest możliwość konfiguracji częstotliwości pracy portow, podobnie jak w ST?
    Dodatkowo jeśli chcę zmienić preskaler i match0 na niższe wartości żeby częstotliwość przerwania była większa to niewiele się zmienia (~ 1,7us przy preskalerze = 0 i match0 = 1). Czy jest to powiązane z częstotliwością zmiany stanów na porcie? czy może źle konfiguruję timer?

    z góry dziękuję za pomoc,

    0 13
  • #2 22 Maj 2014 12:45
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Zapewne po prostu nie da się tak szybko wykonywać tego przerwania - trochę realizmu. Przy 48MHz na 1us masz tylko 48 cykli zegara, a samo wejście i wyjście do przerwania (bez realizacji ŻADNEGO KODU), to zwykle w sumie 12-18 cykli. Reszta nie starcza na to co tam robisz, czyli magiczne funkcje realizujące super skomplikowaną operację dostępu do jednego pinu - ot cały sekret.

    4\/3!!

    0
  • #3 22 Maj 2014 13:07
    Grzegorz77
    Poziom 25  

    Trzeba by to napisać w asemblerze.

    0
  • #4 22 Maj 2014 13:12
    Freddie Chopin
    Specjalista - Mikrokontrolery
  • #5 22 Maj 2014 13:16
    Piecia
    Poziom 14  

    Ok ale czy zmiana stanu na IO zabiera aż 20 cykli? poza zmianą stanu nic innego się tam nie dzieje ;]
    funkcja zmiany stanu na wyprowadzeniu:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    oraz odczyt:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    W assemblerze mógłbym przyspieszyć czas wykonywania tych funkcji, czas wejścia/wyjścia przerwania?

    0
  • Pomocny post
    #6 22 Maj 2014 13:21
    Badmaneq
    Poziom 23  

    Code:
    GPIOSetValue( PI_PORT, PI_BIT, ~GPIOGetValue(PI_PORT, PI_BIT))

    Wywołujesz w przerwaniu dwie funkcje, to stanowczo za dużo !
    Spróbuj użyć
    Code:
    LPC_GPIO0->DATA ^= PI_BIT;

    oczywiście w miejsce LPC_GPIO0 odpowiedni port.

    Piecia napisał:
    Czy w LPC jest możliwość konfiguracji częstotliwości pracy portow, podobnie jak w ST?

    Odpowiedzią dla LPC1114 jest ten rysunek:
    [LPC1114][C] - częstotliwość timera CT32B0, generowanie przerwania co 1us
    Jeżeli podzielisz częstotliwość zegara to także dla 18 peryferii podpiętych do magistrali AHB.

    0
  • Pomocny post
    #7 22 Maj 2014 13:24
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Zacznijmy może od tego, że jak chcesz machać pinem z częstotliwością 1MHz to do tego celu wymyślono PWM - to co chcesz zrobić może w końcu Ci się uda, ale to generalnie jest całkowicie bezsensowne, bo ten układ nie będzie miał mocy żeby zrobić COKOLWIEK innego.

    4\/3!!

    0
  • #8 22 Maj 2014 13:36
    Piecia
    Poziom 14  

    W zasadzie to nie mogę zrobić tego na PWM, bo częstotliwość się zmienia, w zależności od wypełnienia, ale to bez znaczenia. Chciałem tylko sprawdzić max jaki można z tego timera wyciągnąć i jak go ogranicza hardware. Czyli temat czysto testowy, nie praktyczny.. Fakt że przy max częstotliwości nie da się nic innego zrobić - zdaję sobie z tego sprawę. Jednak myślałem że wejście w przerwanie trwa mniej cykli niż napisałeś, nie mniej jednak dziękuję za uświadomienie :]

    0
  • #9 22 Maj 2014 13:57
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Piecia napisał:
    częstotliwość się zmienia, w zależności od wypełnienia

    A w czym problem żeby przy PWM zmieniać stosownie zarówno wypełnienie jak i częstotliwość?

    Piecia napisał:
    Jednak myślałem że wejście w przerwanie trwa mniej cykli niż napisałeś, nie mniej jednak dziękuję za uświadomienie :]

    Gdzieś znajdziesz dokładne info, ale wejście to chyba ~12 cykli, a wyjście to chyba ~6. Tak więc generalnie same te operacje zajmują tak ze ~12-18 cykli, +/- oczywiście.

    4\/3!!

    0
  • #10 22 Maj 2014 14:32
    Piecia
    Poziom 14  

    Freddie Chopin napisał:

    Gdzieś znajdziesz dokładne info, ale wejście to chyba ~12 cykli, a wyjście to chyba ~6. Tak więc generalnie same te operacje zajmują tak ze ~12-18 cykli, +/- oczywiście.
    4\/3!!


    Wg UM rdzeń arm powinien obsłużyć przerwanie w ciagu 15 cykli. (3.5.28 IRQ latency register). Dotyczy to rdzeni ARM Cortex M0. Troszkę mnie to zdziwiło, bo kiedyś wyczytałem, że np ST mają lepsze mechanizmy przerwań co powoduje szybszą obsługę. Jednak wydaje mi sie że nie było to godne zaufania źródło - z tego co pamietam to porównanie różnych armów (NXP, ST, Atmel). Wydaje mi się że przy wykorzystaniu tego samego rdzenia nie powinno być różnicy..

    0
  • #11 22 Maj 2014 15:50
    Grzegorz77
    Poziom 25  

    Piecia napisał:


    W assemblerze mógłbym przyspieszyć czas wykonywania tych funkcji, czas wejścia/wyjścia przerwania?


    W asemblerze mógłbyś zoptymalizować czas do minimum (co do 1 cykla. )
    I jeśli coś jest możliwe do zrobienia to uda się w asemblerze, jeśli czegoś w ASM się nie da to nie uda się to w żadnym innym języku.

    0
  • #12 22 Maj 2014 20:06
    michalko12
    Specjalista - Mikrokontrolery

    Wstęp do przerwań dla początkujących
    http://community.arm.com/docs/DOC-2607

    Tutaj jest podobny temat
    https://www.elektroda.pl/rtvforum/topic2241936-0.html

    Do generowania złożonych przebiegów o częstotliwościach 1MHz+ nadają się wszystkie LPC które mają SCT. LPC800 są fajną opcją przy prostych projektach, a do bardziej złożonych nadają się LPC1500.

    Grzegorz77 napisał:
    W asemblerze mógłbyś zoptymalizować czas do minimum (co do 1 cykla. )

    To nie te rdzenie, żeby takie rzeczy na nich robić.
    ... ale jak ktoś sie już uprze to:

    Link
    Kod źródłowy

    0
  • #13 22 Maj 2014 22:04
    BlueDraco
    Specjalista - Mikrokontrolery

    Przerwania nie służą do tego, żeby je wywoływać z częstotliwością 1 MHz, nawet na uC działającym na 150 MHz. Do szybkiego machania nogami służą timery, a podejrzewam, że to, co chcesz osiągnąć , łatwo da się zrobić na dowolnym timerze z funkcjonalnością PWM.

    0
  • #14 23 Maj 2014 07:53
    Piecia
    Poziom 14  

    Zgadza się, PWM puszczam i leci, a wszystko jest realizowane hardwarowo. W sofcie tylko zmienia się wypełnienie i częstotliwość. Jednak tj wcześniej napisałem temat i przykład typowo testowy dla sprawdzenia możliwości. Wiadomo że w praktyce do tego celu należy skonfigurować PWM.

    0