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

Atmega 328 PB - losowa synchronizacja kanałów Compare w generacji częstotliwości

czajnik01 31 Paź 2017 16:16 1338 18
  • #1 16791772
    czajnik01
    Poziom 11  
    Witam

    Spotkałem się z następującym problemem. Korzystam z generacji częstotliwości przy użyciu obydwu kanałów Compare. Niestety otrzymuję zupełnie losowo (przynajmniej w moim postrzeganiu) synchronizację 2 przebiegów. Raz są zgodne raz są w przeciwfazie.

    Czego nie konfiguruję lub konfiguruję źle że tak się dzieje?

    Kod: VB.net
    Zaloguj się, aby zobaczyć kod
  • #2 16792849
    Konto nie istnieje
    Konto nie istnieje  
  • #3 16792885
    Konto nie istnieje
    Konto nie istnieje  
  • #4 16793231
    Konto nie istnieje
    Konto nie istnieje  
  • #5 16793274
    tmf
    VIP Zasłużony dla elektroda
    @niveasoft Dałem koledze szansę, aby zająć merytoryczne stanowisko i poprzeć swoją wypowiedź cytatem z noty. Poisałeś, żeby autor poczytał w instrukcji do procesora, a teraz piszesz o jakimś Bascomowym trybie CTC. Przykro mi, ale to kompletne bzdury. Jeszcze raz - procesor ma dwa niezależne kanały compare. Zdarzenie w jednym z nich nie ma żadnego wpływu na zdarzenia generowane przez drugi. Jeśli ustawimy ich wartość powyżej wartości top licznika, to oczywiście żadne zdarzenie nie zajdzie. Co jest oczywiste. Ale nie ma się to nijak do tego co napisałeś:
    niveasoft napisał:
    W Instrukcji do procesora przeczytasz że kiedy następuje CompareA to CompareB nie nastąpi nigdy jeśli ma wartość większą od CompareA... chcesz żeby zmieniał stan przy CompareA to inaczej skonfiguruj ;)
  • #6 16793290
    Konto nie istnieje
    Konto nie istnieje  
  • #7 16793312
    tmf
    VIP Zasłużony dla elektroda
    Nie, nie napisałeś tego. Dopiero teraz to napisałeś. W dodatku wykorzystanie CTC do generowania dwóch zsynchronizowanych przebiegów, mających jak sądzę różnić się wypełnieniem jest raczje kiepskim pomysłem. Nie wypowiadam się, czy autor w ogle używa CTC czy trybu podstawowego licznika, bo Bascomowe zaklęcia zostawiam magikom.
  • #8 16793448
    Konto nie istnieje
    Konto nie istnieje  
  • #9 16793822
    tmf
    VIP Zasłużony dla elektroda
    @niveasoft Nigdzie nie piętnuję Bascoma i nigdzie w moim poście nie napisałem, że nateży to zrobić w C. Gdybyś widział wszystkie działania moderacyjne na tym temacie to zauważyłbyś nawet, że kilka postów o wyższości jednego nad drugim wyrzuciłem do kosza, jako bez związku z tematem.
    Piszę tylko o tym, że twoja skrótowa wypowiedź mogła być co najmniej myląca. A ponieważ nie znam Bascoma, więc nie wypowiadam się w jakim trybie pracuje ten timer, ale na oko (może się mylę) nie jest to tryb CTC.
  • #10 16794623
    Konto nie istnieje
    Konto nie istnieje  
  • #11 16796443
    czajnik01
    Poziom 11  
    Bascom mimo, że uważany za narzędzie nieprofesjonalne nie jest taki zły. Pisze w nim programy po kilkanaście.. kilkadziesiąt tysięcy linii kodu i jestem ogólnie zadowolony. Za niewielkie pieniądze mamy narzędzie do pracy ze wsparciem. Tam gdzie nie domaga wstawiam asm i do przodu...

    Zamysłem moim było generowanie na pinach OC1A i OC1B przebiegów konkretnej częstotliwości o wypełnieniu 50% nie PWM. Opisywanym smaczkiem jest to że ważne jest aby te przebiegi były identyczne (czytaj zgodne w fazie czyli jak na Jedym jedynka to na drugim też jedynka)

    Z tego wynika że:

    - Praca w trybie Timer (config = timer )
    - Praca w trybie Compare Toggle (compare = toggle)
    - Praca w trybie CTC (clear_timer = 1)

    Jak ktoś słusznie zauważył w składni bascoma jest wpisany config nie na timer a na counter. Jest to składnia przepisana z helpu bascoma. Przetestowałem również składnię:

    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    I generalnie niewiele to zmienia. Obydwie składnie działają tak samo. Czyli obydwie generują przebieg o identycznej częstotliwości ale losowym początku.

    Przed konfiguracją timera i rozpoczęciem generowania przebiegu ustwiam już obydwa porty na ten sam poziom. (mimo że katalog twierdzi że nie ma to znaczenia bo ja przełącza się wyjścia w tryb compare to rejestr port nie ma wpływu na piny OC1nX.)


    Znalazłem w katalogu wzmianke że istnieją fity FOCA i FOCB odpowiednio TCCR1C.7 i TCCR1C.6 służące do wymuszania stanu początkowego wyjścia. Niestety wzmianka jest lakoniczna i nie ma konkretnego przepisu jak nich korzystać. Czy zapisywać stan bezpośrednio czy sprawdzać stan i w razie potrzeby zmieniać stan na przeciwny zapisując jedynkę.

    Moje próby zabawy tymi bitami nie doprowadziły do sensownego rozwiązania tzn.

    Ta sama składnia wymuszana co jakiś czas w programie powoduje inna reakcję na pinach OC1A/B.

    Aktulnie kod:

    Kod: VB.net
    Zaloguj się, aby zobaczyć kod



    Gneruje raz po raz takie np przebiegi... (wybrałem co ciekawsze zgodne niezgode i wogóle z jakimś syfem na początku, niewielkie echa pomiedzy przebiegami wynikają z tego że nóżki spięte są rezystorem)

    Atmega 328 PB - losowa synchronizacja kanałów Compare w generacji częstotliwościDS1Z_Qucik..nt6.png Download (35.15 kB) Atmega 328 PB - losowa synchronizacja kanałów Compare w generacji częstotliwościDS1Z_Qucik..nt5.png Download (34.58 kB) Atmega 328 PB - losowa synchronizacja kanałów Compare w generacji częstotliwościDS1Z_Qucik..nt7.png Download (34.41 kB)
  • #12 16796527
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #13 16796537
    Konto nie istnieje
    Konto nie istnieje  
  • #14 16796708
    czajnik01
    Poziom 11  
    Napisałem takowy kod... i przez ostatnie 100 prób chodzi bezbłednie.. zobaczymy co będzie dalej.

    Kod: VB.net
    Zaloguj się, aby zobaczyć kod



    Świadczyło by to o tym że bity FOCx działają na zasadzie po zapisie jedynką zmieniają stan OCnXna przeciwny.
  • #15 16796819
    Konto nie istnieje
    Konto nie istnieje  
  • #16 16796836
    czajnik01
    Poziom 11  
    Dziekuję Bede testował :)

    Dodano po 3 [godziny] 4 [minuty]:

    No nie do końca to chce działać tak jak napisaliśmy... bascom nie przyjmuje składni timer + clear_up ale problem okiełznałem na dwa sposoby...

    Bascomowy:

    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    I napiechotny... podziękowania dla kolegi niveasoft

    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Rozwiązanie drugie działa ładniej... początek wejścia w genrację jest ładny ustalony. W pierwszym widać moment ustalania się wyjść względem warunków if.
  • #17 16797658
    Konto nie istnieje
    Konto nie istnieje  
  • #18 16798011
    czajnik01
    Poziom 11  
    Tak sobie przypomniałem trochę i stan rejestru nie powinien być pobierany. Tylko od razu zapis bo SBR robi And że zmienna.

    Nie sprawdzałem co bascom tłumaczy pod komenda set Ale po mojemu to...

    Set trrc1b.7

    Równa się asm

    SBR tccr1b , 0b10000000
  • #19 16798059
    Konto nie istnieje
    Konto nie istnieje  
REKLAMA