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] - Przerwania licznika w AVR

tomcio1992 27 Gru 2012 13:10 1395 17
  • #1 27 Gru 2012 13:10
    tomcio1992
    Poziom 6  

    Co tutaj przekombinowałem? Atmega32. Tryb Licznika. Celem było zapalenie i gaszenie diod co sekundę. Preskaler = 256. Przerwanie tak wyliczone aby wykonywało się co sekundę. Timer 16bitowy

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 17
  • #2 27 Gru 2012 13:15
    tmf
    Moderator Mikrokontrolery Projektowanie
  • #3 27 Gru 2012 13:31
    tomcio1992
    Poziom 6  

    ok. rzeczywiście. Zmieniłem na & i dalej nic poza tym że raz się zapala i tak zostaje ;/

    0
  • Pomocny post
    #4 27 Gru 2012 13:38
    tmf
    Moderator Mikrokontrolery Projektowanie

    Opczytaj o działaniu operatorów. & to operator iloczynu logicznego, czego się spodziewasz? Ma być PORTC^=0xFF;

    0
  • #5 27 Gru 2012 13:43
    tomcio1992
    Poziom 6  

    Dzięki :)

    0
  • #7 27 Gru 2012 13:49
    tomcio1992
    Poziom 6  

    tutaj ustawiłem mode 0 - Normal. Nie wiem o co CI chodzi z CTC. Wgl jeszcze mało wiem ;p Czy to nie jest tak ze rejestr TCNT jest do mode 0 -licznika, a rejestr OCR to licznik do CTC?

    0
  • Pomocny post
    #8 27 Gru 2012 14:09
    piotrva
    Moderator Mikrokontrolery

    Chodzi o to, że po pierwszym przerwaniu TCNT1 będzie miał wartość 0, czyli zliczy potem 65536 impulsów. Zaś do generowania, jak Ty chcesz, przerwań co określony odcinek czasu służy tryb CTC. Wtedy w rejestrze OCR ustawiasz ilość impulsów, które chcesz zliczyć, i wygenerować odpowiednie przerwanie.

    0
  • #9 27 Gru 2012 14:12
    tomcio1992
    Poziom 6  

    hmm. W takim razie jak ustawić aby rejestr TCNT1 cały czas zaczynał od okreslonej wartości?

    0
  • #11 27 Gru 2012 14:53
    tomcio1992
    Poziom 6  

    Tym razem 4 pierwsze diody obsługuje przerwanie a pozostałe 4 zmieniają stan co _delay_ms(1000);

    Zauważyłem ze okres zapalania się diod obsługiwanych przez przerwanie jest mniejszy o ok. 3,8 ms od okresu zapalania się diod z instrukcja delay; Czyli diody od przerwania zapalają się i gaszą szybciej o 3,8 ms gdy teoretyczny okres powinien byc 1000ms.

    Ktoś umie wyjaśnić czemu? Które diody zapalają się prawidłowo?

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #12 27 Gru 2012 14:59
    BlueDraco
    Specjalista - Mikrokontrolery

    Przecież diody sterowane w pętli głównej nie mają zmieniać stanu co 1000 ms, tylko po odczekaniu 1000 ms od ostatniej zmiany. To opóźnienie nie uwzględnia innych czynności wykonywanych przez procesor, np. obsługi przerwań timera.

    Przy preskalerze 256 okres zgłaszania przerwania byłby zbliżony do 1s przy częstotliwości oscylatora 8.78 MHz.

    0
  • #13 27 Gru 2012 15:05
    piotrva
    Moderator Mikrokontrolery

    Po pierwsze powinieneś wpisywać do rejestru timera wartość 34285.
    Moim zdaniem prawidłowo zapalają się diody sterowane timerem, choć też powinieneś pierwsze przeładować wartość rejestru, a dopiero potem zmieniać stan pinów.
    Poza tym nigdy nie opieraj i odnoś pomiarów czasu do instrukcji delay. Takie rzeczy mierzymy analizatorem/oscyloskopem.
    I na prawdę, czemu tak się boisz i wystrzegasz trybu CTC?

    0
  • #14 27 Gru 2012 15:10
    tomcio1992
    Poziom 6  

    ok, dzięki za wyjaśnienie.

    Tym razem spróbowałem to samo z CTC. I jak zwykle coś schrzaniłem...

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • Pomocny post
    #15 27 Gru 2012 15:20
    BlueDraco
    Specjalista - Mikrokontrolery

    Uruchamianie timera przed zaprogramowaniem okresu nie jest najlepszym zwyczajem.
    Wartość wpisywana do OCR to okres - 1. Napisz po prostu:
    OCR1A = FCLK / 256 - 1;
    (O ile częstotliwość zegara jest zdefiniowana pod nazwą FCLK - nie pamiętam, bo skończyłem z AVR jakieś 4 lata temu.)

    0
  • #16 27 Gru 2012 15:47
    tomcio1992
    Poziom 6  

    Dzięki za rady :)

    Niestety wciąż nie działa. Nawet diody z pętli głównej się nie świecą...

    0
  • #18 27 Gru 2012 16:24
    tomcio1992
    Poziom 6  

    Dzięki ;P wszystko hula jak należy. Teraz zrobię PWM :)

    0