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

ATmega2560 - przerwania timera1 nie działają, dioda nie gaśnie po 1 sekundzie

szacunwkratke 30 Lis 2015 20:00 1032 9
REKLAMA
  • #1 15199252
    szacunwkratke
    Poziom 9  
    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: AVR assembler
    Zaloguj się, aby zobaczyć kod
    [/code]
  • REKLAMA
  • #2 15199378
    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).
  • #3 15199559
    szacunwkratke
    Poziom 9  
    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?
  • REKLAMA
  • #4 15199617
    BlueDraco
    Specjalista - Mikrokontrolery
    A w jakim celu wchodzisz z main do obsługi przerwania? Przecież tak to dziwacznie napisałeś.
  • REKLAMA
  • #5 15199627
    szacunwkratke
    Poziom 9  
    Do int0 żeby zapalić diodę, a do przerwania od timera żeby wyzerować TCCR1B (wyłączyć licznik gdy minie sekunda) i wtedy wyłączyć diodę.
  • #6 15199644
    BlueDraco
    Specjalista - Mikrokontrolery
    Do obsługi przerwania nie skacze się z main.
  • REKLAMA
  • #7 15199666
    szacunwkratke
    Poziom 9  
    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?
  • #8 15199726
    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.
  • #9 15199774
    szacunwkratke
    Poziom 9  
    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).
  • #10 15199827
    dondu
    Moderator na urlopie...
    Pin odpowiedzialny za INT0 jest w określonym pinie mikrokontrolera i nie masz innej możliwości, jak użyć właśnie tego pinu.
    Dodatkowo musisz ustawić odpowiednimi bitami na jakie zbocze ma reagować INT0.
REKLAMA