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

[Atmega48][C] Dziwne zachowanie w przerwaniu timera0

monte88 23 Wrz 2011 18:02 889 9
  • #1 9956362
    monte88
    Poziom 9  
    Witam

    Ostatnio próbując ustawić timer0 natknąłem się na pewną dziwną sytuację. Jeżeli wywołane zostanie normalne przerwanie (tzn. bez opóźniej wew. funkcji obsługi przerwania) to nie działa. Znaczy się sam program się kompiluje i działa tylko wogóle nie zapala się ale jeśli wprowadzę opóźnienie powyżej 70ms to wszystko jest ok. Nie znam się jeszcze za bardzo na programowaniu avr-ów ale wydaje mi się że w przerwaniach nie powinno się używać funkcji typu _delay_ms

    Ta wersja kodu działa poprawnie, czyli obie diody się zapalają.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    A ta, po zmniejszeniu opóźnienia, już nie. Zapala się tylko jedna dioda, zupełnie tak jak gdyby program nie wchodził wogóle do if-a.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Coś jest nie tak z kodem, ustawieniami uC czy może tak już po prostu musi być?
  • #2 9956431
    xamrex
    Poziom 28  
    Przecież to jest źle napisane...
    W przerwaniu nie daje się w ogole delaya!

    Jeśli już chcesz to robić w taki sposób, to ustaw sobie tak, że w przerwaniu będzie ci się np. co 2ms zwiększała flaga licznik1;

    A w main we while
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #3 9956476
    monte88
    Poziom 9  
    Wiem że się nie daje delaya w przerwaniu i właśnie dlatego się pytam dlaczego z tym delay-em przerwanie działa prawidłowo a bez niego już nie?
  • #4 9956509
    dondu
    Moderator na urlopie...
    monte88 napisał:
    Nie znam się jeszcze za bardzo na programowaniu avr-ów ale wydaje mi się że w przerwaniach nie powinno się używać funkcji typu _delay_ms

    Dobrze Ci się wydaje - patrz błąd nr 3: http://mikrokontrolery.blogspot.com/2011/04/problemy-c-przerwania.html
    więc dlaczego go stosujesz?

    Napisz dokładnie jakiego działania po swoim kodzie się spodziewasz.
  • #5 9956600
    monte88
    Poziom 9  
    Program ma odliczać jakiś określony czas, powiedzmy 1s. Więc oprócz preskalera i OCR-a inkrementuję w przerwaniu zmienną licznik1 i sprawdzam czy osiągnęła już daną wartość. I tu właśnie pojawia się problem. Gdy odpalę program bez delaya to w przerwaniu nie jest sprawdzany if. Gdy dam delaya to wtedy warunek jest sprawdzany i wszystko działa 8-O .
  • #7 9956624
    monte88
    Poziom 9  
    No teraz to już na 100% się upewniłem że to nie jest wskazane :wink:
    Zegar ustawiony jest na 8MHz
    Kompilator informuję poprzez #define F_CPU 8000000 (Tak wiem że tak też nie powinno się tego robić tylko ustawiać w pliku makefile ale się jakoś do tego zapisu przyzwyczaiłem)
  • #9 9956834
    xamrex
    Poziom 28  
    s
    monte88 napisał:
    Program ma odliczać jakiś określony czas, powiedzmy 1s. Więc oprócz preskalera i OCR-a inkrementuję w przerwaniu zmienną licznik1 i sprawdzam czy osiągnęła już daną wartość. I

    Robisz dobrze!!
    Teraz tylko w main sprawdzaj czy licznik1 uzyskał daną wartość i jeśli tak, to zaplaaj sobie np. diode..

    Ale po co w przerwaniu daleś jakiś delay_ms !? nie mma pojęcia..
  • #10 9956849
    monte88
    Poziom 9  
    Problem rozwiązany :D
    Pewnie jak bym wkleił cały kod to od razu by to wyszło. Okazało się, że drugie przerwanie które miałem dla ADC było źle skonfigurowane i to na nim się przycinał program. Po drobnych poprawkach wszystko działa jak należy :)

    Wielkie dzięki za pomoc :)
REKLAMA