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

Generowanie przebiegu prostokątnego w trybie CTC

Yaro126 05 Sie 2010 15:02 2448 10
REKLAMA
  • #1 8367739
    Yaro126
    Poziom 20  
    Witam,

    Próbuję wygenerować za pomocą mikrokontrolera Atmega 8 dwa przebiegi prostokątne przesunięte w fazie o 90 stopni. Mam timer1 ustawiony w tryb CTC i wyjścia OC1A oraz OC1B ustawione w tryb toggle.

    Czy istnieją jakieś bity w rejestrach konfiguracyjnych timera1, które definiowałyby stany początkowe wyjść OC1A i OC1B? Chodzi właśnie o przesunięcie przebiegu na którymś wyjściu o 90 stopni.
  • REKLAMA
  • #2 8367750
    tadzik85
    Poziom 38  
    Stan początkowy zapewne ustawia się jako ustawienie wyprowadzenia w odpowiedni stan przed startem licznika. Tylko jak ty chcesz osiągnąć to 90stopni?
  • REKLAMA
  • #3 8367763
    Yaro126
    Poziom 20  
    Przepraszam, nie 90 a 180... Pomyliłem się. No i właśnie w tym problem że ustawienie portu w sposób o którym mówisz nic nie daje. Przebiegi na obu wyjściach są identyczne.
  • Pomocny post
    #4 8368004
    tymon_x
    Poziom 30  
    Przebiegi komplementarne? Taka praca licznika nie jest możliwa, niektóre układy (np. Attiny25) mają dodatkowe zanegowane wyjście licznika, w ten sposób że nigdy nie będą miały w tym samym czasie tego samego stanu. Jeśli Ci o takie coś chodzi, proponuje zmienić uC. Jeśli nie są ważne dla Ciebie czasy przełączenia stanów, zaneguj bramką.
  • #5 8368093
    Yaro126
    Poziom 20  
    Zastosuję bramkę, bo czasy przełączania są dla mnie ważne... Dziękuję za zainteresowanie:D
  • REKLAMA
  • #6 8368741
    tmf
    VIP Zasłużony dla elektroda
    Zapisywanie pod adresy pinów IO rzeczywiście nic nie da,bo funkcja danego pinu portu jest blokowana przez timer, a on nie korzysta z przerzutnika wyjąciowego portu IO. Spróbuj po ustawieniu żądanych parametrów trybu CTC (wartości compare match) wywołać na jednym pinie zdarzenie compare match programowo - poprzez zapis do FOC1A/FOC1B. To powoduje, że procesor zachowuje się jakby było compare match i zmieni ci na przeciwny stan pinu OC1A lub OC1B (jeśli masz je w trybie toggle). Po takiej jednorazowej operacji piny powinny być już na dobre przesunięte o 180 stopni, bo kolejne compare match będzie je zmieniać na przeciwne. Powinno zadziałać.
  • #7 8368758
    zumek
    Poziom 39  
    tymon_x napisał:
    Przebiegi komplementarne? Taka praca licznika nie jest możliwa...

    Ależ jest jak najbardziej możliwa, a przebieg na OC1B, można przesunąć o dowolny kąt, w stosunku do przebiegu na OC1A lub na odwrót.
    Aby to osiągnąć, należy dokładnie zapoznać się z dokumentacją w sekcji dotyczącej Timer1 i odrobinę pomyśleć :)


    EDIT: Jeden ze sposobów, podał właśnie kol. tmf
  • #8 8368926
    tymon_x
    Poziom 30  
    Do tego FOCnx to nie mam zaufania, nie wiem jak się zachowa w Atmedze8. Też kiedyś tak próbowałem (chyba jeden z modeli Atmegax8), wymuszając stan na pinie OCnx, aby osiągnąć przebieg komplementarny. Stanęło, że drugie wyjście licznika zamarzło w stanie wysokim. W innym przypadku pomogło na jeden cykl, i póżniej znowu wróciło do normy. Dopiero programowe wymuszanie za każdym razem na B pomogło. Dlatego o nim nie wspomniałem, złe przeżycia (;
  • REKLAMA
  • #11 8469488
    Yaro126
    Poziom 20  
    No więc sprawa wygląda tak, że zastosowałem finalnie bramkę żeby odwrócić przebiegi, ale wcześniej długo kombinowałem jak to zrobić programowo... Na początku próbowałem z FOCnx bez rezultatu, procesor ignorował całkowicie ten bit, potem kombinowałem ze zmianą wartości rejestru OCR1B i wtedy wpisując do niego wartość 1 udało się odwrócić przebieg o 180° z pozoru idealnie, ale po ustawieniu na oscyloskopie mniejszej podstawy czasu okazało się że jednak minimalnie przebiegi się rozjeżdżają... Zmieniając wartości rejestru OCR1B dało się przesuwać pzebiegi o dowolny kąt ale... "Ale" było takie, że występował jakiś dziwny hazard, który polegał na tym, że przebieg początkowo odwrócony potrafił w pewnym momencie znów stać się przebiegiem identycznym jak na drugim wyjściu. Działo się tak najczęściej przy zmianie wartości rejestru OCR1A bez zatrzymania timera, więc po namyśle napisałem program tak, że przy każdym naciśnięciu przycisku zmieniającego częstotliwość, timer był zatrzymany, wyzerowany i wprowadzane były nowe wartości do rejestrów, niestety to też nie pomogło... Nie wiem co mogło być przyczyną takiego działania...
REKLAMA