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

Przerwania w ATmega168 - Prośba o sprawdzenie programu i wytknięcie błędów.

niska_2802 02 Lip 2013 23:12 1689 8
  • #1 12481093
    niska_2802
    Poziom 9  
    Witam serdecznie!
    Chciałabym na wstępnie nadmienić,że dopiero zaczynam przygodę z elektroniką. W związku z tym z góry proszę o wybaczenie, jeśli mój kod to masa banialuków.
    Próbuję zaprogramować uC ATmega168.
    Chciałabym nauczyć się poprawnej obsługi timerów. W związku z tym próbowałam napisać program dzięki, któremu dioda migałaby dokładnie co 1s. Korzystam z timera 16 bitowego. Częstotliwość taktowania uC to 8MHz. Korzystam z eclipse indigo.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Powyższy program kompiluje się, nie wyskakują błędy, a mimo wszystko migania diody jak nie było tak nie ma. Proszę o pomoc...
  • #2 12481148
    piotrva
    VIP Zasłużony dla elektroda
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Ponadto nie stosujesz tu przerwań - po prostu odpalasz licznik i sprawdzasz w pętli jego wartość.
    Tak więc po pierwsze musisz sobie zrobić przerwanie i jego obsługę.
    Ponadto do takich celów nie stosuje się wpisywania wartości do rejestru timera, ale korzysta się z trybu CTC.
    Poszukaj nieco informacji na te tematy, a wszystko się rozjaśni.
    Poza tym z przerwaniami zacznij na początek od przerwań zewnętrznych może, typu INT0...1
  • #3 12481149
    dondu
    Moderator na urlopie...
    Witaj.

    Nie sprawdzając ustawień timera, pierwsze co widać, to brak pętli głównej.
    Oznacza to, że kompilator GCC dodaje kod, który blokuje przerwania i zapętla się w specjalnej pętli.

    Zerknij tutaj: http://mikrokontrolery.blogspot.com/2011/03/led-sterowany-przez-timer.html

    No i zawsze dodawaj schemat, bo tam także kwiatki bywają na początku drogi :)
  • #4 12481234
    niska_2802
    Poziom 9  
    Dziękuję Wam za ekspresową odpowiedź :) :)
    Tak na szybko dodaję schemat, ale jeśli chodzi o tryb CTC, to chciałam go na wstępie pominąć (wydaje mi się być trudny) , dlatego takie kombinacje wcisnęłam do programu... no cóż, nie wyszło...


    Przerwania w ATmega168 - Prośba o sprawdzenie programu i wytknięcie błędów.
  • Pomocny post
    #6 12481263
    piotrva
    VIP Zasłużony dla elektroda
    I nie zwieraj nigdy AREF z GND!!!
    AREF przez kondensator 100n do GND, ale nigdy nie zwieraj, bo możesz uszkodzić procesor.

    A CTC nie jest trudny, ale najpierw przetraw ideę i obsługę przerwań ogólnie - bo tu w ogóle przerwań nie wykorzystujesz.
  • #7 12484181
    niska_2802
    Poziom 9  
    Kurcze nie wiedziałam, że tak nie można...:/
    Poniżej wersja ostatnia schematu.
    Przerwania w ATmega168 - Prośba o sprawdzenie programu i wytknięcie błędów.

    Jeśli chodzi o program i tryb CTC, to trochę poczytałam i jak widać poniżej próbowałam zastosować.
    Mimo wszystko mam problem z tym programem.
    Okazuje się,że dioda wreszcie miga, ale nie w takim czasie którego oczekiwałam.
    Chciałam,żeby świeciła przez 1s,a gasła na 2s i odwrotnie. Niestety miga w sposób całkowicie dowolny. Powiedziałabym, że w przybliżeniu co 2s zapala się i gasi.
    Co jest nie tak?
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #8 12485390
    BlueDraco
    Specjalista - Mikrokontrolery
    Wszystko - głównie oczekiwanie w przerwaniu timera.

    Zacznij od określenia okresu przerwań timera. W przerwaniu użyj zmiennej zliczającej przerwania, np.:
    - inicjujesz ją na wartość 3
    - na początku procedury dekrementujesz ją
    - przy wartości 1 zapalasz diodę,
    - przy wartości 0 gasisz diodę i reinicjujesz licznik na wartość 3

    Oczywiście zamiast 1 i 3 może być np 50 i 300 - wszystko w zależności od okresu timera i tego, jak chcesz migać.
  • #9 12489555
    niska_2802
    Poziom 9  
    Co prawda dioda naprzemiennie świeci i gaśnie w równych odstępach czasu,ale najważniejsze,że program w trybie CTC działa.
    Dziękuję wszystkim za podpowiedzi! :)
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
REKLAMA