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

ATmega3209 TCB PWM sygnał widoczny na sąsiednich pinach

Karol966 28 Cze 2022 11:39 468 7
REKLAMA
  • #1 20078845
    Karol966
    Poziom 31  
    Cześć,

    Bawię się nieznanym przeze mnie dotąd procesorem, ATmega3209. Przyznam, że w starych AVR czy również Xmegach nie miałem okazji sprawdzić podobnego zachowania.

    Mam wyjście PWM np na pinie PA3 (TCB1, 1-WO). Pin ustawiony jako wyjście
    Cytat:
    PORTA_DIR |= PIN3_bm;

    Do póki sąsiednie piny nie zostaną ustawione jako wyjście są na nich widoczne "duchy" (nie wiem jak to się nazywa) właściwego sygnału: ATmega3209 TCB PWM sygnał widoczny na sąsiednich pinach

    Tylko po ustawieniu sąsiedniego pinu jako wyjście sygnał znika (a na kolejnym nadal istnieje). Im dalej od pinu z wyjściem PWM tym niechciany sygnał ma niższą amplitudę.

    To normalne czy wada tych procków?
  • REKLAMA
  • #2 20078858
    excray
    Poziom 41  
    Jeśli sąsiednie piny są ustawione w stanie wysokiej impedancji, co w zasadzie jest błędem, to mogą się na nie poprzez pojemności pasożytnicze przenosić sygnały z sąsiadujących pinów a także indukować zakłócenia z otoczenia. Generalnie musisz ustalić stan tych pinów, albo poprzez zewnętrzne/wewnętrzne rezystory podciągające, albo poprzez ustawienie pinu jako wyjście. Opcją jest wyłączenie pinu jeśli go nie używasz, bądź używasz jako wejście analogowe.
  • REKLAMA
  • #3 20078906
    Karol966
    Poziom 31  
    excray napisał:
    poprzez zewnętrzne/wewnętrzne rezystory podciągające
    - brak efektu, jedynie ustawienie jako wyjście pomaga.
    excray napisał:
    Opcją jest wyłączenie pinu jeśli go nie używasz
    brzmi rozsądnie ale w jaki sposób to się robi dla tych układów? Nie znalazłem na szybko.
  • REKLAMA
  • #4 20078909
    excray
    Poziom 41  
    Karol966 napisał:
    brzmi rozsądnie ale w jaki sposób to się robi dla tych układów? Nie znalazłem na szybko.

    Rejestr PINxCTRL - wartość 4 wyłącza pin.
    Karol966 napisał:
    brak efektu, jedynie ustawienie jako wyjście pomaga.

    Jakich rezystorów używasz?
  • REKLAMA
  • #5 20078949
    Karol966
    Poziom 31  
    excray napisał:
    Jakich rezystorów używasz?
    Wewnętrznych, 10k zewnętrzny (zarówno do GND jak i VCC) rozwiązuje problem ale nie podoba mi się takie rozwiązanie - na każdy pin, na którym może pojawić się pasożytniczy sygnał mam dawać rezystory podciągające?

    Wewnętrzne prawdopodobnie źle aktywowałem bo zamiast:
    PORTC.PIN1CTRL = PORT_PULLUPEN_bm; // co też nie przynosi pełnego sukcesu - poprawia ale nadal widać zakłócenia).
    robiłem:
    PORTC.DIRSET = PIN1_bm; // a nawet cały port 0xff;

    PS. Jak mówiłem, dopiero poznaje te procesory, pierwsze godziny nad nimi spędzam, zrobiłem sobie prostą płytkę do zabawy (poza curiosyty nano z procesorem 4809, które też posiadam). Bardzo fajna sprawa jest z:
    PORTC.PIN0CTRL = PORT_INVEN_bm; // czuję że często będę korzystał z tej funkcji gdy przenoszę kawałek jednego kodu do innego, gdzie okazuje się, że np diody są odwrotną logiką sterowane.
    ATmega3209 TCB PWM sygnał widoczny na sąsiednich pinach
  • Pomocny post
    #6 20080262
    excray
    Poziom 41  
    Jeśli nie stanowi to jakiegoś istotnego problemu, to nie powinieneś się przejmować tymi przesłuchami.
  • #7 20080522
    Karol966
    Poziom 31  
    excray napisał:
    Jeśli nie stanowi to jakiegoś istotnego problemu, to nie powinieneś się przejmować tymi przesłuchami.


    Mi nie przeszkadza ale jeśli miało by mi to kiedyś popsuć humor to po prostu dobrze wiedzieć z czym się ma do czynienia. Niewątpliwie nie wpływa to zjawisko korzystanie choćby na wynik przetwarzania ADC.

    PS. Czym się różni PORTx.OUTSET od PORTx.OUT? Do .OUT wpisuję bezpośrednio wartość, OUTSET wyłącznie ustawia wskazane piny więc używam tego tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Ale czy po staremu przypadkiem nie powinno działać?
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #8 20080589
    excray
    Poziom 41  
    No właśnie te wszystkie PORTCLR PORTSET DIRCLR DIRSET to są smaczki za które lubię nowe mikrokontrolery. Dzięki temu nie musisz stosować klawiaturołomnych kombinacji aby wyzerować pojedynczy pin typu PORT_OUT &= ~(1<<6), tylko piszesz: PORTCLR = 1<<6 lub aby ustawić: PORTSET = 1<<6. Co ważne te operacje są szybsze, więc jak zależy Ci na szybkim wachlowaniu pinem są jak znalazł.
REKLAMA