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

[AVR] [AVR][BASCOM] TIMER1: Zmienna bieg zawsze zero, prędkość poprawna - dlaczego?

zenon05 15 Lut 2012 22:57 1895 4
  • #1 10551971
    zenon05
    Poziom 11  
    Mam taki problem, a mianowicie, mam zadeklarowane w programie procedury, ktore maja za zadanie wyświetlanie na wyświetlaczu graficznym różnych wartości.
    Jednymi z tych wartości są między innymi zmienne odpowiadające za prędkość, obroty silnika oraz który bieg jest aktualnie wrzucony.

    Mój problem polega na tym że gdy chcę wywołać procedurę wyświetlania prędkości i biegu, w przerwaniu które generuje TIMER1 co 100ms, to zmienna bieg zawsze ma wartość zero(nawet po uprzednim zatrzymaniu działania TIMERA , lub dezaktywacji przerwania które on generuje), a zmienna prędkość wyświetla się poprawnie. O tyle jest to dziwne że gdy wywołuje tą procedurę w jakim kolwiek miejscu programu (poza podprogramem obsługiwanym przez TIMER1) to procedura działa poprawnie. A głównie chodzi mi właśnie o to aby co jakiś czas w tym przerwaniu użyć właśnie tych procedur.


    Kod: text
    Zaloguj się, aby zobaczyć kod



    Będę wdzięczny za jakie kolwiek propozycje, oraz rady jak rozwiązać ten problem
  • #2 10552585
    piotr5000
    Poziom 21  
    W przerwaniu tylko ustaw flagę a w pętli głównej wywołaj procedure wyświetlania i skasuj flagę .
    Może okazać się , że obsługa procedury trwa dłużej niż czas pomiędzy przerwaniami
    i program " pójdzie w krzaki " .Były już podobne tematy
  • #3 10553134
    zenon05
    Poziom 11  
    wcześniej nie wpadłem na to aby w przerwaniu ustawić flagę, więc dzisiaj to wypróbuję .

    Tylko jeszcze mnie dziwi, bo nawet jeśli procedura wykonuje sie dłużej niż tutaj ustawione w przerwaniu 100ms, to dlaczego zawsze jet błędnie wyświetlana zmienna "BIEG", pomimo tego ze do procedury przekazywana jest jako pierwsza, i w procedurze również wyświetlana jest jako pierwsza.


    gdy w przerwaniu od timera ustawiam flage, i uruchamiam tą procedurę w pętli głównej, to działa poprawnie, mimo tego ze przerwanie nadal trwa tyle samo, oraz nie zatrzymuje timera. Wtedy wszystko działa poprawnie. Ale gdy ją spowrotem chce uruchomić w przerwaniu od timera, to nie działa .
  • #4 10553854
    piotr5000
    Poziom 21  
    jeśli przerwanie jest co 100msek a obsługa procedury wywołanej w przerwaniu będzie trwała 101msek to przed zakończeniem pierwszej procedury i powrotu z przerwania program
    uruchomi drugi raz tę procedure potem trzeci itd . dojdzie wreszcie do zapełnienia stosu
    i "zwis" programu
    Gdy procedura wykonywana jest w pętli głównej jest zezwolenie od przerwania na jej wykonanie ale najpierw musi się skończyć aktualnie wykonywana i nawet jeśli w procedurze
    będzie wait 1 to po sekundzie drugi raz wykona się procedura ale po dziesiątym prawidłowo
    zakończonym przerwaniu , a dla Ciebie będzie wyglądało jakby wykonała się 10 razy
    ( w dużym skrócie i uproszczeniu )
  • #5 10555784
    zenon05
    Poziom 11  
    dziękuje bardzo piotr5000 za wytłumaczenie tego w dość prosty i krótki sposób , Teraz już przynajmniej wiem w czym rzecz i jak na następny raz unikać takich sytuacji
REKLAMA