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 - [Bascom] Przerwanie INT0 od syg. z generatora

sieger 03 Mar 2013 11:56 3447 12
REKLAMA
  • #1 12010272
    sieger
    Poziom 24  
    Posty: 897
    Pomógł: 27
    Ocena: 31
    Witam

    Na PB0 mam podpięty generator
    Na PB2 powinien się generować prawidłowy sygnał o częstotliwości f/2

    Napisałem kod:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Niestety na oscyloskopie obserwuję coś następującego:

    ATtiny13 - [Bascom] Przerwanie INT0 od syg. z generatora

    Zamiast przełączać stan portu przy każdym narastającym zboczu sygnału z generatora generuje jakieś szpilki
  • REKLAMA
  • #2 12011059
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    1. Wygląda to na błędne zaprogramowanie sposobu zgłaszania przerwania, ale kod wygląda na pioprawny. Taki efekt występowałby przy nie skasowaniu znacznika przerwania, ale wg datasheet znacznik jest kasowany przy wywołaniu procedury.

    2. Nie pomyślałeś, żeby użyć do tego celu zwykłego przerzutnika D w obudowie SOT23-5? Działałby bez drżenia (jitter) i nie trzeba go programować,
  • REKLAMA
  • Pomocny post
    #3 12011443
    seba_x
    Poziom 31  
    Posty: 2071
    Pomógł: 29
    Ocena: 112
    A nie powinno być Config Portb.0 zamiast Pinb.0 ?
  • #5 12011699
    sieger
    Poziom 24  
    Posty: 897
    Pomógł: 27
    Ocena: 31
    @BlueDraco

    Oczywiście, to jest dobry pomysł, ale to jest dopiero początek bardziej skomplikowanego programu. Na razie tylko odpalałem przerwanie i chciałem to przetestować w najprostszej formie.
    Więc y=f/2 to tylko test a nie docelowa funkcja

    @Seba_x

    Według dokumentacji bascoma, temat config port:

    Syntax

    CONFIG PORTx = state

    CONFIG PINx.y = state

    @rs07

    oczywiście mogę spróbować, ale wg podpowiedzi bascoma pin od INT0 znajduje się w portB.0. Uważasz, że B.0 jest błędny dla INT0 i powinienem użyć B.1 ?
  • Pomocny post
    #6 12011727
    Mundi1970
    Poziom 24  
    Posty: 342
    Pomógł: 96
    Ocena: 133
    Na PB0 jest PCINT0, a na PB1 INT0 lub PCINT1.
  • #7 12011822
    sieger
    Poziom 24  
    Posty: 897
    Pomógł: 27
    Ocena: 31
    Zaczęło działać poprawnie. Niedopatrzenie z mojej strony, że PCINT0 i INT0 to różne przerwania.

    Dla pełności tematu. Jak skorzystać z PCINT? Szukałem w manualu i jakieś przykłady w sieci ale nie znalazłem nic czytelnego.
  • REKLAMA
  • Pomocny post
    #8 12012575
    Mundi1970
    Poziom 24  
    Posty: 342
    Pomógł: 96
    Ocena: 133
    Przerwania PCINTx wykonują się przy każdej zmianie stanu logicznego, niema możliwości konfiguracji np. tylko dla zbocz narastającego lub opadającego. Stan zbocza na poszczególnym pinie sprawdzasz w przerwaniu. Attiny13 ma 6 pinów PB.0-PB.5 (PCINT0 do PCINT5) które mogą wywołać przerwanie. I tu jest jedna myląca rzecz :) dla tych pinów jest tylko jeden wektor przerwań w tym wypadku PCINT0. Który pin ma wywoływać przerwanie ustawiasz w rejestrze PCMSK0. Czyli chcesz np. przerwanie z pinu PB4 (PCINT4) i PB5 (PCINT5), przykład z ATmegi2561:
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #9 12014486
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #11 12617296
    sieger
    Poziom 24  
    Posty: 897
    Pomógł: 27
    Ocena: 31
    Aktualnie program wygląda następująco:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Spodziewane działanie:
    po sygnale przejścia od zera program powinien odczekać 2.5ms, załaczyć wyjście sterujące triakiem na 2.5ms i wrócić do oczekiwania aż pojawi się kolejne przejście przez zero - tym razem w przeciwnym kierunku.

    Obecne zachowanie:
    Testuje układ z generatorem sygnałów i oscyloskopem aby wyeliminować błędy wynikające z obwodu zero-crossingu. Gdy sygnał wejściowy TTL zmienia stan na wyjściu pojawia się ten sam stan z opóźnieniem o 2.5ms.

    Nie rozumem dla czego sygnał wyjściowy nie wraca do zera po 2.5ms od włączenia.
    Gdy zmieniam czasy opóźnienia ma to wpływ na czas opźóźnienie przełączenie sygnału wyjściowego ale dalej jest to jakby kopia sygnału sterującego z opóźnieniem a nie sygnał wyzwalania dla triaka.

    Pozdrawiam
  • Pomocny post
    #12 12617467
    Konto nie istnieje
    Poziom 1  
  • #13 12618065
    sieger
    Poziom 24  
    Posty: 897
    Pomógł: 27
    Ocena: 31
    Dziękuję za podpowiedź.

    Rzeczywiście w linii "Triac Alias Pinb.2" wstawiłem coś niezgodnego z zamierzeniem.
    Dałoby się to obejść, gdyby sygnał bramki triaka też wyłączać przypisaniem jedynki.

    Za instrukcją do procesora:

    Cytat:
    10.2.2 Toggling the Pin
    Writing a logic one to PINxn toggles the value of PORTxn, independent on the value of DDRxn.
    Note that the SBI instruction can be used to toggle one single bit in a port.


    Natomiast ciężko mi się zgodzić z pierwszą sugestią, bo w instrukcji Bascom jest napisane:

    Cytat:
    Action

    Sets the port or a port pin to the right data direction.

    Syntax

    CONFIG PORTx = state

    CONFIG PINx.y = state


    Program już działa prawidłowo. Teraz czas na dodanie sterowania kątem zapłonu triaka z potencjometru(przetwornik A/C) i komunikacją szeregową.

    Pozdrawiam

Podsumowanie tematu

✨ Użytkownik zadał pytanie dotyczące konfiguracji przerwania INT0 w mikrokontrolerze ATtiny13, gdzie sygnał z generatora był podłączony do pinu PB0. Po analizie kodu i wskazówkach od innych uczestników dyskusji, okazało się, że pin PB0 odpowiada za PCINT0, a nie INT0, co prowadziło do błędnego działania programu. Użytkownik zmienił konfigurację, aby używać PCINT0, co rozwiązało problem. Dodatkowo, omówiono różnice między przerwaniami INT0 a PCINT oraz ich zastosowanie w kontekście detekcji przejścia przez zero w sygnale. Użytkownik planuje dalsze rozwijanie programu o dodatkowe funkcje, takie jak sterowanie kątem zapłonu triaka.
Wygenerowane przez model językowy.
REKLAMA