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

atmega8[C] - Niedziałające przerwania od przepelnienia licznikow T0 i T1

SayloPL 08 Lis 2012 15:27 1374 4
  • #1 11504152
    SayloPL
    Poziom 10  
    Witam,

    Mam problem z obsluga przerwan od przepelnienia licznikow. W projekcie wykorzystuje 3 liczniki w atmega8, timer2 wykorzystuje do generacji sygnalu 40kHz natomiast pozostale dwa maja zliczac czas od nadania sygnalu do otrzymania echa. Narazie napisalem osobną obsluge kazdego z timerow i dzialalo. Po wrzuceniu wszystkiego do jednego projektu dziala tylko generacja sygnalu, natomiast reszta nie wchodzi w obsluge przerwan, juz niestety nie mam pomyslu co robic. Myslalem ze blad wynika z uzycia funkcji _delay_... , wiec zamienilem ja na czekanie za pomoca fora, niestety nie uzyskalem zadnej poprawy. Kod projektu:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    z gory dziekuje za pomoc
  • #3 11507263
    SayloPL
    Poziom 10  
    Dzieki za szybka odpowiedz.

    Z tego co czytalem w datasheecie to przy ustawieniu bitow preskalera CS.. na 0 licznik sie wylacza. Da sie to robic inaczej? Jestem dosc "swiezy" w tej kwestii wiec sory jesli to pytanie brzmi glupio. Zerowanie wartosci licznika 2 zrobilem na wszelki wypadek, bo nie bylem pewny czy czegos nie wpisuje jeszcze przy ostatnim takcie zanim sie wylaczy w przerwaniu, uwazasz ze to zbedne?

    Co do petli for, nie bylem pewien jak traktuje to kompilator wiec wczesniej dodalem przed to ustawienie jednej nozki na 1, a po petli na 0. Sprawdzajac na oscyloskopie wyszedl sygnal prostokatny wiec uznalem ze dziala. Jesli to jest zly sposob realizacji opoznien to chetnie dowiem sie o lepszym (pomijajac funkcje _delay_.. bo to znam) :)
  • #4 11508913
    ZbeeGin
    Poziom 39  
    SayloPL napisał:
    Z tego co czytalem w datasheecie to przy ustawieniu bitow preskalera CS.. na 0 licznik sie wylacza. Da sie to robic inaczej?

    Jest to dobry sposób.

    SayloPL napisał:
    Zerowanie wartosci licznika 2 zrobilem na wszelki wypadek, bo nie bylem pewny czy czegos nie wpisuje jeszcze przy ostatnim takcie zanim sie wylaczy w przerwaniu, uwazasz ze to zbedne?

    Nie oto chodzi. Pętla się nie wykona zatem przez te parę taktów zwiększy się niewidoczny licznik preskaler-a (tak to jest zrobione), który za ileś tam przejść pętli mógłby zwiększyć licznik o jeden. Niestety nie dajesz mu tej szansy zerując licznik w pętli. Wobec czego odpowiedz sobie na pytanie, czy przepełnienie mogło w ogóle dojść do skutku?

    SayloPL napisał:
    Co do petli for, nie bylem pewien jak traktuje to kompilator wiec wczesniej dodalem przed to ustawienie jednej nozki na 1, a po petli na 0. Sprawdzajac na oscyloskopie wyszedl sygnal prostokatny wiec uznalem ze dziala. Jesli to jest zly sposob realizacji opoznien to chetnie dowiem sie o lepszym

    Jeśli włączysz optymalizację -Os to ta pusta pętla zostanie usunięta, gdyż optymalizacja uzna ją za zbędną. Możesz to zobaczyć kompilując kod z różnymi ustawieniami optymalizacji i przeglądnąć wygenerowane źródło (np. w Avr Studio czy Atmel Studio włączyć zakładkę Disassembler) lub też tylko puścić symulację.

    Opóźnienia "licznikowe" można zrealizować na kilka sposobów. Można załadować licznik i czekać na przerwanie, które ustawi jakąś zmienną, która to pozwoli przejść programowi dalej (tzw. polling). Można też tak skonstruować program, by w czasie oczekiwania robił inne rzeczy, a jak upłynie czas to zajął się dalszym ciągiem poprzedniego zadania...
  • #5 11509276
    SayloPL
    Poziom 10  
    Ktora petle masz na mysli?

    Ogolnie licznik drugi dziala tak jak powinien, generuje 10 oresow sygnalu prostokatnego. Problemem jest przerwanie od przepelnienia licznika pierwszego, a zerowanie wartosci w liczniku drugim chyba nie ma na to najmniejszego wplywu. Dobrze mowie czy cos zamotalem?
REKLAMA