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

Xmega DMA - Wysyłanie danych z Tablicy z konkretnym punktem staru i końca

Wiking18 13 Gru 2014 19:58 1584 10
REKLAMA
  • #1 14219682
    Wiking18
    Poziom 14  
    Witam
    Mam taki problem mianowicie chcę użyć jednej Tablicy np COS[10]

    chcę wysłać to przez DMA ale od miejsca 5 kończąc na miejscu 4 ale
    instrumentując czyli chciałbym wysłać 5,6,7,8,9,0,1,2,3,4 nie naruszając przy tam tablicy czyli modyfikacja jej nie wchodzi w grę.

    Obecnie robię to w ten sposób że ustawiam to tak.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Jednak wysyła mi dane tylko do 9 później już jest kosmos chciałbym aby licznik przeładował się nie na końcu tablicy ale w punkcie zaczęcia -1 jak to zrobić?

    Bo obecnie robię to w ten sposób że tworze tablicę większą o 5 a blok długości wpisuję sztywno na 10 działa ale przy większej tablicy jest to marnowanie miejsca tym bardziej że co jakiś czas muszę przeliczać i MCU ma więcej roboty.

    Czy jest w ogóle taka możliwość aby DMA mogło tak działać?

    Pozdrawiam Damian
  • REKLAMA
  • REKLAMA
  • #3 14221869
    Wiking18
    Poziom 14  
    Witam
    Nie wiem czy dobrze zrozumiałem.

    Mam użyć kanału DMA np0 na wysłanie z tablicy [10] dziesięcio elementowej

    zaczynając od numeru tablica[5] i ustawiając blok danych na 5
    po wysłaniu paczki układ mi przeładuje na DMA1 które mam skonfigurować tak aby
    zaczynał od tablica [0] i ustawić blok też na 5.
    Jeżeli dobrze zrozumiałem i tak to ma wyglądać to nasuwa mi się kolejny problem.
    Przesyłanie danych ma być pojedynczym strzałem wyzwalanym przez licznik

    ale dane muszę wysyłać jednocześnie do 3 rejestrów.
    CCABUF
    CCBBUF
    CCCBUF
    do każdego z przesunięciem czyli z innego miejsca tablicy i konkretnego miejsca tablicy.więc albo braknie mi kanałów DMA albo można jakoś da się skonfigurować te oba kanały aby tak wysyłały w trzy miejsca do każdego z przesunięciem.
    Pozdrawiam.
  • Pomocny post
    #4 14222043
    tmf
    VIP Zasłużony dla elektroda
    Rejestry CCxBUF leżą w pamięci tuż po sobie, można więc do nich transmitować dane z wykorzystaniem jednego kanału DMA.
  • #5 14225952
    Wiking18
    Poziom 14  
    Witam próbuje w symulatorze na przykładzie jak poniżej.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Obecnie staram się ogarnąć jak wysłać jednym kanałem DMA przy jednym zdarzeniu do 3 różnych miejsc i nie bardzo mi to wychodzi tzn jak wpisałem transmisje 4 bajtową to udało mi się zapełniać oba rejestry na raz ale to chyba nie tak ma wyglądać.
    Prosił bym o bliższe nakierowanie albo jakiś prosty przykład jak skonfigurować DMA aby wysyłać Do trzech czy nawet do czterech rejestrów naraz. (ja testuje na symulatorze na burst ale normalnie będzie to single)
    Chodzi mi głównie o konfigurację DMA bo z tym mam problem Z trybem buforowym udało mi się osiągnąć cel o który pytałem na początku jednak w przypadku 2 kanałów się sprawdza ale też nie wiem jak to zrobić dla trzech kanałów.

    Ogólnie chcę osiągnąć Cel taki że DMA wysyła mi 2 bajty do jednego bufora po czym wysyła do drugiego bufora dwa bajty z innego miejsca tablicy po czym wysyła do trzeciego bufora z jeszcze innego miejsca tablicy.

    Pozdrawiam i proszę o podpowiedź.
  • REKLAMA
  • Pomocny post
    #6 14226115
    tmf
    VIP Zasłużony dla elektroda
    Oczywiście w żaden sposób nie zrobisz tak, aby jeden kanał DMA transmitował dane do trzech różnych, niepowiązanych ze sobą adresów. Ja rozumiałem twój opis tak, że przy jednym wyzwoleniu chcesz przesłać dane do 2-4 rejestrów CCxBUF, ale z kolejnych adresów tablicy. Jeśli to wszystko ma być chaotycznie porozrzucane to się nie da. Prościej zmienić ułożenie elementów w tablicy. Napisz lepiej co chcesz osiągnąć, a nie jak chcesz to osiągnąć, to prędzej ktoś wymyśli jak sobie z tym poradzić bez karkołomnych sztuczek.
  • #7 14230065
    Wiking18
    Poziom 14  
    tmf napisał:
    Oczywiście w żaden sposób nie zrobisz tak, aby jeden kanał DMA transmitował dane do trzech różnych, niepowiązanych ze sobą adresów. Ja rozumiałem twój opis tak, że przy jednym wyzwoleniu chcesz przesłać dane do 2-4 rejestrów CCxBUF, ale z kolejnych adresów tablicy. Jeśli to wszystko ma być chaotycznie porozrzucane to się nie da. Prościej zmienić ułożenie elementów w tablicy. Napisz lepiej co chcesz osiągnąć, a nie jak chcesz to osiągnąć, to prędzej ktoś wymyśli jak sobie z tym poradzić bez karkołomnych sztuczek.


    A już myślałem że robię coś źle.

    a więc tak chciałbym użyć najmniejszej liczby kanałów DMA do robienia sinusa 3 F temat powiązany z Link

    Chcę użyć też najmniejszej ilości tablic bo ją bardzo często będę musiał przeliczać szczególnie przy starcie i zwalnianiu lub dynamicznym zachowaniu.

    chciałbym wypróbować dwie opcje sterowanie 6 kluczami oraz sterowanie 3 pół mostkami
    co do pierwszego to wystarczy połowa sinusa dla jednego przebiegu wykorzystuje podwójne buforowanie i dobrze się sprawdza natomiast aby użyć 3 przebiegów muszę to przesunąć o 120° więc albo przesuwam dane z tablicy o 120° opóźniam w jakiś sposób wysłanie danych do następnych kanałów albo tamte przesyły wysalam stanem licznika pierwszego przesuniętym o 1/3 czasu np pierwszy 0 drugi 1/3 trzeci 2/3
    Szukam optymalnego rozwiązania MCU nie chce obciążać bo może dojść jeszcze kilka rzeczy takich jak wysyłanie danych wyświetlacz czujniki no i przeliczanie tablic. (licząc sinusa ze wzoru przy 32MHz udało mi się osiągnąć 36Hz i 99.9 procent czasu spędzał w przerwaniu) przeliczając tablice na bieżąco przy 2 przebiegach udało mi się osiągnąć 76Hz i 99.9 siedział w przerwaniu. Dlatego chcę tablice przeliczać tylko raz do zadanej częstotliwości wysyłać to DMA i mieć MCU do innych rzeczy.
    Tak naprawdę przy sposobie pierwszym to muszę generować 6 przebiegów.

    Pozdrawiam.
  • REKLAMA
  • #8 14230410
    tmf
    VIP Zasłużony dla elektroda
    To się do tego totalnie źle zabierasz. Po pierwsze po co chcesz liczyć sinusy tych samych wartości w kółko? Nie prościej je stablicować we FLASH? Nawet jeśli sobie wymyślisz, że liczysz z dokładnością do stopnia to ci to zajmie jakieś 720 bajtów bez optymalizacji, czyli tyle ile zajmuje funkcja licząca sinus, tyle, że wynik otrzymasz w 2 taktach CPU. Dwa - jeśli są to trzy sinusy przesunięte o 120 stopni, to można stworzyć jedną tablicę z trzema elementami/krok reprezentującą wartość PWM dla poszczególnych kanałów - efekt - jeden zajęty timer i jeden kanał DMA, wszystko przesyła się bez udziału MCU. Tryb podwójnego buforowania można wykorzystać w sytuacji w której zmieniasz wartość elementów tablicy, na czas przeliczeń. Warto też rozważyć wykorzystanie układu AWeX, któy umożliwa sprzętową dystrybucję sygnałów sterujących.
  • #9 14230619
    Wiking18
    Poziom 14  
    Witam
    Dokładnie dlatego zdecydowałem się na tablicę a nie na liczenie rzeczywiste.

    Piszesz tablica 3 elementowa czy masz na myśli tablicę z "n" próbkami np 36 dla każdego bufora czyli łącznie 108 próbek 4 bajtowych a wysyłać blokami nie po 2 bajty a po 4 albo 6 ? dzisiaj spróbuje to wykorzystać i postaram się zamieścić efekty.
    obecnie robiłem to na jednaj tablicy ale wykorzystywałem 3 kanały DMA efekt był taki niestety mam oscyloskop 2 kanałowy wiec ten fioletowy wykrej jest zapisany jako referencyjny Xmega DMA - Wysyłanie danych z Tablicy z konkretnym punktem staru i końca
  • #10 14230902
    tmf
    VIP Zasłużony dla elektroda
    No dokładnie, czyli tablica mająca n-wierszy, w każdym po 4 wartości PWM dla kanałów CCA, CCB i CCC. Po 4 wartości, a nie 3, gdyz DMA może przesyłać po bajcie, dwa bajty, cztery bajty lub 8 bajtów. Ale to, że będzie nadpisywał CCD jest bez znaczenia.
  • #11 14233155
    Wiking18
    Poziom 14  
    Witam

    W ten sposób mam załatwione sterowanie pół mostkami (które mają jedno wejście tranzystory LO są zaprzeczeniem HI)

    Ale żeby sterować osobno 6 tranzystorami (bo ten sposób też chcę wypróbować)
    muszę osobno wysyłać sygnał na dolne tranzystory i albo robię drugą tablicę co jest proste jednak do przeliczenia mam wtedy 2 tablice ,albo tą samą wysyłam drugim kanałem od tyłu jednak wysyłanie od tyłu tablicy 16 bitowej nie działa tak jak powinno. Bo DMA bierze dane po 1 bajcie i wychodzi groch z kapustą.

    Więc pytam cze jest sens się mordować i próbować wysyłać tablice od tyłu czy lepiej zrobić drugą tablicę. (dla dolnych tranzystorów)

    Pozdrawiam
REKLAMA