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

ATMEGA8 Tryb CTC: Konfiguracja stanów wyjść OCR1A i OCR1B

FastProject 20 Kwi 2018 21:28 1662 37
  • #1 17179154
    FastProject
    Poziom 28  
    Witam, robię sterowanie czasowe pewnym układem i próbuję wykorzystać do tego tryb CTC.

    Ustawiam tak rejestry:
    Tccr1a = 00110000 / COM1A1 COM1A0 COM1B1 COM1B0 FOC1A FOC1B WGM11 WGM10
    Tccr1b = 00001100 / ICNC1 ICES1 - WGM13 WGM12 CS12 CS11 CS10

    Ocr1a = 65530 / liczy długo, dużo więcej jak okres czasu który potrzebuje
    Ocr1b = 200 / okresy czasu ustawiane w programie

    Wg tabelki i ustawionych wyżej rejestrów oraz to jak ja rozumiem tą tabelkę to:
    ATMEGA8 Tryb CTC: Konfiguracja stanów wyjść OCR1A i OCR1B
    Timer1 liczy do OCR1A i się automatycznie zeruje. Nie powinien wtedy zmienić stanu portu OCR1A (PORTB.1), bo COM1A1=0 i COM1A0=0.
    Timer1 gdy wcześniej doliczy do OCR1B powinien ustawić port z OCR1B (PORTB.2) w stan wysoki, bo COM1B1=1 i COM1B0=1

    Czy dobrze rozumiem działanie tego truby z wykorzystaniem OCR1B? Czy poza rejestrami Tccr1a i Tccr1b muszę coś jeszcze ustawiać aby PORTB.2 został ustawiony gdy Timer1 doliczy do OCR1B? Czy może ustawienie COM1B1=1 i COM1B0=1 powosuje że PORTB.2 jest ciągle w stanie wysokim?

    Pytam bo jestem w trakcie testowania i wygląda to tak, że PORTB.2 jest u mnie ciągle w stanie wysokim, niezależnie od stanu licznika. Nie więc czy robię jakiś czeski błąd czy o czymś zapomniałem w konfiguracji. Oczywiście PORTB.2 ustawiony jako wyjście.
    Chciałbym aby w momencie gdy timer doliczy do OC1B, to PORTB.2=1 i najlepiej zrobić to bez wykorzystania obsługi wektorów przerwań.
  • #2 17179173
    excray
    Poziom 41  
    Najpierw uruchomiłeś licznik a dopiero później ustaliłeś zawartość OCR1B. Czyli:
    - uruchamiasz licznik: TCNT1 = 0, OCR1B =0
    - następuje porównanie: TCNT1 = OCR1B - zgadza się. Licznik robi to o co go poprosiłeś czyli ustawia PB2 w stanie wysokim
    - zmieniasz zawartość OCR1B ale to już nie ma znaczenia. Pin PB2 został ustawiony.
  • #3 17179186
    FastProject
    Poziom 28  
    Hmmm, no ale przecież jak timer doliczy do MAX (OCR1A) to sam się wyzeruje i powinien liczyć od nowa. Więc nawet jak już uruchomiłem licznik a dopiero później ustawiłem zawartość OCR1B. TO po kolejnym odliczaniu już powinno być dobrze?

    Dodam, że w programie chcę manualnie w momencie zerowania Timera ustawiać także PORTB.2 na 0. I będzie to między OCR1B, a OCR1A, czyli niedługo po tym jak PORTb.2 zostanie ustawiony przez Compare z OCR1B.

    excray napisał:
    - zmieniasz zawartość OCR1B ale to już nie ma znaczenia. Pin PB2 został ustawiony.
    w takim razie kiedy mogę lub wyzeruje się PORTB.2?

    W wszystkich przykładach z internetu jakie widziałem ustawianie portów po zrównaniu się Timera z rejestrami OCR1A/B jest realizowane na obsłudze przerwań i to mnie zastanawia czy tak to musi być zrobione czy czegoś nie rozumiem.
  • #4 17179245
    excray
    Poziom 41  
    FastProject napisał:
    Hmmm, no ale przecież jak timer doliczy do MAX (OCR1A) to sam się wyzeruje i powinien liczyć od nowa.

    Owszem, ale co to ma wspólnego z pinem PB2?
    FastProject napisał:
    w takim razie kiedy mogę lub wyzeruje się PORTB.2?

    W tym trybie? Nigdy. Sam musisz go wyzerować. Przeczytaj opis: "1 1 Set OC1A/OC1B on Compare Match (Set output to high level)". Nigdzie nie ma tam mowy o jakimkolwiek zerowaniu. Jeśli chcesz aby po doliczeniu do max. się zerowało - czyli chcesz generować sygnał PWM - musisz uruchomić licznik w trybie PWM, a nie CTC. W trybie CTC z opcji "automatycznego machania nóżką" masz tylko "toggle". A moim zdaniem najbardziej zbliżonym trybem, do tego o którym myślisz, jest tryb 15, czyli Fast PWM ze zliczaniem do OCR1A. Oczywiście, podobny efekt można osiągnąć też w trybach 8, 9 i 14.
  • #5 17179281
    FastProject
    Poziom 28  
    No ale ja właśnie zeruje PORTB.2 ale coś nie idzie go wyzerować.
    Robię regulację fazową sieci....kwarc 11.05920MHz (prescaler timera 256) narazie tylko testowo
    Detekcja zera co 10ms: zeruję PORTB.2, zeruje timer
    Timer odlicza to co w OCR1B i ustawia PORTB.2
    Timer liczy sobie dalej do 65530 = ponad 1sekundę (przypadkowa wartosć ale większa od okresu sieci)
    Zanim timer doliczy do OCR1A to przychodzi kolejne zero sieci i jest zerowany z PORTB.2.

    No ale u mnie PORTB.2 ciągle =1 więc szukam problemu.
  • #6 17179315
    excray
    Poziom 41  
    I co ja mam Ci powiedzieć? Kodu nie załączyłeś. Powodzenia życzyć mam? Podejrzewam, że zapomniałeś o tym, że po ustawieniu bitów COM1Bx to licznik przejmuje kontrolę nad pinem. Więc aby Twoje zerowanie było skuteczne musisz wykonać:
    - wyzerować bity WGM1Bx
    - wyzerować pin
    - ponownie ustawić bity WGM1Bx
    Ale to tylko takie moje wróżenie z fusów.
  • #7 17179348
    FastProject
    Poziom 28  
    Robię to w Bascom, oto program...

    Kod: VB.net
    Zaloguj się, aby zobaczyć kod
  • #8 17179379
    excray
    Poziom 41  
    Moim zdaniem:
    1. w ogóle nie potrzebujesz trybu CTC. Normal w zupełności wystarczy, ale to szczegół.
    2. Watchdog resetuje Ci procka. Od momentu uruchomienia do 1 resetu masz "waitms" na co najmniej 1100ms a ustawiłeś go na 1024ms.
    Ale ja nie znam/nie używam BASCOMa więc moje uwagi sam zweryfikuj na poprawność.
  • #9 17179403
    FastProject
    Poziom 28  
    Z watchdogiem masz racje, akurat zmieniałem opóźnienia przed wysłaniem programu wiec zostało po 500ms.
    Ale to niestety nie to, nawet bez watchdoga nie działa to poprawnie.
    Na oscyloskopie w momencie obsługi przerwania od zera sieci widać bardzo krótkie zerowanie PORTB.2 trwa ono jedynie 900ns i cholera wie czemu tak szybo się ponownie ustawia na 1.
  • #10 17179420
    excray
    Poziom 41  
    Spróbuj tak:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod
  • #11 17179433
    FastProject
    Poziom 28  
    Po tym PORTB.2 nawet nie drgnie w stronę stanu niskiego.
  • Pomocny post
    #12 17179443
    excray
    Poziom 41  
    Użyłeś tej wersji która obecnie jest widoczna powyżej? Bo na początku wkleiłem z błędem. Jeśli tak, to spróbuj jeszcze tej:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #13 17179461
    FastProject
    Poziom 28  
    Wygląda na to że przebiegi teraz są generowane prawidłowo i zmieniają się co 500ms (wyraźne różnice opóźnień na PORTB.2), ale żarówka tylko przygasa na chwile, tzn nie widać znacznej zmiany jasności co 500ms.
    Możliwe, że problemem jest coś na płytce, jakiś problem sprzętowy.
  • #14 17179488
    excray
    Poziom 41  
    A jak wygląda schemat połączeń dla tego PB2?
  • #15 17179492
    FastProject
    Poziom 28  
    EDIT...nic już nie kumam...zmęczenie materiału.

    Wymieniłem optotriaka, załączam go co 20ms, co 1s i działa jak należy, żarówka sobie pulsuje wiec sprzętowo powinno być ok.
    Program w takiej postaci:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod

    poprawnie generuje przebiegi zgodnie z zerem sieci u ustawia opóźnienia, a mimo to nie widać zmian jasności żarówki.

    Schemat standard..:
    ATMEGA8 Tryb CTC: Konfiguracja stanów wyjść OCR1A i OCR1B
  • #17 17179521
    FastProject
    Poziom 28  
    Co do dławika RC to nie ta droga, robiłem masę układów bez RC i nie było problemu czy to bez RC czy to warystora.

    UPDATE...jest lepiej. W między czasie kombinowałem za bardzo i zmieniłem sposób wyzwalania INT0.
    Jak zmienię na Config Int0 = Rising to widać zmiany jasności żarówki, ale przy takim programie:

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


    gdzie wartości OCR1B=200 żarówka przez chwila miga i następnie ustawia się na stabilną jasność. Wydaje mi się, że ma to coś wspólnego z tym co jest w OCR1A i stanem po zerowaniu gdy timer dolicza do MAX=OCR1A, ale to już sprawdzę jutro.

    Narazie dziękuje za pomoc. Potrenowałem z wariantami CTC, coś się nauczyłem, coś przypomniałem. Do czasu dokończenia programu zostawię temat otwarty. Może zmienię CTC na inny tryb, ale już widać, że jest ok.

    Dobranoc.
  • #18 17179525
    excray
    Poziom 41  
    Timer nie dolicza do OCR1A bo go zerujesz co 10ms. Nie wiem jak wygląda detekcja zera u Ciebie ale może być tak, że pin jest zerowany odrobinę za późno i zdąża jeszcze załączyć triak na następny cykl.
  • #19 17179535
    Konto nie istnieje
    Konto nie istnieje  
  • #20 17179671
    excray
    Poziom 41  
    nowyARM napisał:
    Po co dwa rezystory przy triaku?

    Słuszna uwaga. Pewnie niedopatrzenie. W "oryginale" mamy, ale między G a T1:
    ATMEGA8 Tryb CTC: Konfiguracja stanów wyjść OCR1A i OCR1B
  • #21 17179684
    Konto nie istnieje
    Konto nie istnieje  
  • #22 17179705
    excray
    Poziom 41  
    Nie do końca się zgodzę w jednej kwestii, a mianowicie tych 2-3V. W układach z załączeniem w zerze jak najbardziej. Ale w układach gdzie triak jest załączany w dowolnym momencie, to przy załączeniu na szczycie sinusoidy, potencjał na rezystorze wynosi nawet 330V. Co prawda czas trwania takiej sytuacji to tylko kilka us, ale jakby nie patrzeć wyjątek jest.
  • #23 17179715
    Konto nie istnieje
    Konto nie istnieje  
  • #24 17179761
    FastProject
    Poziom 28  
    nowyARM napisał:
    FastProject napisał:

    Schemat standard..:
    ATMEGA8 Tryb CTC: Konfiguracja stanów wyjść OCR1A i OCR1B

    Po co dwa rezystory przy triaku?


    A ten drugi jest dlatego, że na obu stronach PCB mam grubą ścieżką która chciałem "przeskoczyć" wiec dałem rezystor, z lenistwa dałem 2x220R.
    Jednak nawet po zwarciu tego rezystora R5 mruganie dalej występuje.

    Załączam filmik:



    Przy Ocr1b = 200 jest to mruganie, i jest to mniej więcej w połowie, czyli mniej więcej w szczycie sinusoidy.
    Gdy dam więcej, np Ocr1b=250 to już nie mruga.
  • #25 17179779
    Konto nie istnieje
    Konto nie istnieje  
  • #26 17179788
    FastProject
    Poziom 28  
    One nie są połączone, bo i po co? PCB....ATMEGA8 Tryb CTC: Konfiguracja stanów wyjść OCR1A i OCR1B ...ścieżka L od AC IN idzie na warstwie Top i Bottom płytki. Warystora nie ma.

    Dodam że to mruganie występuje tylko podczas zmian OCR w pętli głównej. Jak na stałe wpiszę jego wartości i nie zmieniam nigdzie indziej to jest ok, żarówka nie mruga.
    Coś tu jeszcze z programem trzeba zmienić...działam.
  • #27 17179808
    excray
    Poziom 41  
    FastProject napisał:
    Jednak nawet po zwarciu tego rezystora R5 mruganie dalej występuje.

    - sprawdź z tłumikiem RC. W końcu to góra 10 minut roboty aby to sprawdzić.
    - w miejsce VR1 wlutuj opornik 330R
    Jeśli w main zmieniasz wartość rejestru OCR1B z 300 na 100 a licznik zliczył już powyżej 100 to będzie Ci migać. Powinieneś zrobić sobie zmienną tymczasową do której ładujesz dane w pętli głównej, a zawartość OCR1B aktualizować w przerwaniu. Albo wybrać inny tryb.
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod
  • #28 17179826
    Konto nie istnieje
    Konto nie istnieje  
  • #29 17179830
    FastProject
    Poziom 28  
    Niepotrzebny jest R5 i to R5 idzie nad ścieżkami...mam go aktualnie zwartego. Jest wiec tylko R4= 220R.

    Jaką żarówkę...świetlówkę fazowo...nie obrażaj mnie? No bez przesady...mam zwykłą żarówkę 100W(nawet nie halogenowa)
  • #30 17179841
    Konto nie istnieje
    Konto nie istnieje  
REKLAMA