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

[AtMega16][BASCOM]Problem z odmierzaniem odcinków czasu

michal2666 09 Maj 2010 09:56 1584 11
REKLAMA
  • #1 8053552
    michal2666
    Poziom 20  
    Witam szanownych forumowiczów.
    Zwracam się do Was z problemem przy moim urządzeniu do mierzenia ilości gazu powstającego w procesie chemicznym. Otóż potrzebuję odmierzać stałe odcinki czasu np. jednosekundowe do określania przepływu, ale timer 16bitowy mam niestety zajęty a pozostałe 8bitowe zgłaszały by mi przerwanie zbyt często a procesor otrzymuje bardzo ważne przerwania zewnętrzne od Int0 z enkodera. Jeśli nałożył bym na to przerwania z timera 8 bitowego dochodziło by do kolizji. Cy jest jakiś sprzętowy sposób na wykorzystanie timerów 8 bitowych tak by zgłaszały przerwanie powiedzmy co 1s ? lub jakiś inny programowy ? Niestety płytki mam już wykonane więc RTC też raczej odpada. Bardzo proszę o ewentualne sugestie.
  • REKLAMA
  • Pomocny post
    #2 8053701
    _Robak_
    Poziom 33  
    Jeśli by to nie przeszkadzało to możesz podpiąć kwarc zegarkowy, wtedy na 8 bitowych licznikach na pewno zliczysz sekundę:)
  • #3 8053765
    michal2666
    Poziom 20  
    Hm... dobry pomysł, niestety wszystkie piny mam już zajęte. Cały czas planowałem wykorzystać timer1 do tego celu ale niestety tylko on mógł zapewnić odpowiednie generowanie sygnału dla silnika krokowego.
  • REKLAMA
  • #4 8054224
    janbernat
    Poziom 38  
    Można dać zewnętrzny dzielnik sygnału do silnika krokowego na jakiejś małej zewnętrznej płytce.
    I wtedy dać sygnał z Timer0 do silnika a Timer1 wykorzystać do generowania 1s.
    Ale wydaje mi się że jednak można to zrobić na samym procesorze- wszystko zależy od czasu obsługi przerwań.
  • Pomocny post
    #5 8054683
    asembler
    Poziom 32  
    Nie rozumiem jak przerwanie od licznik 8 bitowe mialoby przeszkadzac w dzialaniu pozostalych przerwan czy calego programu.. Przerwanie np przy 16Mhz bedzie generowane 62500 /preskaler na sek od licznika 8 bitowego, a zajętość (stan CLI) procesora oceniam na ponizej 1 uS co chyba nie wplynie na pozostale zadania procesora.
  • #6 8054862
    janbernat
    Poziom 38  
    No właśnie- przerwanie od Timera co 16.384 ms a w przerwaniu tylko inkrementacja jakiejś zmiennej.
    No ale to Bascom- odkładanie na stos i zdejmowanie zajmie jeszcze kilkadziesiąt instrukcji po 0.0625us przy zegarze 16MHz.
    Ale nawet wtedy to będzie poniżej 6us.
    Wystarczy aby obsługa przerwania INT0 była krótsza od 16ms.
    Zwłaszcza że przerwanie zewnętrzne ma wyższy priorytet niż przerwanie od Timera.
  • #7 8055087
    asembler
    Poziom 32  
    Zawsze mozna zrobic wstawkę w ASM :-)
    Janbertnat - > osługa aż 16mS to wiecznosc ale nawet jakby była dłuzsza to zawsze mozna w trakcie obsługi właczyc przerwania i wtedy zostanie obsłuzone przerwanie od timera co nie pozwoli na utrate "impulów zegarowych" Zreszta to chyba tylko teoria nikt nie robi przerwac tak długich chyba.
  • REKLAMA
  • Pomocny post
    #8 8055422
    janbernat
    Poziom 38  
    Ale nie obsługa tylko co ile są wywoływane.
    No obsługa powinna być krótsza.
    Ale niektórzy potrafią w przerwanie wstawić waitms 500- nie wiem po co ale demoluje to cały program.
  • #9 8056161
    mirekk36
    Poziom 42  
    michal2666 --> sposobów jest milion. 1 sekunda to hetar czasu zresztą tak samo jak 16ms to także hektar czasu ;)

    Powiedz lepiej na co ty masz wykorzystany tenże swój Timer1 bo zaraz się może okazać, że także i jego można spokojnie wykorzystać do tych celów.

    Inna możliwość to - użycie Timera0 do odliczania impulsów do czasu upłynięcia 1sek i wtedy dopeiro wykonanie twojej żądanej operacji. Samo zliczanie to żaden problem dla przerwań INTx enkodera, poza tym wstawki asemblerowe łatwo też się robi w Bascomie.

    Wszystko zależy jak ty w ogóle potrafisz korzystać z przerwań.
  • #10 8056245
    michal2666
    Poziom 20  
    Dziękuję wam bardzo za pomoc, pomyliłem się w obliczeniach :D Przy kwarcu 8 MHz, jaki zastosowałem i przy podziale w preskalerze przez 256 okres zliczanych impulsów wyniesie 32 µs. Zliczenie w sprzętowym liczniku 250 tych impulsów to 8 ms i co 8 ms dostanę przerwanie - to już całkowicie dopuszczalne, tym bardziej, że ważniejsze są dla mnie impulsy z enkodera a dzięki wam wiem, że mają wyższy priorytet. Później już programowo zliczę 125 tych przerwań i mam 1s. Jeszcze raz dzięki za zainteresowanie i pomoc.
  • #11 8057784
    asembler
    Poziom 32  
    Z tym priorytetem to nie do końca jest tak jak myślisz. Dziala to tylko w przypadku jednoczesnego otrzymania sygnału przerwania, natomiast po wejsciu do przerwania od licznika obsługa przerwania z enkodera zostanie zawieszona do momentu ukończenia obsługi licznika. W twoim przypadku w niczym to nie przeszkodzi chyba ze faktycznie enkoder generuje "gęste" impulsy.
  • REKLAMA
  • #12 8058216
    michal2666
    Poziom 20  
    Tak, to wiem, na szczęście w przerwaniu inkrementuje tylko trzy zmienne oraz zmieniam stan flagi synchronizującej do obliczania przepływu. Pozatym impulsy z enkodera nie są aż tak gęste więc nie dochodzi do kolizji - wczoraj w nocy sprawdziłem. - jest super. Budowane urządzenie niedługo zaprezentuję.
REKLAMA