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

[C] Atmega16: Dlaczego dioda na PA0 świeci się bez przerwania INT0?

9xxx 28 Mar 2012 23:11 1523 10
REKLAMA
  • #1 10731222
    9xxx
    Poziom 10  
    Witam,

    Dopiero wziąłem się za obsługę przerwań i przeglądając różne artykuły próbuję zrobić prosty program, który zgasi mi diodę. Niestety dioda świeci się non stop, nawet bez użycia przycisku.

    Korzystam z Atmega16. Przycisk mam podłączony do pinu PD2 czyli przerwania INT0, natomiast dioda jest podłączona do portu PA0.

    Program wygląda następująco:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Może ktoś podpowie co robię nie tak?
  • REKLAMA
  • Pomocny post
    #2 10731432
    szelus
    Poziom 34  
    0. Dioda podłączona jest do PA0 i do masy czy plusa?
    1. Wskazane jest jawnie ustawić g inicjalnie na 0.
    2. Pętla główna powinna ustawiać g ponownie na zero po wykonaniu akcji.
    3. Bit PA0 nie ma wartości 2 tylko 1 (to chyba główny problem).
    4. Poczytaj o eliminowaniu efektów drgań styków (debounce).
  • REKLAMA
  • #3 10731464
    dondu
    Moderator na urlopie...
    Nie byłoby tego problemu, o którym pisze szelus, gdybyś zamiast;

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

    stosował:

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

    Co do drgań styków: http://mikrokontrolery.blogspot.com/2011/04/przycisk-drgania-stykow-debouncing.html

    No i tak na wszelki wypadek pokaż schemat, bo tu często są kwiatki, że ho, ho ...
  • #4 10731473
    9xxx
    Poziom 10  
    Co do tego PORTA ^= 0x02; to oczywiście błąd (program mam na drugim kompie i pisząc się pomyliłem, w programie jest PORTA^=0x01.

    Nie wiem czy jest sens schemat wrzucać bo tam jest tylko procek + przycisk wstawiony między masę a PD2 oraz dioda między PA0 a masę.

    O drganiach styków czytałem i wiem jak je wyeliminować.

    Jutro (znaczy już dziś) zastosuję się do waszych porad i zobaczę co z tego będzie :)
  • #5 10731491
    szelus
    Poziom 34  
    Jeżeli tylko przycisk włączony między wejście a masę, to gdzie włączenie podciągania wejścia PD2 (pullup)? I mam nadzieję, że dałeś rezystor w szereg z diodą?
  • REKLAMA
  • #7 10733863
    9xxx
    Poziom 10  
    Ok to wrzucam schemat podłączenia diody i przycisku.

    [C] Atmega16: Dlaczego dioda na PA0 świeci się bez przerwania INT0?

    Faktycznie PULL upu nie wziąłem pod uwagę. Jak dostanę się na kompa z programatorem to zobaczę czy zadziała.
  • #8 10734172
    snnaap
    Poziom 25  
    W programie jest :

    MCUCR=(1<<ISC01)|(1<<ISC00);

    Czyli zbocze narastające wyzwala przerwanie.

    Jest to zabieg celowy czy błąd ?
    Urządzenie ma reagować na naciśnięcie przycisku czy jego puszczenie?

    Pozdrawiam

    PS Nie używaj w jednym programie (1<<...) i _BV(...) Trzeba się na coś w końcu zdecydować :d
  • #9 10734619
    gaskoin
    Poziom 38  
    Nie podłączyłeś zasilania :)
  • REKLAMA
  • #10 10734769
    zumek
    Poziom 39  
    szelus napisał:
    ...
    3. Bit PA0 nie ma wartości 2 tylko 1 (to chyba główny problem).
    ...

    Zdaje się, że głównym problemem teraz, jest brak pull-up'a na PD2 :D
  • #11 10735667
    9xxx
    Poziom 10  
    snnaap napisał:
    W programie jest :

    MCUCR=(1<<ISC01)|(1<<ISC00);

    Czyli zbocze narastające wyzwala przerwanie.

    Jest to zabieg celowy czy błąd ?
    Urządzenie ma reagować na naciśnięcie przycisku czy jego puszczenie?


    Właśnie miało reagować na puszczenie przycisku. Z tym jest OK. Chociaż tak na prawdę, tu nie miało to zbytniego znaczenia, ponieważ na razie sprawdzam jak działają przerwania i co można z tym zrobić :)

    Dziękuję bardzo za pomoc. Faktycznie problemem był Pull up.
    Zostawię jeszcze temat otwarty, ponieważ będę próbował opanować przerwania i w razie jakichś problemów nie chcę zakładać nowego tematu.
REKLAMA