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

[ATmega8][C] - TIMER1 kontrolowany przerwaniami INT0:1

yogu$ 04 Lis 2012 03:23 1587 3
  • #1 11485979
    yogu$
    Poziom 9  
    Witam

    Chciałem skonstruować sobie projekcik umożliwiający przećwiczenie timera i przerwań zewnętrznych. Nie chciał działać, więc ostatecznie uprościłem go do granic możliwości i dalej nic...
    Założenie jest proste: po wciśnięciu przycisku na pinie odpowiadającym INT0 następuje uruchomienie TIMER1, który naprzemiennie włącza i wyłącza diodę w odstępie ok 1 sekundy. Po wciśnięciu drugiego przycisku, pod INT1, ma nastąpić zatrzymanie TIMER1 i zachowanie obecnego stanu logicznego. Szczegóły w komentarzach w programie.
    Po wgraniu hexa, uC w ogóle nie reaguje na wciśnięcia. Dioda ciągle się świeci.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Program jest zbyt banalny żeby nie mógł działać, no a jednak... Mi już witki opadają, liczę na waszą pomoc.
    Na co nie zwróciłem uwagi?
  • Pomocny post
    #2 11485983
    szulat
    Poziom 23  
    twój program doskonale miga diodą zgodnie z zamierzeniem ale musisz poczekać nie sekundę a kilka minut bo z powodu niezerowania licznika count kolejne mrugnięcie zachodzi dopiero po przekręceniu inta :)

    (btw. w tej sytuacji volatile jest niepotrzebne)
  • #3 11486748
    yogu$
    Poziom 9  
    No faktycznie zapomniałem wyzerować. Teraz ISR timera wygląda tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dioda mruga teraz co jedną sekundę ale całość zachowuje się dość dziwnie;
    po podłączeniu zasilania dioda od razu mruga, przycisk wyłączający mruganie nie reaguje na wciskanie, ale reaguje jak położy się na niego palec, bez wciskania... :| Gdy przyciski tak się zachowują jestem na 99% pewien, że wina leży po stronie softu.
    Czy aby na pewno dobrze wykorzystuję INT0 i INT1? Z jednej strony przycisk do +5V z drugiej strony bezpośrednio pod PD2 i PD3.
    Możesz wyjaśnić czemu volatile jest niepotrzebne? Myślałem że każda zmienna obsługująca przerwanie musi mieć volatile żeby kompilator jej nie optymalizował.
  • Pomocny post
    #4 11486880
    TQelektronik
    Poziom 11  
    Witam,
    ustawienie rejestru DDR i PORT na 0 daje wejścia pływające (ATmega8 nie ma rezystorów ściągających do masy, tylko podciągające do plusa). Tak jak jest teraz łapiesz kolego zakłócenia.

    Należałoby albo dodać zewnętrzne rezystory między przyciskami a masą lub zmienić położenie przycisków (między pinem a masą) i włączyć wbudowane rezystory.

    O volatile można przeczytać na stronie: http://mirekk36.blogspot.com/2011/08/test.html (zmienna jest używane tutaj tylko w przerwaniu, nie ma odwołania do niej z pętli głównej).

    Pozdrawiam
    TQelektronik
REKLAMA