Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

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

09 Maj 2010 09:56 1437 11
  • 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.
  • Pomocny post
    Poziom 33  
    Jeśli by to nie przeszkadzało to możesz podpiąć kwarc zegarkowy, wtedy na 8 bitowych licznikach na pewno zliczysz sekundę:)
  • 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.
  • 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
    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.
  • 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.
  • 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.
  • Pomocny post
    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.
  • 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ń.
  • 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.
  • 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.
  • 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ę.