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

[AVR] - Fast PWM zagwostka dla trybu nr 7 w Atmega168

mirekk36 21 Lis 2009 12:05 3027 16
  • #1 7289139
    mirekk36
    Poziom 42  
    Witam,

    Może ktoś mi podpowie bo się już pogubiłem. W zasadzie to próbuję dojść do sedna tak z ciekawości bardziej niż potrzeby ale:

    otóż mam sobie procka ATmega168, i chcę ustawić tryb Fast PWM korzystając z Timera0 i wyjścia OC0A

    Jak widać z PDF'a ten timer udostępnia 7 trybów z czego tryb 6 i 4 są Reserved czyli nie dostępne i OK. Tak więc jeśli chcę skorzystać np z trybu 3 to wszystko mi działa pięknie i wydaje mi się, że wszystko rozumiem dokładnie z noty PDF - co i jak tam działa wewnątrz procka.

    Jednak tryb 7 - jak narazie doprowadza mnie do szewskiej pasji - tzn może nie tryb tylko to, że tu już chyba czegoś nie potrafię zrozumieć z noty PDF i mam problem.

    Otóż w dla trybu nr 7 muszę ustawić 3 bity na 1

    WGM20 , WGM10 oraz WGM00 - prawda ? (i robię tak)

    teraz chciałbym pozostawić ustawienia bitów (tak jak miałem w trybie 3): COM0A1 oraz COM0A0 czyli żeby mieć (non inverting mode) no i tu kiszka :( bo na wyjściu OC0A mam cały czas stan niski natomiast jak zmienię te bity na (iverting mode) to cały czas mam stan wysoki bez względu na to co wpiszę do rejestru OCR0A.

    Jedyne co wychodzi to tryb gdy: COM0A0=1 oraz COM0A1=0 czyli na wyjściu OC0A powinienem mieć: Toggle OC0A on Compare Match. przy WGM02 = 1. I to się zgadza - wtedy zmieniając OCR0A uzyskuję płynną zmianę częstotliwości na tymże wyjściu (tyż fajny i przydatny tryb powiedzmy)

    Ale czym w takim raze generalnie różni się tryb 3 od trybu 7 ????? Tzn widzę , że tutaj wartość TOP dla Timera stanowi OCR0A zamiast stała wartość 0xFF jak wtrybie 3. I to mnie właśnie myli, i przez to nie rozumiem jak wykorzystać ten tryb??? podobna sprawa zresztą jest z Phase Correct PWM (tryb 5). No ale myślę, że jak ktoś mi rozjaśni o co chodzi w trybie 7 to resztę zajarzę.

    Oczywiście czytałem już ze 100 razy powyżej opisu rejestrów - rozdział

    14.7 Modes of Operation

    a w nim

    14.7.3 Fast PWM Mode

    ale jakoś - nie wiem czy ślepy jestem czy jak? nie mogę złapać różnicy właśnie dla trybu 7

    nie daje mi to spać po nocach ;) snią mi się koszmary o Timerach itp - więc pomóżcie ;)
  • Pomocny post
    #2 7289286
    zumek
    Poziom 39  
    mirekk36 napisał:
    ...ale jakoś - nie wiem czy ślepy jestem czy jak? nie mogę złapać różnicy właśnie dla trybu 7 ...

    To co masz w tabeli 14-3, dotyczy w zasadzie tylko trybu 3, natomiast tryb 7 jest opisany pod tabelką :P
  • Pomocny post
    #3 7289554
    janbernat
    Poziom 38  
    Taki sam "special case" jest w ATtiny2313.
    Czyli- jeśli dobrze rozumiem- jeśli COM0A1=1 to compare match jest ignorowany i mamy PWM ze 100% wypełnieniem- czyli przebieg stały.
    Jeśli dobrze mi się wydaje - to Atmel mógł to nieco prościej wyjaśnić.
  • #4 7289858
    mirekk36
    Poziom 42  
    janbernat napisał:
    Taki sam "special case" jest w ATtiny2313.
    Czyli- jeśli dobrze rozumiem- jeśli COM0A1=1 to compare match jest ignorowany i mamy PWM ze 100% wypełnieniem- czyli przebieg stały.
    Jeśli dobrze mi się wydaje - to Atmel mógł to nieco prościej wyjaśnić.


    hmmm no właśnie - to wtedy by się zgadzało z tym co obserwuję na wyjściu ale....

    co to za PWM ze 100% wypełnieniem ???? to żaden PWM ;) ... po co w ogóle byłoby pisać w nocie, że jest taki tryb jak 7 - skoro bez zaprzęgania timera mogę sobie wystawić jedynkę na wyjście portu ?

    piszę to żeby się upewnić - tzn czy inni koledzy to potwierdzą że tak rzeczywiście jest ? czy może jakoś to się daje do czegoś wykorzystać w jakiś inny sposób?


    zumek napisał:
    mirekk36 napisał:
    ...ale jakoś - nie wiem czy ślepy jestem czy jak? nie mogę złapać różnicy właśnie dla trybu 7 ...

    To co masz w tabeli 14-3, dotyczy w zasadzie tylko trybu 3, natomiast tryb 7 jest opisany pod tabelką :P


    no tak pod tą tabelką czytałem to także - jednak chyba tu już bardzo zawodzi moja znajomość angielskiego więc postaram się to przetłumaczyć tak jak ja to rozumiem (zapewne się nie popiszę - więc się nie śmiejcie) ale może ktoś mnie poprawi i wtedy wszystko stanie się jasne przynajmniej dla mnie ;)

    Cytat:
    Note: 1. A special case occurs when OCR0A equals TOP and COM0A1 is set. In this case, the Compare
    Match is ignored, but the set or clear is done at BOTTOM. See ”Fast PWM Mode” on
    page 101 for more details.


    Specjalny przypadek zachodzi gdy rejestr OCR0A równa się TOP oraz bit COM0A1 jest ustawiony = 1. W takim przypadku ignorowane jest porównanie Compare Match natomiast ustawianie lub kasowanie (wyjścia chyba) jest dokonywane przy BOTTOM (czyli chyba gdy Timer = 0) Zajrzyj sobie do działu ..... żeby sprawdzić szczegóły.

    tak więc hmmm nawet jak to w ten sposób sobie przetłumaczę to za bardzo nie wiem o co chodzi. tzn w sensie tego np do czego wtedy służy rejestr OCR0A. Bo co to znaczy, że "OCR0A równa się TOP" - że gdy wartość ustawiana przeze mnie ręcznie w OCR0A dojdzie do 0xFF czy o co ???

    sorry za problem - ale może jednak jakoś jeszcze troszkę łopatologicznie choć kawałek wyjaśnienia albo naprowadzenia mnie na dobry/właściwy tor myślenia
  • #5 7290139
    janbernat
    Poziom 38  
    Na str. 95 piszą że MAX jest 0x255 a top to co sobie ustawisz w OCR01A.
    Czyli "specjalny przypadek" chyba oznacza że w trybie 7 można zrobić tylko toggle a a reszty nie.
    Czyli po ustawieniu COM0A1=1 procesor "olewa" nasze ustawienia OCR0A.
    Ciekawy jestem czy po skończeniu cyklu PWM na wyściu pojawia się szpilka czy cały czas jest określony stan.
    Spotkałem się z tym opisem w ATtiny2313 jakiś czas temu i też nie mogłem tego zrozumieć a i nie miałem okazji dochodzić.
    Dobrze że Cię to tak męczy, może się coś wyjaśni.
    Czyli Atmel w ten skomplikowany sposób opisuje że w trybie 7 PWM może chodzić tylko jako "toggle".
    Chyba że ktoś wie na ten temat cos więcej.
  • #6 7290158
    mirekk36
    Poziom 42  
    janbernat --> otóż to - gdyby była opisana tak konfiguracja bitów COM0Ax, że istotne są tylko ich ustawienia w trybie 7 tylko albo 0 albo 1 (dla toggle) a pozostałe czyli 2 i 3 są nie istotne to bym zrozumiał ;)

    ale jak mówię, może o coś tu jeszcze chodzi? (a dopytuję tak bo już chciałbym mieć raz na zawsze rozpracowany temat timerów i ich trybów do samego koniuszka ;)
  • #7 7290295
    janbernat
    Poziom 38  
    Jest jeszcze coś takiego- o czym pisze R. Baranowski- że zamiast OCR można używać ICR w PWM.
    To dotyczy chyba liczników 16 bitowych no i ICR nie jest podwójnie buforowany w trybie PWM a OCR jest.
    Ciekawe jak PWM się wtedy zachowa.
    Ale nie sprawdzałem i aż strach o tym pisać- mirekk36 znów nie będziesz mógł spać.
    P.S.
    Tryby- 8-9, 10-11 i 14-15
  • #8 7290512
    mirekk36
    Poziom 42  
    janbernat napisał:

    Ale nie sprawdzałem i aż strach o tym pisać- mirekk36 znów nie będziesz mógł spać.


    hyhyhy no właśnie ;)

    ... ale tak na poważnie - może ktoś jeszcze napisze coś o tym, jeśli ma jakieś doświadczenia większe - please
  • Pomocny post
    #9 7290780
    ktrot
    Poziom 20  
    Bardzo przydatny tryb chociaż nazwa jest myląca. Wg mnie nazwa tego trybu powinna brzmieć "buffered CTC". Piszesz, że mozna bitami migać bezpośrednio - niby jak? PIND.0=1 PIND.0=0 i dalej co? RJMP to 2 cykle i nie pozwoli to na wygenerowanie równego przebiegu prostokatnego, a jak zmienić częstotliwość? wstawić NOPy? A programowo? Użycie przerwania to 7cykli na wejście + wyjście+kilka cykli na obsługe tych bitów. Nie mówiąc o tym, że wszystkie te metody obciążają procesor. A tak masz tryb do generacji przebiegu prostokątnego (50%) o maksymalnej czestotliwośći fclk/2 i łatwo zmienianej częstotliwośći. Ponadto nie występuje efekt z angielska zwany chyba swing przy zmianie OCR0. Używasz tylko toggle a do wyłączania tego generatora uzywasz bitów COM ustawiając wedle życzenia tryb wysoki lub niski.
  • #10 7291244
    janbernat
    Poziom 38  
    Ale to chyba robi normalny tryb CTC a nie PWM.
    Też sprzętowo.
    I nazwa i opis tego jako PWM w PDF Atmela są mylące.
    No i nareszcie coś ciekawego- a nie "jak włączyć programator".:D
  • #11 7291666
    mirekk36
    Poziom 42  
    ktrot napisał:
    Wg mnie nazwa tego trybu powinna brzmieć "buffered CTC". Piszesz, że mozna bitami migać bezpośrednio - niby jak? PIND.0=1 PIND.0=0 i dalej co? RJMP to 2 cykle i nie pozwoli to na wygenerowanie równego przebiegu prostokatnego, a jak zmienić częstotliwość? wstawić NOPy? A programowo? .....


    nie no co do trybu 7 z wykorzystaniem toggle - to jest ciekawe i to mi działało i rozumiem przydatność tego sprzętowego mechanizmu - czyli wszystko to co opisałeś to się zgadza.

    tak więc najistotniejsze dla mnie jest to, że potwierdzasz iż pozostałe ustawienia bitów COM służą tylko do jakby zatrzymania tego z wybranym ustalonym stanem na wyjściu bez konieczności np zatrzymywania timera itp

    tak więc dzięki za odpowiedź - czyli potwierdziły się spostrzeżenia kolegi janbernat'a

    .... jednak chyba na pewno nie jest to jakoś jasno i wyraźnie opisane ;)

    z drugiej strony - właśnie - ten tryb podobny jest w takim razie to CTC - a dlaczego nazywasz go jakby "biforowanym CTC" ? jeśli oczywiście zechciałbyś się jeszcze podzielić swoimi spostrzeżeniami w tym temacie?
  • Pomocny post
    #12 7291851
    ktrot
    Poziom 20  
    "Buforowany CTC" bo wartość OCR0 po zmianie nie daje efektu natychmiast (jak w normalnym CTC) ale czeka do końca cyklu. W efekcie nie powstaje zaburzenie (swing) przy zmianie wartości OCR0 (czyli czestotliwości). Z tego powodu ten tryb bardziej nadaje się do jakiś wobuloskopo podobnych zastosowań czy do sterowania np przetwornicy.
    Prawdę mówiąc nie wiedziałem, że ten tryb jest w rodzinie mega88 w timerze 8 bitowym. W innych atmegach jest tylko w timerach 16bitowych (timer1 ew. timer3).

    Wyjaśniając nieco bardziej obrazowo: jeżeli w czasie pracy timera w trybie CTC zmniejszysz OCR0 a zrobisz to w momenci kiedy TCNT0 już dochodził do wartości OCR0 to bardzo mozliwe, ze nowa wartość OCR0 bedzie mniejsza od TCNT0. Licznik bedzie liczył więc dalej do 0xff. W efekcie dostaniesz jeden długi okres (pewnie niechciany). Tryb 7 chroni przed tym przypadkiem.
  • #13 7291932
    janbernat
    Poziom 38  
    Jest ten tryb w ATmega48-328 i w ATtiny 2313 dla liczników 8-bitowych.
    I może w innych procesorach.
    Czy jest to spowodowane tym że OCR jest "double buffered" w trybie PWM a ICR nie?
    I czy OCR w innych trybach nie jest podwójnie buforowany?
    Trzeba sprawdzić- jak pisza że jest- to jest a jak nic nie piszą- to nie jest.
    Tylko sie chwalą- a nie napiszą czego nie ma.
    Nareszcie może można się czegoś dowiedzieć.
    Tryb zgodości fazy jest w licznikach 8-bitowych dla tych procesorów.
    Ale wyraźnie tryb zgodności fazy i częstotliwości jest podany jako dostępny tylko dla liczników 16- bitowych.
    Czy sugerujesz ze dla liczników 8-bitowych można uzyskać tryb zgodności fazy i częstotliwości dla ustawienia 7 PWM?
  • #15 7292236
    michalko12
    Specjalista - Mikrokontrolery
    mirekk36 napisał:

    tak więc najistotniejsze dla mnie jest to, że potwierdzasz iż pozostałe ustawienia bitów COM służą tylko do jakby zatrzymania tego z wybranym ustalonym stanem na wyjściu bez konieczności np zatrzymywania timera itp


    Dorzucę jeszcze swoje 3 grosze... (czysta teoria, nie sprawdzana)

    COM0A1..0 = 10 - Clear OC0A on Compare Match, set OC0A at BOTTOM, (non-inverting mode)
    COM0A1..0 = 11 - Set OC0A on Compare Match, clear OC0A at BOTTOM,(inverting mode)

    Cytat:
    A special case occurs when OCR0A equals TOP and COM0A1 is set. In this case, the Compare Match is ignored, but the set or clear is done at BOTTOM


    Do czego to można wykorzystać? Z notki wynika że specjalnym przypadkiem jest wykorzystanie OCR0A jako wartości TOP, czyli tak jest właśnie akurat w przypadku trybu 7. Normalnie OC0A jest zmieniany podczas zrównania się licznika TCNT0 z wartością w OCR0A i podczas osiągnięcia wartości BOTTOM czyli przewinięcia się TCNT0 . Dlatego w trybie 7 porównanie OCR0A z TCNT0 jest wyłączone bo nie ma sensu. Napisane jest też, że jakiekolwiek zmiany na wyjściu OCOA są wykonywane w momencie właśnie przewinięcia się licznika TCNT0. Można to wykorzystać do precyzyjnej w czasie zmiany stanu pinu OC0A. W momencie jak licznik TCNT0 inkrementuje się można zmieniać bity COM0A1..0 bez wpływu na stan wyjścia, wyjście OC0A zostanie dopiero zaktualizowane w momencie przewinięcia TCNT0. W tym momencie generowane jest przerwanie, w którym można zmieniać bity COM0A1..0 i wartość OCR0A, czyli mozna zrobić z tego PWMa i jakby się uprzeć można to wykorzystać np. do obsługi Dallasów.

    Jeszcze raz powtarzam, czysta teoria, nie potwierdzona praktycznie.
  • #16 7297343
    _StinG_
    Poziom 14  
    mirekk36 napisał:

    Otóż w dla trybu nr 7 muszę ustawić 3 bity na 1

    WGM20 , WGM10 oraz WGM00 - prawda ? (i robię tak)



    Hmmm... A czy nie powinny to być bity
    WGM02 , WGM01 i WGM00 .
    Proszę psrawdź, chyba, że to literówka w poście ;)

    pozdrawiam,
    Paweł
  • #17 7297358
    mirekk36
    Poziom 42  
    _StinG_ napisał:
    mirekk36 napisał:

    Otóż w dla trybu nr 7 muszę ustawić 3 bity na 1

    WGM20 , WGM10 oraz WGM00 - prawda ? (i robię tak)



    Hmmm... A czy nie powinny to być bity
    WGM02 , WGM01 i WGM00 .
    Proszę psrawdź, chyba, że to literówka w poście ;)

    pozdrawiam,
    Paweł


    tak, tak - jak już, to literówka w poście, bo pisałem go tak z głowy - ale w programie oczywiście używałem tych co trzeba - inaczej pozostałe tryby by mi nie działały a także ten tryb 7
REKLAMA