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.

Przerwania timera nie są realizowane

MarcusBurnett 21 Kwi 2012 17:27 1241 7
  • #1 21 Kwi 2012 17:27
    MarcusBurnett
    Poziom 11  

    Witam.
    Napotkałem pewien problem z realizacją przerwań. Ogólnie z pułapkami podczas debugowania widać że działa i że przerwania są realizowane, ale gdy pułapek niema nic się nie dzieje. Co ciekawe, gdy funkcja jest w postaci przedstawionej poniżej nic się nie dżizje. Gdy usunę komentarz z dwóch ostatnich linijek to zaczyna działać.
    Raczej odrzucam winę procesora bo to raczej kompilator coś broi. Używam uVision 4. Procesor STM32F407VGT6. Proszę o jakieś wskazówki.
    Dziękuję.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 7
  • #2 21 Kwi 2012 23:23
    hotdog
    Poziom 26  

    mało programu trochę pokazałeś, ale pytanie: Na jakiej podstawie twierdzisz że przerwanie się nie wykonuje? Może wykonuje się za szybko, albo z pewnych względów zawsze 2 razy?

    0
  • #3 22 Kwi 2012 10:51
    MarcusBurnett
    Poziom 11  

    Za szybko raczej nie bo timer powinien co sekundę reagować. Ale czemu to wszystko zaczyna działać gdy jest ta instrukcja poniżej nawet może to być wywołanie pustej funkcji i tęż zaczyna działać. Widać zmianę co sekundę. Ale jest coś podejrzane bo jak obliczyć wszystko to widać że dioda mruga dwa razy szybciej niż powinna. Myślałem że może jakoś na dwa zbocza reaguje i dlatego tak się dzieje. Bo jak by dwa naraz przerwania były to wtedy żadnej zmiany by nie było. Dioda by nie mrugała. A mruga gdy się doda jakieś instrukcje na końcu. Może włącza się jakieś inne przerwanie i wpada w jakąś pętle ale tylko przerwanie zegara jest ustawione w NVIC więc chyba tylko to jest puszczane ?

    0
  • Pomocny post
    #4 22 Kwi 2012 11:24
    hotdog
    Poziom 26  

    sprawdź w dokumentacji czy aby po zresetowaniu flagi przerwania timera nie trzeba odczekać kilka instrukcji (2-3 NOP'y). Jeżeli tak jest, to w przeciwnym wypadku zaraz po wyjściu przerwanie otworzy się drugi raz i w tej sposób dioda mrugnie tak że tego nie zauważysz. Możesz to sprawdzić tak że diodę ustawisz na zapłoną (a nie stan przeciwny), to po pierwszej sekundzie powinna się zapalić na stałe. Potwierdzi to moja teorię, że przerwanie uruchamia się 2 raz zaraz po sobie.

    Nie wiem jak na stm32 (ja obecnie preferuje LPC1xxx), ale czy przypadkiem z przerwań nie powinno się wychodzić przez return (mimo że nic nie zwracają na końcu powinno być return)? Nie znam teoretycznych podstaw tego, ale ja w przykładach zawsze widziałem takie podejście i zachowuje je tez u siebie. To w końcu ten sam rdzeń, więc może też ma zastosowanie.

    Pozdrawiam

    0
  • #5 22 Kwi 2012 12:26
    Freddie Chopin
    Specjalista - Mikrokontrolery

    hotdog napisał:
    Nie wiem jak na stm32 (ja obecnie preferuje LPC1xxx), ale czy przypadkiem z przerwań nie powinno się wychodzić przez return (mimo że nic nie zwracają na końcu powinno być return)? Nie znam teoretycznych podstaw tego, ale ja w przykładach zawsze widziałem takie podejście i zachowuje je tez u siebie. To w końcu ten sam rdzeń, więc może też ma zastosowanie.

    Ciekawe co ma rdzeń do standardu języka C, mówiącego coś zupełnie innego...

    No a swoją drogą, to dobrze że znów znaleźliśmy błąd kompilatora, bez tego jest bardzo nudno [; Straszna niedoróba z tego Keila - tyle kasy a takie błędy...

    4\/3!!

    0
  • #6 22 Kwi 2012 21:49
    MarcusBurnett
    Poziom 11  

    Podziałało. Ustawiłem na stałe na włączoną i widać że jest realizowane. Kiedyś to z avrami się bawiłem teraz na coś większego i zabawa na nowo. Doświadczenie marne i dlatego kompilatorowi się oberwało. Bardzo dziękuje :). Tylko jeszcze to dwa razy szybsze działanie mi spokoju nie daje, czy możliwe jest że na dwa zbocza reaguje ? Procesor chodzi na 168Mhz, szyna tego zegara chodzi na APB1 i jest dzielona od nominalnej przez 4 to jest 42Mhz. Preskaler zegara 640 i przerwanie w momencie przepełnienia czyli po 65536 taktach, co o ile się nie mylę daje raz na około sekundę. Jeszcze nie mam wprawy w tym wszystkim, dlatego proszę o wyrozumiałość. Pewnie teraz będę często się odzywał z kolejnymi problemami, bo cały dzień siedzenia i kombinowania jest frustrujący gdy nie działa tak jak ma działać ;). Bardzo dziękuje.

    0
  • Pomocny post
    #7 22 Kwi 2012 22:44
    gaskoin
    Poziom 38  

    MarcusBurnett napisał:
    Procesor chodzi na 168Mhz, szyna tego zegara chodzi na APB1 i jest dzielona od nominalnej przez 4 to jest 42Mhz. Preskaler zegara 640 i przerwanie w momencie przepełnienia czyli po 65536 taktach, co o ile się nie mylę daje raz na około sekundę.


    Tu się mylisz. Zajrzyj na clock tree w sekcji RCC i się okaże, że jednak APB1 dla timerów jest mnożone x 2 (tzn tylko wtedy kiedy preskaler APBx jest różny od 1):) Tak więc clockiem dla timerów nie jest 42 a 84 MHz

    Przy okazji jest mały błąd w nocie - brakuje zamknięcia nawiasu :P

    BTW nie wiem skąd wziąłeś te wartości preskalera i ARR ale nie dadzą Ci one sekundy. Prościej by Ci było dać preskaler 42 000, tak żeby Timer miał częstotliwość 1kHz a do ARR wpisać 999, bo to co Ty policzyłeś nie da Ci 1 sek.
    Podobnie dla 84MHz (które faktycznie są). PSC 41 999 a ARR 1999 albo PSC 8 399 a ARR 9999

    0
  • #8 23 Kwi 2012 07:44
    MarcusBurnett
    Poziom 11  

    Wydaje mi się że dobrze liczyłem, 42 000 000/(640*65536) = 1. Dziękuje.

    0