Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C][ATMega8535] Jak zabrać się za obsługę przerwań?

bialysrem 25 Kwi 2012 22:30 1268 6
  • #1 25 Kwi 2012 22:30
    bialysrem
    Poziom 8  

    Od kilku dni męczę się z ustawieniem timera (działającego równolegle z programem) na moim uC atmega8535.
    Jestem początkującym elektronikiem. Przeszukałem już naprawdę wiele tematów, pisałem do wujka google na wszystkie możliwe sposoby jakie tylko wymyśliłem. Nadal problemowo.

    Otóż po przeszperaniu internetu dokopałem się do następującego kodu:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    I owszem, po wklejeniu "na głupiego" timer zaczyna liczyc, tylko znacznie za wolno (1 sekunda trwa na oko jakieś 4-5 sekund).
    Taktowanie ustawione na 1MHz (o ile #define F_CPU 1000000L znaczy tyle co rozumiem ;) spotkałem się przeczytując forum że jest to bardzo zła i nieprawidłowa forma, ale niestety mądrala nie przytoczył jak powinno się to zapisywać... )

    Chciałbym dowiedzieć się co znaczą te TCCR2, OCR2, TIMSK, jak liczyć te przerwania i dlaczego timer po skopiowaniu tego kodu nie liczy faktycznie sekund ( nawet nie można tego czasu nazwać czasem zbliżonym do sekundy :/ ).

    Jeśli jest gdzieś już taki temat, po przeczytaniu którego będę w stanie zrozumieć działanie tych przerwań śmiało proszę mnie tam odesłać, tylko błagam - z linkiem. Już naprawdę sporo się naszukałem.
    [UWAGA!!! Nie w każdym temacie którego tytuł nosi znamienne 'Atmega8535 timer', da się znaleźć te informacje!!! A wręcz nie znalazłem żadnego, więc proszę o w pełni świadome polecanie innych tematów, google niestety poza przydatnymi informacjami znajduje również masę bubli]

    Zaznaczam że interesuje mnie rozwiązanie w języku C.

    0 6
  • #2 26 Kwi 2012 07:14
    zumek
    Poziom 39  

    bialysrem napisał:
    ...I owszem, po wklejeniu "na głupiego" timer zaczyna liczyć, tylko znacznie za wolno (1 sekunda trwa na oko jakieś 4-5 sekund).

    Powód jest błahy - masz błąd w kodzie odpowiedzialnym za konfigurację timera.
    bialysrem napisał:

    Taktowanie ustawione na 1MHz (o ile #define F_CPU 1000000L znaczy tyle co rozumiem ;) spotkałem się przeczytując forum że jest to bardzo zła i nieprawidłowa forma, ale niestety mądrala nie przytoczył jak powinno się to zapisywać... )

    Etykieta F_CPU, nie ma żadnego wpływu na pracę timerów - chyba że użyjemy jej do obliczeń wartości, wpisywanych do rejestrów timera.

    0
  • Pomocny post
    #3 26 Kwi 2012 07:27
    dondu
    Moderator Mikrokontrolery Projektowanie

    bialysrem napisał:
    ... ale niestety mądrala nie przytoczył jak powinno się to zapisywać... )

    Oj, uważaj bo ktoś może poczuć się urażony i raportować post :)
    Na temat F_CPU w sieci można znaleźć wiele: F_CPU – gdzie definiować?


    bialysrem napisał:
    Chciałbym dowiedzieć się co znaczą te TCCR2, OCR2, TIMSK, jak liczyć te przerwania i dlaczego timer po skopiowaniu tego kodu nie liczy faktycznie sekund ( nawet nie można tego czasu nazwać czasem zbliżonym do sekundy :/ ).
    ...
    Jeśli jest gdzieś już taki temat, po przeczytaniu którego będę w stanie zrozumieć działanie tych przerwań śmiało proszę mnie tam odesłać, tylko błagam - z linkiem.

    Tutaj przykład z użyciem Timer0 wraz z opisem dla Atmega8: LED sterowany przez Timer
    ... wystarczy, by zrozumieć zasadę i zastosować do dowolnego innego mikrokontrolera AVR zaglądając do jego datasheet.


    EDIT:
    U Ciebie problemem jest przede wszystkim:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    konkretnie opisane jest to w punkcie: 4. BŁĄD: Wielokrotne ustawianie całego rejestru
    i od tej poprawki zacznij.

    0
  • #4 26 Kwi 2012 15:13
    bialysrem
    Poziom 8  

    I takiej właśnie odpowiedzi oczekiwałem :) Rzeczowo, na temat, dostałem wskazówkę gdzie się czegoś dowiem, nikt mnie nie wyręczył a wszystko działa.

    Poprawiłem kilka rzeczy i czas zdecydowanie bliższy jest sekundzie ;)

    Teraz spróbuję ustawić RTC na zewnętrznym kwarcu.

    Zanim zamknę temat może ktoś zechciałby podpowiedzieć na co tutaj zwrócić uwagę? (Myślę że to nie odbiega od tytułu tematu)

    0
  • Pomocny post
    #5 26 Kwi 2012 17:01
    dondu
    Moderator Mikrokontrolery Projektowanie

    bialysrem napisał:
    Teraz spróbuję ustawić RTC na zewnętrznym kwarcu.
    Zanim zamknę temat może ktoś zechciałby podpowiedzieć na co tutaj zwrócić uwagę? (Myślę że to nie odbiega od tytułu tematu)

    A konkretnie - jaki kwarc?
    przy okazji jeszcze ten link: Czas - odmierzanie

    0
  • #6 26 Kwi 2012 19:16
    bialysrem
    Poziom 8  

    Użyłem kwarcu 32768 Hz, podłączyłem do pinów 6 i 7 portu C.

    W datasheet doczytałem:

    Cytat:
    For AVR microcontrollers with Timer/Counter Oscillator pins (TOSC1 and TOSC2), the
    crystal is connected directly between the pins. No external capacitors are needed. The
    Oscillator is optimized for use with a 32.768 kHz watch crystal.

    Więc nie dołączyłem żadnych kondensatorów. Czy słusznie?

    Kod w programie:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Szczerze muszę przyznać że nie do końca wiem co ustawiłem w TIFR oraz TIMSK, znalazłem to w którymś z tematów o RTC na atmega8535.
    W każdym razie wszystko działa tak jak powinno, po 15 minutach nie zaobserwowałem żadnego przesunięcia czasu.

    Jeśli ktoś ma jakieś zastrzeżenia do powyższego kodu to proszę się wypowiedzieć. Może ktoś zechce wyjaśnić dokładniej co tam się dzieje zanim zamknę temat (zostawię jeszcze na jakiś czas dla zainteresowanych).

    Mam nadzieję że powyższe informacje w jakimś stopniu przydadzą się przyszłym początkującym elektronikom. Jeśli coś jest źle proszę sprostować.

    Dziękuję Panu dondu za pomoc. :)

    0
  • #7 26 Kwi 2012 21:12
    dondu
    Moderator Mikrokontrolery Projektowanie

    bialysrem napisał:
    Więc nie dołączyłem żadnych kondensatorów. Czy słusznie?

    Słusznie.

    Zmieniłeś nową funkcję przerwania ISR() i jej wektor na stare (przestarzałe) SIGNAL(): http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html
    Zmień na ISR().


    bialysrem napisał:
    Szczerze muszę przyznać że nie do końca wiem co ustawiłem w TIFR oraz TIMSK, znalazłem to w którymś z tematów o RTC na atmega8535.

    Zaglądnij do datasheet tam pisze:
    TIMSK: Bit 6 – TOIE2: Timer/Counter2 Overflow Interrupt Enable
    TIFR:
    Bit 7 – OCF2: Output Compare Flag 2
    Bit 6 – TOV2: Timer/Counter2 Overflow Flag


    bialysrem napisał:
    Dziękuję Panu dondu za pomoc. :)

    Bez Pan proszę - wiek nie ma znaczenia :-)

    0
  Szukaj w 5mln produktów