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.

ATmega2560 - niedziałające przerwania timera

szacunwkratke 30 Lis 2015 20:00 741 9
  • #1 30 Lis 2015 20:00
    szacunwkratke
    Poziom 6  

    Cześć, mam napisać "prosty" program dla ATmegi2560. Po wciśnięciu przycisku na porcie A, ma on zapalić odpowiadającą mu diodę na porcie B. Dioda ma się świecić 1 sekundę a potem ma zgasnąć. Za podtrzymanie świecenia mają odpowiadać przerwania timera1, a program ma się zaczynać od ustawienia flagi przerwania int0. Int0 działa, po wciśnięciu przycisku program włącza przerwanie i wskakuje do procedury obsługi przerwania. Gorzej z przerwaniami od timera, po ustawieniu parametrów przerwania zaczyna od reset, w ogóle nie wywołuje przerwania timera. Męczę się z tym już cały weekend i nie wiem co robię źle.

    Kod: avrasm
    Zaloguj się, aby zobaczyć kod
    [/code]

    0 9
  • #2 30 Lis 2015 20:31
    BlueDraco
    Specjalista - Mikrokontrolery

    Powinieneś mieć trzy ODDZIELNE procedury - main, obsługę przerwania INT0 i obsługę przerwania timera. W kodzie powyżej z main przchodzisz do obsługi int - błąd pierwszy. Obsługa obu przerwań zamazuje rejestr R16, którego używa main - błąd drugi.

    Przycisków nie obsługuje się na przerwaniach int, a w przerwaniu timera (który to temat powraca tu kilka razy w miesiącu).

    0
  • #3 30 Lis 2015 21:16
    szacunwkratke
    Poziom 6  

    Ok, mam 3 procedury, licznik włączam w kodzie głównym. R16 przy włączeniu przerwania odkładam na stos (push r16) a przed powrotem zdejmuję (pop r16). W poleceniu mam żeby program zaczynał się od ustawienia int0, jak to przeskoczyć aby nie wchodzić z main do obsługi int0?

    0
  • #4 30 Lis 2015 21:28
    BlueDraco
    Specjalista - Mikrokontrolery

    A w jakim celu wchodzisz z main do obsługi przerwania? Przecież tak to dziwacznie napisałeś.

    0
  • #5 30 Lis 2015 21:32
    szacunwkratke
    Poziom 6  

    Do int0 żeby zapalić diodę, a do przerwania od timera żeby wyzerować TCCR1B (wyłączyć licznik gdy minie sekunda) i wtedy wyłączyć diodę.

    0
  • #6 30 Lis 2015 21:35
    BlueDraco
    Specjalista - Mikrokontrolery

    Do obsługi przerwania nie skacze się z main.

    0
  • #7 30 Lis 2015 21:41
    szacunwkratke
    Poziom 6  

    Dla obsługi timera chyba rozumiem: powinno działać gdy przed pętlą wyzeruje ten licznik (TCNT) w pętli można nope, i gdy ten licznik się 'samoczynnie' przekręci to powinien wskoczyć do procedury obsługi przerwania i w tej procedurze można go znowu wyzerować, żeby zaczął zliczać od nowa np aż zmiennaPomocnicza > ilośćPowtórzeń, tak?

    A jak przejść do procedury obsługi przerwania int0?

    0
  • #8 30 Lis 2015 21:52
    BlueDraco
    Specjalista - Mikrokontrolery

    Litości... Najpierw przeczytaj, co to takiego jest przerwanie. Potem spróbuj napisać całość w C (znajdziesz w sieci parę tysięcy gotowców). Potem (jeśli musisz, choć sensu to nie ma) kleć kod w asemblerze.

    0
  • #9 30 Lis 2015 22:01
    szacunwkratke
    Poziom 6  

    Przerwanie to zdarzenie które przerywa działanie programu głównego i uruchamia procedurę obsługi przerwania. Jak ta procedura się zakończy (tu reti) to następuje powrót do programu głównego. To tyle teorii - w C działa, na takiej zasadzie jw.
    Jak wywołać to int0? Wiem że odpowiada za nie bit 0 portu D, ale przyciski są podpięte do A. Z tego co rozumiem nie mogę przepisać pina na pind żeby je włączyć (zasymulować to zdarzenie).

    0