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

[ATtiny13] - Jak używać jednocześnie timera CTC i PWM w trybie korekcji fazy?

sarna 11 Lip 2013 10:23 2337 16
REKLAMA
  • #1 12509266
    sarna
    Poziom 24  
    Witam, od jakiegoś czasu zmagam się z programem tylko nie jestem pewien czy jest w ogóle możliwość jego napisania, wszak tiny13 ma tylko jeden timer. Potrzebuję zarówno timera (CTC) jak i PWM w trybie korekcji fazy pytanie więc brzmi: czy mogę użyć obu naraz? Jeśli tak to w jaki sposób? Dotychczas gdy próbowałem to robić zmiana wypełnienia PWM miała wpływ na timer a nie o to chodzi. Innymi słowy: czy PWM może działać bez timera?

    Pozdrawiam
  • REKLAMA
  • Pomocny post
    #2 12509299
    dondu
    Moderator na urlopie...
    Witaj,

    To pytanie jest podobne do pytania, jak nastawić zwykłe radio na dwie różne stacje radiowe by słuchać ich jednocześnie?
    Odpowiedź zapewne znasz :)

    Co do Timera, także odpowiedź znasz chociażby dlatego, że znasz schemat timera i fakt, że aby go ustawić w różne tryby używa się tych samych bitów.

    sarna napisał:
    Innymi słowy: czy PWM może działać bez timera?

    Tak, należy zrobić PWM programowy.

    Opisz więc bardzo dokładnie co potrzebujesz osiągnąć, bo może można wymyślić jakiś trick.
  • REKLAMA
  • #3 12509312
    sarna
    Poziom 24  
    Program ma działać jak automatyczny wyłącznik do odbiornika radiowego, timer ma odmierzać czas i po odmierzeniu np. 5 min ma ładować do PWM kolejną wartość z tablicy charów a więc napięcie za filtrem RC który będzie podłączony do PWM będzie spadało i kolejna dioda na linijce LED zgaśnie. Kiedy będzie miała gasnąć ostatnia dioda będzie wyłączany przekaźnik
    Oczywiście byłoby prościej diody sterować za pomocą rejestrów SIPO ale muszą one (LED-y) służyć oprócz tego do wskazywania częstotliwości radia

    Nie jestem jakoś przekonany do programowego PWM, program musi jeszcze reagować na przyciski itp.. chyba rozważę zmianę na tiny2313
  • REKLAMA
  • Pomocny post
    #4 12509501
    BlueDraco
    Specjalista - Mikrokontrolery
    Nie prościej te diody sterować bezpośrednio z mikrokontrolera? Z ATtiny13 na 3 nogach wysterujesz 6 LED, zostają jeszcze dwie linie do przekaźnika i jakiegoś np. guzika.

    Zostając nawet przy Twoim rozwiązaniu: do czego jest potrzebny PWM "phase correct"? "Fast" nie wystarczy? Bez problemu możesz użyć timera i do generowania PWM i do odmierzania czasu, trzeba to tylko dobrze rozliczyć.
  • #5 12509506
    sarna
    Poziom 24  
    Diod jest 20 i jak już napisałem są sterowane analogowo bo wskazują też napięcie strojenia FM kiedy timer jest nieaktywny
  • #6 12509516
    BlueDraco
    Specjalista - Mikrokontrolery
    No to użyj Fast PWM, jak napisałem wyżej
  • REKLAMA
  • #7 12509525
    sarna
    Poziom 24  
    W trybie fast nie można regulować wypełnienia od zera, nie wiem czy nie będzie to powodować zapalenia więcej niż jednej diody w końcowym czasie odliczania
  • #8 12509607
    BlueDraco
    Specjalista - Mikrokontrolery
    1/256 to prawie 0. Możesz to również skorygować analogowo. Możesz wreszcie wyłączać wyjście PWM kiedy chcesz ustawić 0. To naprawdę żaden problem.

    No i zapewne nie ma realnej konieczności użycia trybu CTC. Przecież timer może generować przerwanie z dowolną częstotliwością, a potem oprogramowanie i tak odliczy właściwy czas.
  • #9 12509678
    sarna
    Poziom 24  
    Czyli powinienem przełączyć timer na tryb Timer Overflow i w obsłudze przerwania zliczać ile razy ono nastąpi? I przy preskalerze /1 wystąpi ono przy 1MHz 3906,25 raza w ciągu sekundy tak? (1M/256)
  • #10 12509746
    BlueDraco
    Specjalista - Mikrokontrolery
    Prawie tak, tylko o ile pamiętam, domyślna częstotliwość zegara wynosi 9.6 MHz. Dokładność jest na poziomie 1..2%, czyli te ułamki możesz sobie spokojnie darować.
  • #11 12509865
    sarna
    Poziom 24  
    Ok, oto mój testowy kod:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Wszytko działa tak jak powinno przynajmniej na to wygląda) ale zastanawia mnie to że dioda miga teraz tak jak powinna czyli 1Hz a mam overflow ustawiony na 5000 to wskazuje na częstotliwość 1,28MHz a attiny jest nowy i fusów nie zmieniałem.. Czyli gdzieś jest błąd ale nie wiem gdzie[/code]
  • #12 12510597
    BlueDraco
    Specjalista - Mikrokontrolery
    Domyślnie masz 9.6 MHz dzielone przez 8, czyli 1.2 MHz. Wszystko się zgadza.

    Po co używasz operatora |= przy inicjowaniu peryferiali?

    Wstaw jakieś usypianie do pętli w main().

    Zmienna timer_overflow_ nie powinna mieć atrybutu volatile. Zamiast tego, podobnie jak indeks, powinna być zadeklarowana wewnątrz procedury obsługi przerwania jako static.

    tab[] powinna być w pamięci Flash, z dostępem przez pgm_read_byte (ale to na później i nieistotne dla poprawnego działania).
  • #13 12510689
    sarna
    Poziom 24  
    Tylko że mam ustawione no prescalling więc czemu jest dzielone przez 8

    Operator użyłem taki jaki był w przykładach w necie, wszystko działało więc się nad tym nie zastanawiałem.. Powinno być po prostu "="?

    zmienną indeks wolę zostawić globalną, będę z niej korzystał w programie głównym, timer_overflow przeniosłem

    Myślałem też nad wykorzystaniem watchdoga jako drugiego timera, może on generować przerwanie zamiast resetowania procesora, co myślisz?
  • #14 12510748
    BlueDraco
    Specjalista - Mikrokontrolery
    Pisałeś, że nie ruszałeś bitów konfiguracji, więc domyślnie zegar jest dzielony przez 8 (nie w timerze, a w generatorze).

    No pewnie, że "=". "|=" jest dla strachliwych :).

    Nie sądzę, żebyś potrzebował drugiego timera - po co właściwie?

    Czy rzeczywiście jest coś do roboty w pętli? Moim zdaniem taki wyłącznik czasowy da się zrobić zgrabniej w samym przerwaniu timera.
  • #15 12510781
    sarna
    Poziom 24  
    Nie widzę sensu w dzieleniu sygnału zegarowego w generatorze skoro jest łatwo edytowalny preskaler no ale ok :-)
    Może i nie potrzebuję tego drugiego timera po prostu chcę wiedzieć jakie są opcje na wypadek gdybym potrzebował

    W pętli będą obsługiwane przyciski, tak chyba będzie najlepiej (a może i nie?)

    Muszę sobie kupić jakąś książkę..
  • #16 12510797
    dondu
    Moderator na urlopie...
    sarna napisał:
    Nie widzę sensu w dzieleniu sygnału zegarowego w generatorze skoro jest łatwo edytowalny preskaler no ale ok :-)
    Może i nie potrzebuję tego drugiego timera po prostu chcę wiedzieć jakie są opcje na wypadek gdybym potrzebował.

    Wykorzystanie timera i przerwania Watchdoga, to jeden z tricków o którym pisałem. W końcu to zwykły bardzo prosty timer mający dodatkowo (jako jedyny) funkcjonalność resetu mikrokontrolera. Jak go wykorzystamy zależy tylko i wyłącznie od nas.


    sarna napisał:
    Muszę sobie kupić jakąś książkę..

    Jeżeli nadal AVR-y to zastanów się nad tą: Język C dla mikrokontrolerów AVR. Od podstaw do zaawansowanych aplikacji.


    EDIT:

    BlueDraco napisał:
    No pewnie, że "=". "|=" jest dla strachliwych :).

    A ja dodam, że wtedy mamy pewność, że nie popełnimy błędu w ustawieniach.
  • #17 12510856
    sarna
    Poziom 24  
    Ok puki co wszystko jest dla mnie jasne, tiny13 powinien wystarczyć
    Książka wydaje się dobrą pozycją ;-)

    Dzięki za pomoc :-)
REKLAMA