Najprostsze rozwiązanie - w przerwaniu od czujki uruchom sprzętowy timer. Przerwanie od timera powoduje włączenie alarmu. Jeśli użytkownik wyłączy system przyciskiem, to w procedurze przerwania przycisku wyłączasz timer. Żeby wszystko działało jak trzeba, musisz zezwolić na zagnieżdżone przerwania (czyli żeby ISR od timera mógł się wykonać w momencie,...
Sprawdzaj flagę w rejestrze TIFRx bez włączania przerwania w TIMSKx.
A jakie są priorytety przerwań? Do odmierzania czasu musi być przerwanie o wyższym priorytecie, inaczej zostanie zaburzone przez inne przerwanie.
Wszystko co napisałem powyżej pozostaje w mocy. Tryby normalny i CTC działają przy odmierzaniu czasu podobnie: obydwa tryby odliczaja ileś tam tyknięć rejestru TCNT i generują przerwanie. W przypadku trybu normalnego to liczenie następuje od wartości ustawianej w TCNT do wartości 0 (256), a w trybie CTC od wartości 0 do OCR (lub ICR). Zacznijmy od tego,...
Dla kwarcu 4MHz jest to prescaler 64 i początkowa wartość licznika: 193 Dla kwarcu 8MHz prescaler to: 64 i początkowa wartość licznika: 131 To pokazuje kalkulator. Chciałoby się zakrzyknąć : a nie mówiłem :-P Aby wpisać do Timer2 początkową wartość, to używamy poleceń: TCNT2=początkowa_wartosc Timer2= początkowa_wartosc Counter2=początkowa_wartosc...
Widzę, że moje programy znajdują uznanie i dobrze. Co do podawania impulsów na uC to nie można zmieniać dowolnie końcówek bo timery mają wejścia przypisane do konkretnych wyprowadzeń. Dla M8 są to T1 - 11, T0 - 6. Trzeba to brać pod uwagę przy projektowaniu układu. Dotyczy to końcówek używanych jako alternatywne. Po przeróbce czas odmierza T0 (8bit)...
Najprościej, to jeśli nadajnik nic innego nie ma do roboty to wstaw delay(100) do loop, czy jakąś mniejszą/większą wartość, która dla działania układu ma jeszcze jakiś sens. A ten delay w nadajniku da czas odbiornikowi na przetworzenie danych i wykonanie akcji zanim nadlecą kolejne dane. To samo możesz zrobić używając do odmierzania czasu millis lub...
robilem cos takiego i tez poszedlem drogą licznika i timera. Timer odmierzał kwanty czasu, a licznik przerwania INT0. Dodatkowo wykorzystałem sobie jakieś przełączniki DIP do zmiany szerokości okienka czasowego w których liczone są impulsy.
Instrukcja WAIT Przeznaczenie: Przerywa działanie programu na określony czas. Składnia: WAIT il_sekund Opis: Instrukcja wstrzymuje działanie programu na podaną ilość sekund. Odmierzany czas jest wartością przybliżoną, więc nie należy stosować tej instrukcji do dokładnego odmierzania czasu. Używanie przerwań, może znacznie wydłużyć działanie instrukcji....
Po pierwsze pozbądź się waitów, po drugie przerwania. Podam hasła do opracowania: Timery - odmierzanie czasu, przerwania, timing zdarzeń Przyciski - podciąganie, odczyt z rejestru PINn
poza tym dlaczego nie używasz sprzętowych timerów jako timerów tylko do generowania przerwań? Kolego może źle mnie zrozumiałeś ale do ustawiania flagi używam Timer0 i właśnie mnie dziwi dlaczego mi się te czasy nie zgadzają Jak do wyznaczenia czasu używam tego samego timera. Tak wygląda obsługa przerwania u mnie : Timer może zliczać czas wprost i w...
Witam. Proponuję wszystkie operacje przeprowadzić na przerwaniach. Czyli na przykład Przerwanie od Timer 1 steruje wyświetlaniem znaków co określony czas wyświetlasz kolejny znak czas dobierasz na tyle krótki żeby nie widzieć migotania, Przerwaniem od Timer 0 odmierzasz czas dla odczytu temperatury. Pozdrawiam
Mam 2 pytania. Czy rezonator kwarcowy 32.768KHz do odmierzania czasu przerwaniem sectic potrzebuje kondensatorów? Jeśli tak to jakie? Drugie pytanie. Słyszałem że do kwarca 32.768 KHz Ustawia się procesor na pracę z wewnętrznym rezonatorem 8MHz. Czy to prawda?
O układ DS3231 lekko zahaczyłem (...) Cenę sprawdziłeś? Dodano po 1 W pętli głównej procesor nie robi nic. ************************************* Do Loop End ************************************* Oznacza to, że czas odmierzasz w przerwaniach. Mam nadzieję, z timer pracuje w trybie CTC. W takiej sytuacji w pętli głównej usypiaj procka. Bascom ma odpowiedni...
Twój problem nie wynika z priorytetu przerwań tylko braku umiejętności prawidłowego ich wykorzystania i zastosowania biblioteki która jest źle napisana . Zazwyczaj dzieje się tak gdy użytkownik w przerwaniu umieszcza całą procedurę obsługi bufora , wyświetlacza lub innych peryferii lub po prostu timer odmierza krótszy czas niż trwa obsługa przerwania...
A same przerwania by sie czasem przydały. Nie widze szansy napisania sensownego programu bez użycia przerwań. Banalna sprawa w miarę precyzyjne odmierzanie czasu.
Zrób to w konwencji automatu - zmienna określające stan i duży switch (stan) w obsłudze przerwania z odpowiednim zachowaniem w każdym stanie. Na ogół wygodnie jest to zrobić przy stałej częstotliwości przerwań timera, odpowiadającej najkrótszemu odcinkowi czasu, który trzeba odmierzać lub takiemu, który jest podwielokrotnością wszystkich odmierzanych...
Po namyśle dochodzę do wniosku, że trochę trzeba zmienić koncepcję, a i tak nie wszystko się załatwi. Pomysł jest taki: 1) zegar i wszystkie sprawy jego bez zmian i cykl maszyny 1 us. 2) ponieważ impulsy mają być nie częściej niż co 1 ms to czasu trochę jest 3) do odmierzania okresu między impulsami użyj timera2 ustawionego jako licznik w trybie auto-reload...
Samo wejście i wyjście z przerwania nie kasuje sprzętowo flagi w typie Ex. Skasuj flagę przerwania "ręcznie" w przerwaniu i daj znać jak taka akcja się skończyła :D
Pierwsze przerwanie wywołuje sie po bardzo długim czasie, bo za pierwszym razem Timer musi doliczyć od 0 do 65535. Dopiero za drugim razem by zliczał od 63000 do 65535, ale też nie zliczy, bo w niewłaściwej kolejności zapisujesz dane do tcnt1. Odpowiedni czas będzie odmierzany dopiero od trzeciego przerwania. Powinno być: out tcnt1h,r17 out tcnt1l,r16...
Niewiem jaki to jest uC, ale uczono mnie ze czasy odmierza sie zazwyczaj timerami.. jesli to byloby to ustrojstwo na '51 nalzezaloby przerwanie 10 ms, zrealizowac na liczniku T2, 16 bitowym w trybie przeladowania. Realizujac odmierzanie czasu na przerwaniu, zawsze masz 10ms odstepy czasu bez bez potrzeby korekcji taktow potrzebnych do kolejnego odmierzania...
No ale napisałem, że ten program wyżej używa do odmierzania czasu przerwania od tajmera. To jest licznik sprzętowy, który odlicza z góry zaprogramowaną liczbę impulsów i po ich odliczeniu powoduje skok programu do odpowiedniego miejsca w programie, wykonanie ustalonych zadań, po czym procesor wrca do roboty, którą robił przed przerwaniem. Z zasady działania...
Nie do końca zrozumiale napisałeś. Odmierzanie czasu oczywiście da się zrobić w przerwaniach i jest to najczęściej stosowany sposób. Dobrze jest wywoływać przerwanie co stały okres, który będzie wspólnym dzielnikiem obydwu czasów, które chcesz odmierzać. Np. 250us. Wtedy w przerwaniu inkrementujesz jakiś rejestr i sprawdzasz czy osiągnął wartość 5....
Mam problem i nie mogę znaleźć odpowiedzi w dokumentacji technicznej uC a mianowicie potrzebuję odmierzać czas przerwaniami po przepełnieniu licznika a do tego ciągle wykonywać pomiar na ADC (przez określony czas). W związku z tym mam kilka pytań: 1. Ile cykli zegarowych trwa przerwanie? Jeżeli 1 proste polecenie wykonywane jest w 1 cyklu zegarowym...
Jakiś czas temu widziałem gdzieś ciekawe rozwiązanie wykorzystujące UART mikrokontrolera do transmisji 1WIRE, nie trzeba wtedy martwić się o dokładnie odmierzanie czasu i przerwania mogące zakłócić transmisję. Jak znajdę to wrzucę na elkę.
Volatile - zmienny niestabilny Jest to złowo kluczowe wyłanczające daną zmienną ( strukture itp??) z optymalizacji. Stsojuesz to tam wszędzie gdzie chcesz aby kompilator nie ingerował z optymalizacją. Stosuje się to także w przypadku gdy korzystasz z zmiennej w różnych częściach programu a szczególnie w przerwaniach. Miałem kiedyś problem przy odmierzaniu...
Load Timer 250 pojawił się 2 razy bo pierwszy jest wykonyawny przed wejściem do pętli a następny w pętli. W tym programie jest dodatkowa zmienna Licz_8ms bo Timer0 nie może odmierzyć całej sekundy w jednym przebiegu. Przy użyciu Timer1 i odpowiedniego kwarcu można osiągnąć przerwania co 1 s. Jest to korzystne bo odmierzanie czasu jest nieco dokładniejsze....
teedd -> nie zapytałeś nawet w jaki języku pisze pys1986, a zamieszczasz od razu kod. Poza tym nie wiem dlaczego chcesz zrealizować odmierzanie czasu na przerwaniu INT1 zamiast wykorzystać wbudowany timer? Jest to niepotrzebne komplikowanie zadania i dodawanie uC niepotrzebnej roboty. Na stronce jaką zamieściłem jest przykładowy zegar z kalendarzem...
Na jakiej czestotliwosci dziala procek? Poza tym ja bym zliczal sekundy przez tryb CTC, w przerwaniu bym aktualizowal zmienna. Oczywiscie samo wyswietlanie poza przerwaniem.
Ok wiec tak . mam częstotliwość wejściowa , zmienna i muszę ja niejako online zmieniać w gore lub w dół. problem w tym ze jak robię to na przerwaniach( wykrywanie zbocza, odmierzanie czasu) to mi się przerwania nachodzą i gubi niektóre przez co zmiana jest np zamiast 2,3 jest 2,6 i to też zależy od F.
W przykładzie Blink są używane przerwania właśnie na potrzeby procedury delay() do odmierzania czasu. Domyślnie w Arduino przerwania są włączone. Zostaw przerwania w spokoju (nie wyłączaj ich). Jak ma działać Twój program, co chcesz uzyskać?
Uruchomi się - tak jak pisał kol. (at)dondu na wejściu masz układy Schmitta, czyli po przekroczeniu poziomu progowego nastąpi zmiana stanu. Problem w tym, że dla różnych egzemplarzy ATMega, czy różnych warunków, ten próg będzie nieco dryfował. Więc średnio to się nadaje np. do tego, aby odmierzać czas stałej RC.
(at)ElektrodaBot czy możesz przerobić ten kod aby korzystać z precyzyjnego odmierzania czasu pobierania próbek z wykorzystaniem timera i przerwań?
Zacznie odmierzać od początku, tzn od razu załączy silnik i znów 10 minut pracy i odpoczynek...
Zrób tak: 1 licznik do odmierzania czasu, przerwanie co np 25ms 2 licznik do zliczania impulsów Jeżeli nastąpiło przerwanie np 25ms, to zlicz liczbę impulsów. W taki sposób masz dokładniejsze odmierzanie czasu, funkcja wait do tego się nie nadaje. Przeanalizuj sobie ten temat: http://www.elektroda.pl/rtvforum/topic16... a potem dodaj to co napisałeś...
Należy to zrobić na przerwaniach. Podział 1/32 akurat w tym wypadku nie będzie chyba dobry bo będzie trzeba odmierzać czas z dokładnością 50pikoSekund Przy podziale 1/1 to już "tylko" z dokładnością 5uS. Szukaj "arduino timer interrupt"
Teraz spróbuję ustawić RTC na zewnętrznym kwarcu. Zanim zamknę temat może ktoś zechciałby podpowiedzieć na co tutaj zwrócić uwagę? (Myślę że to nie odbiega od tytułu tematu) A konkretnie - jaki kwarc? przy okazji jeszcze ten link: Czas - odmierzanie
Kosztem dokładności możesz zrobić to na jednym wspólnym 2-kanałowym timerze i przerwaniu EXTIi (oddzielnym dla każdego czujnika). Dwa kanały służyłyby do odmierzania czasu impulsu startowego i kasowania czujnika - wymuszenia kończenia pomiaru, a okres timera wyznaczałby cykl pomiarowy do kolejnego przeglądanai czujników.
Witam, z powodzeniem wiele razy wykorzystywałem kwarc 12MHz do odmierzania czasu w '51. Używałem wtedy trybu '0' timera, w którym cykl zliczania młodszej połówki TL licznika jest skrócony do modulo 32, natomiast TH przeładowywany był stałą 256-50=206. W ten sposób przerwanie od timera nadchodziło z częstotliwością: 12000000Hz ÷12 ÷32 ÷50 = 625Hz Dalsze...
Sprawdź na symulatorze w którym momencie się rozjeżdżają wartości badanej zmiennej i timera1 Możliwe, że ta pętla się wykonuje więcej razy, bo warunek stopu przeskakuje. Timer jest zwiększany asynchronicznie w stosunku do programu i program może przeoczyć moment gdy Timer=konkretna wartość, bo sprawdza Timer1 w przypadkowych momentach a nie po każdej...
Zamiast przerwania od Timera0 odmierzaj czas Timerem1.
Sprawa z odmierzaniem czasu jest teoretycznie prosta ale trzeba brać pod uwagę kilka spraw. PO pierwsze musisz sobie wybrać jakiś timer i zliczać jego przepełnienia w przerwaniu. Musisz to robić w przerwaniu żeby odmierzany czas był zawsze taki sam. Zliczasz ilość tych przerwań do obliczonej wartości w zależności od częstotliwości zegara i dzielnika...
Każde przerwanie ma związaną z nim flagę. Dopóki nie doprowadzisz do sytuacji, w której kolejne, takie samo przerwanie, nie nadejdzie przed obsługą poprzedniego, to żadne nie zostanie zgubione. Po prostu obsługa przerwania się nieco opóźni, co ew. trzeba uwzględniać, jeśli masz sekcje krytyczne czasowo.
Przecież timer i preskaler są 16-bitowe TIM2 i TIM5 mają liczniki (CNT) 32-bitowe. Aby nie zakładać specjalnie nowego tematu to spytam się jeszcze tutaj. Czy powyższa metoda może zostać wykorzystana do odmierzania czasu rzędu 1 mikrosekundy. Wyrzuć przerwanie. Ustaw PSC na 83 i ARR na (unsigned)-1. Z TIM5->CNT będziesz odczytywał us.
tak jest w bascomie i koniec, nic na to nie poradzisz prawdopodobnie czas potrzebny na przeliczenie ile porezeba instrukcji na 1 uS jest porównywalnie duzy z czasem 1uS dlatego było by to bez sensu. jeśli chcesz zrobić programowane PWM to użyj przerwania licznika do odmierzania czasu i całłą obługe zrób w przerwaniu. ja tak czasami robie gdy potrzebuje...
Ja dorzucę jeszcze jedno - jakby nie napisał ISR to odmierzanie przerw przez delay w pętli głównej już nigdy nie będzie działało prawidłowo - odliczany czas powiększy się o czas realizacji wszystkich przerwań. To można ominąć w prosty sposób wywalając te delaye i robiąc opóźnienia na timerze.
imer2 ma odmierzać czas między przerwaniami INT0 i INT1 z dokładnością 1uS Koniecznie musi być pomiar pomiędzy tymi wejściami? Do takich precyzyjnych pomiarów używa się trybu przechwytywania. Używanie do tego przerwań zewnętrznych jest nieporozumieniem. Wystarczy, ze będziesz miał aktywne inne przerwania i co jakiś czas wejście w INT0 czy INT1 będzie...
#define F_CPU 1000000 Jak uzyskałeś częstotliwość 1MHz? ATTINY13 ma wewnętrzny RC=9.6MHz. Po podziale przez 8 daje 1.2MHz. Bez zewnętrznego sygnału albo grzebania w OSCCAL ciężko jest uzyskać 1MHz. Tak na marginesie to częstotliwość powinno się definiować w ustawieniach projektu. Dodatkowo delay w pętli głównej przerywanej przerwaniami nie będzie wiarygodny....
Tak, wiem, ale T0 zlicza impulsy drogi, a T1 odmierza czas :) Jest jeszcze T2. Nie wiem jak używasz T1, ale jeżeli tylko do generowania przerwania co 0,5sek to rozrzutność :) Zawsze można zwiększyć częstotliwość przerwań np. 100, czy 1000 krotnie i wykorzystać timer także do innych celów, odmierzając w jego przerwaniu różne odcinki czasowe do różnych...
Jeśli Timer odwraca stan pinu to tylko raz. Musi minąć znów czas do następnego przerwania żeby znów odwrócić stan. Obliczenia nastawia się więc albo na przerwania do odmierzania czasu, albo na takie do częstotliwości wyjściowej na pinie. Wtedy musisz podwoić częstotliwość przerwań by dwa razy zmienić stan pinu.
Jeśli procesora nie wprowadzasz w tryb uśpienia, to zmiana poboru prądu przez procesor jest porównywalna jak by cały czas wpisywał te dane, jak i co jakiś czas.. jak chcesz, to możesz wykorzystać timer do odmierzania jakiś odcinków czasu np 200ms (w przerwaniu ustawiać jedną flagę, nic więcej) a w pętli głównej jeśli ta flaga jest ustawiona, to aktualizacja...
A co jest złego w odmierzaniu czasu i obsłudze wyświetlaczy w jednym przerwaniu? O ile nie masz typowego zegara RTC (na kwarcu 32768Hz), to właśnie ten sposób jest najlepszy. Zmiany wymaga natomiast Twoje podejście do tej kwestii. Program powyżej jest lekko chaotyczny. Nie rozumiem dlaczego sekundy potrafisz liczyć w 1 zmiennej, a do minut już potrzebujesz...
1. Poszukaj coś o słowie kluczowym volatile. Zastanów się gdzie w Twoim programie go brakuje. 2. Odmierzasz 0.1 s i w tym czasie liczysz impulsy. Ale zanim zaczniesz liczyć to wcześniej wykonujesz w przerwaniu obsługę LCD. Więc właściwie liczysz w czasie 0.1s - czas obsługi LCD. Jesteś pewien, że jest on stały? Uwzględniasz to w obliczeniach? Albert
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.
Jeśli możesz użyć biblioteki to polecam http://homepage.hispeed.ch/peterfleury/a... jeśli nie to możesz się na niej wzorować. Ma bufor kołowy, odbiór/nadawanie w przerwaniach, przykład z parsowaniem danych też znajdziesz w google. Wyświetlając komunikat zachęty powinieneś ustalić ściśle akceptowalny format, np. Time:RR-MM-DD-GG-MM-SS,...
Pozmieniałem... teraz Timer żyje sobie własnym życiem...przerwanie wyskakuje co 100ms, ale raz na jakiś czas jest jakgdyby to przerwanie ciągle...i się wysypuje, bo gdyby cały czas zliczał w równych odstępach (złych, ale równych, to byłoby już coś).
Przy takim trybie pracy timera (zamiast sugerowanego przez piotrva CTC) Twój zegarek będie się zawsze późnił, bo od zgłoszenia przerwania do przeładowania timera zawsze upłynie pewien czas, w dodatku nie zawsze taki sam. To nie jest dobry sposób na dokładne odmierzanie czasu.
Szybszy może i by był - to znaczy procesor miałby więcej czasu do nudzenia się :) - przecież odmierzanie czasu następuje w przerwaniu a cała reszta to wyświetlanie i obiór z pilota. Czyli dużo niewykorzystanej mocy obliczeniowej nawet przy 1MHz. Przy bardziej robudowanych programach to może mieć znaczenie, przy czymś takim to wygoda/objętość kodu vs...
Będzie to strasznie niedokładne. Pomyśl o module DS1307. Jeśli jednak wolisz odmierzać czas "ręcznie" to najlepiej zaprząc przerwania. Spróbuj napisać choćby fragment, który miga diodą co 10 sekund. Pokaż ile potrafisz.
AVE... [url=http://ece.wpi.edu/~wrm/Courses/EE2... masz przykład tego, jak możesz napisać kod w C dla użycia przerwania timera do odmierzania czasu... Druga rzecz: czemu nie użyjesz portu z przerwaniami zewnętrznymi i nie ustawisz sobie przerwania na zbocze wznoszące sygnału lub nie użyjesz PICa z wewnętrznym komparatorem...
przerwanie timera wpływa na polecenia z rodziny Wait - powodują one, w zależności od częstości wydłużenie czasu oczekiwania, dlatego trzeba w takim wypadku odmierzać czas używając timera ;-)
Trzeba skracać czas który Timer ma odmierzać. W tym trybie zrobisz to najłatwiej w przerwaniu. Zaraz pod "Obrot:" użyj jednej z komend Load albo Timer= Po prostu teraz Timer liczy od 0 do 255. Jak coś do niego wpiszesz to będzie liczył, na przykład, od 128 do 255 czyli krócej. Dodaj sobie potencjometr do układu i będziesz mógł sterować prędkością w...
W helpie bascoma nie znalazłem konkretnej odpowiedzi na moje pytanie. Odnośnie wait pisze tam tylko "Instrukcja wstrzymuje działanie programu na podaną ilość sekund. Odmierzany czas jest wartością przybliżoną, więc nie należy stosować tej instrukcji do dokładnego odmierzania czasu. Używanie przerwań, może znacznie wydłużyć działanie instrukcji ."Osobiście...
Timer0 jest jako licznik więc na co mi prescaler?... Upsss... racja. Biorąc to nawet na chłopski rozum to by było bezsensowne. Sorki... jakiś zastój w głowie :) Licznik wykorzystaj do odmierzania odcinków czasu w przerwaniu, a impulsy możesz przecież programowo liczyć na dowolnym pinie w tym czasie. Z programikiem do odczytu zbocza impulsu chyba nie...
No nic pokażdym przerwaniu wyłącze obsługę przerwań na 10ms oczywiście ten czas odmierzając na timerku. Mam nadzieje że zda to egzamin. Pozdrawiam i wszystkim dziękuje za dialog
Z grafiką pod DOS to raczej nie maiłem do czynienia na poziomie driverów. Kiedyś robiłem kawałek kodu który wykrywał czy Herkules jest w trybie tekstowym czy graficznym - rejestry kart CGA i Herkules bywały RO i WO, czasem RW więc nie zawsze dało się wyczytać jak są ustawione, dodatkowo Herkules adresami i podstawowym trybem tekstowym udawał kartę MGA...
Twoje obliczenia są (z grubsza) OK, jednak w mikrokontrolerze ATmega328 rejestr TCCR0A nie posiada bitów CS00 oraz CS02. Bity te znajdują się w rejestrze TCCR0B. Notabene, bitów WGM0n nie musisz zerować. W trakcie Power on Reset zostają one ustawione na wartość 0. Zerowanie może być konieczne tylko wtedy, kiedy wcześniej sam ustawisz je na wartość...
Metoda jest taka ze w momencie nadejscia przerwania od przycisku odpalasz timer, ktory odmierza kilka milisekund, po czym sprawdza czy przycisk nadal jest wcisniety. Jesli tak, to znaczy ze impuls pochodzi od faktycznego nacisniecia a nie od drgania po nacisnieciu. Dla pewnosci mozna zamiast 2 dokonywac 3 sprawdzen. Czas timera musisz dobrac doswiadczalnie.
tak kod by co nieco wyjasnic mogl sprawe. Tak jak pisze mirekk36 kod moze isc w maliny ale tez jak sugeruje mozna obejsc problem poprostu nie uzywajac przerwania do odmierzania czasu bo i po co? wystarczy sprawdzic flage w while'u
(at)Gunis-92: Możesz wykorzystać do odmierzania czasu np. SysTick [syntax=c] volatile uint32_t licznik_tykniec;// zmienna globalna /* obsluga przerwania od licznika/timera SysTick */ void SysTick_Handler(void) { licznik_tykniec++;// inkrementacja licznika } void delay(uint32_t czas) { uint32_t aktaualny_licznik_tykniec; aktaualny_licznik_tykniec = licznik_tykniec;...
Tdv, Mam male pytanko do ciebie... Czytalem Twoje faq o kwarcach 11059200 i rzeczywiscie ma to sens. Moje pytanie, czy nie bedzie przeklamania jesli obsluga przerwania dla odmierzanego czasu jest na nizszym priorytecie, ale chodzi mi o sytuacje kiedy procesor obsluguje przerwanie o wyzszym priorytecie i pech akurat chcial ze licznik w tym momencie wlasnie...
Ale do odmierzania tego czasu nie potrzebujesz delay. Zrób to w przerwaniach, dzięki temu łatwo też uzyskać regulację prędkości.
Jeśli przerwania nie są wykorzystywane w programie to od bidy te WAIT jest w miarę dokładnie (na tyle na ile zegar trzyma) ale zdecydowanie lepszym rozwiązaniem jest używanie timerów do odmierzania czasu. W momencie włączenia przerwań dokładność WAIT drastycznie spada. Najlepiej zapomnij o WAIT i naucz się timerów. WAIT można spokojnie i bezpiecznie...
Docelowo będzie to pracować w przerwaniach i będzie odmierzać czas. Liczenie pętli jest dobre do eksperymentów, bo bardzo szybko i łatwo można zaprogramować. Jak tylko dostanę MOC'a i uruchomię, dam znać. Póki co dzięki za wszystko ! PL
..... wymagane jest precyzyjne odmierzanie czasu (transmisja, inicjalizacja, itd.) Jak precyzyjne to odmierzanie czasu ma być i jaka jego wielkość? Liczniki programowe z wykorzystaniem sprzętowego timera są bardzo dobrym rozwiązaniem i do obsługi 1WIRE w zupełności wystarczy. Jeżeli zależy Ci na bardzo dużej precyzji uwzględnij w obliczeniach czas...
Proszę o pomoc. Problem z układem, czy w programem??? Może być problem z prędkoscią procesora, dla klasycznej '51 nawet z szybkim kwarcem. Zakładając, ze procesor ma wystawiać dane na port(y) powiedzmy 256 razy w okresie dostajesz przy 10kHz częstotliwość próbkowania 2,56 MHz. Oprócz tego, że masz wystawić daną, musisz jeszcze odmierzać czas, przy...
Problem bierze się stąd, że rzadko kiedy przerwanie jest wywoływane co jakiś "okrągły" czas, np. co 100us. Zwykle użyty kwarc i preskaler powodują, że odmierzane odcinki czasu pomiędzy przerwaniami nie są "okrągłe", a co za tym idzie łatwe do liczenia. Dodatkowa zmienna f ułatwia nam zliczanie milisekund. Akurat w podanym przykładzie przerwanie ma być...
Minimalna częstotliwość odświeżania to ~100Hz. Jeżeli jest mniejsza, to cyfry "pływają" kiedy na nie patrzysz lub kiedy ruszasz głową. W praktyce przyjmuje się typowo ~250Hz, co dla 4 cyfr oznacza konieczność generowania przerwań z częstotliwością ~1000Hz. Więcej nie trzeba, ponieważ zajmujesz procesor obsługą przerwań, a nie daje to żadnego zysku na...
Ja tam skracam temat flag w ten sposób, że w przerwaniu Timera jakaś wartość jest odliczana do zera i dalej nie ruszana. Dopiero jakaś procedura w pętli głównej sprawdza czy jest zero, ustawia dalej odmierzanie czasu i podejmuje akcję.
Witam! Mam w swoim programie chciałbym wykorzystać timer w trybie one pulse do odmierzania czasu, ale w taki sposób, żeby można było wyłączyć timer w przerwaniu od wartości CCR. Do tego celu wykorzystuje TIM2 (general purpose). Niestety timer nieprawidłowo odmierza czas kiedy chcę go wyłączyć bitem CEN(np wpisuję ze ma się wyłączyć po 100us a wyłącza...
Sylwekk też dobrze gada. Ale trzeba pamiętać że: 1) zawartość przerwania musi się wykonać szybciej niż odstęp pomiędzy przerwaniami 2) jeśli w przerwaniu robisz Load Timer i zależy ci na jakiejś precyzji odmierzania czasu to ten Load musi być zawsze pierwszą instrukcją w przerwaniu, a nie którąś z kolei.
Nie bardzo mam teraz ochotę zgłębiać kod ponownie, ale pamiętam że w Twojej wersji Timer odmierzał czas 20s i kiedy nadszedł czas to w przerwaniu mierzył temperaturę Dallasem DS18B20 i w dodatku pisał od razu po wyświetlaczu :D Dlatego jedną ze zmian było to, że Timer tylko ustawia flagę by dokonać pomiaru i go wyświetlić. Tak więc dopóki nie jesteś...
Sam widzisz, że musisz odmierzać czas. Każdy projekt z mikrokontrolerem zaczyna się od przerwania timera. Bez tego nie da się zrobić prawie nic.
Nie tylko wywołanie ale procedura obsługi przerwania zajmuje troszkę czasu. Może zdarzyć się taki przypadek że procedura obsługi przerwania trwa zbyt długo. W tedy aktualne przerwanie blokuje obsługę samego siebie. Przykład Timer0 - liczysz czar 8us. Po obliczeniu 8us następuje procedura obsługi przerwania od timera0, która trwa około 15us. W trakcie...
Moim zdaniem to nie zadziała przez zmienność cyklu PLC, który obsługuje zapewne jeszcze inne rzeczy w tym komunikację. Ja w tej sytuacji dałbym tam "koprocesor" w postaci arduino w przemysłowym wykonaniu (np. Controllino). Odmierzanie czasu w pętli, bez przerwań; zmiana nastaw przez Ethernet tylko podczas postoju. Da się osiągnąć powtarzalność liczoną...
1. Dlaczego do sterowania przesunięciem fazowym nie jest potrzebny tryb CTC, tutaj chodzi przecież o odmierzenie ściśle określonego czasu od momentu przejścia przez zero? Co kolega Sylwekk ma na myśli ? ... Nie rozumiem jednak co kolega Sylewkk ma na myśli radząc abym pogonił tyrystor przez MOC3021 ? Czy takie coś zapewniło by separację galwaniczną...
W Atmega8 timer mógł odmierzać określony czas i dawać przerwanie czy coś w tym stylu. Zastanawiam się w jaki sposób do obslugi enkodera wykorzystuje się timer zamiast przerwań reagujące na zmianę zbocza sygnału albo jakiś liczników ?
a jesli powiem ze tak tez próbowałem tylko ze odczyt z kodów z rc5 trwa z przerwą 600ms która musi byc pomiedzy odczytem a konwersją temperatury z ds1820 :( Jakoś nie widzę problemu. Przecież Int0 ma wyższy priorytet niż DS. Jerśli istnieją jakieś konflikty to należy zablokować przerwanie Int0 na czas inicjacji DS'a i odczytu temperatury. W trakcie...
To wykorzystaj drugi timer. Co prawda 8 bitowy ale też da rade. Skonfiguruj go tak, aby odmierzał np. odcinki po 0,01s jeśli chcesz mieć 1s to w obsłudze inkrementuj dodatkową zmienną i w zależności od wartości reaguj na zmiany. Po 100 przerwaniach będziesz mieć 1s.
ale żeś mnie zjechał.. przyznaję się.. mój błąd.. dopiero zaczynam.. napisałem to pierwszego dnia zabawy z bascomem.. to jest mój program przez który się uczę obsługi pilota, wyświetlacza itd... z tąd moje podstawowe błędy.. do tej pory pisałem programy na PC z tąd moja niewiedza o tempie wykonywania instrukcji.. wiedziałem, że jest wolniejsza ale z...
Możesz ten kod umieścić w przerwaniu czasowym lub zrobić podobny licznik w OB1, który będzie dodawał milisekundy, zmierzone np.: funkcją RUNTIME. Jaki ma być cel takiej zabawy?
Timery i dokładne odmierzanie czasu w różnych miejscach kodu. Zamiast korzystać z kilku timerów, można w różnych blokach kodu konfigurować 1 timer i wstrzykiwać odpowiednią funkcję przerwania. Oczywiście pod warunkiem, że nie będziemy musieli odmierzać czasu dla dwóch bloków jednocześnie. Wygląda na to, że potrzebujesz po prostu callbacka w jednym...
Witam. Mam problem z przerwaniami w atmega8. Wcześniej nie potrzebowałem przerwań więc to zagadnienie mnie nie interesowało. Potrzebuję wywołać przerwanie zewnętrzne int0 które uruchomi timer1, a ten zacznie odmierzać czas. Proszę o pomoc. Pierwsza zasadnicza uwaga to nie zauważyłem w programie konfiguracji interruptu0- coś np. takiego: config INT0=...
CLK i DIR czego? Od odmierzania czasu są timery mikrokontrolera i ich różne tryby plus ewentualnie przerwania. Więcej podpowiemy, gdy zapytasz pytasz o konkrety.
Z opisu autora wynika, ze chyba nie ogranicza nasz sama szybkosc I2c ale cos z bibliotekami jest nie tak skoro ma migotanie jak rozumiem przy cyklu 2ms (ja proponowalem nawet 20ms). To by oznaczalo, ze cykl trwa znacznie dluzej bo np. czekamy na cos w bibliotece. Ale tak jak pisze Piotrus_999 byloby to cwiczenie czysto edukacyjne bo dosc trudno byloby...
A ja zacznę od początku. Co autor miał na myśli? Czy uzyskanie precyzyjnego przebiegu na wyjściu o częstotliwości 1kHz czy precyzyjne generowanie Przerwania? I teraz poprawcie mnie jeśli się mylę. Jeżeli mam precyzyjnie generowane przerwanie i softwarowo generuję przebieg na wyjściu to i tak otrzymam przebieg tak dokładny jak dokładne przerwanie generuje....
Jeśli chciałbyś się wznieść trochę wyżej, poczytaj o timer-ch. Umożliwiają one bardzo dokładne odmierzanie czasu (zależe od dokładności użytego kwarcu) i wykonanie procedury w przerwaniu, czyli po czasie jakie odliczył timer i bez względu na to jaki kod akurat realizuje procesor.
A czy w BASCOMie komenda 'wait 1' przy dyrektywie $crystal=<fosc> nie załatwi wszystkiego ?? A jeśli chodzi o precyzyjne odmierzanie czasu to polecam asembler i obsługe timera w przerwaniu. To jest chyba najdokładniejszy sposób. Pozdrawiam.
Układ RTC to ten do którego podłączony jest "mały kwarc" ( zegarkowy ten okrągły podłużny) nigdy nie wnikałem w istotę działania tego sterownika, ale robiłem podobny do innych celów i zrobiłem go tak że odmierzaniem czasu zajmuje się oddzielny scalak RTC (jakiś PCF dokładnie nie pamiętam , chyba 8583 podłączony do procesora przez I2c) ten RTC wywołuje...
Tak, mają to być dwa równe odcinki czasu. Musi być to zrealizowane na dwóch timerach, ponieważ w czasie działania programu pojawi się czynnik zerujący jeden z timerów, a drugi nadal w tym samym czasie będzie musiał odmierzać te 800ms. Ponadto przerwania od timerów sterują dwoma niezależnymi od siebie operacjami. Więc skonfiguruj Timer1 w trybie CTC...
odmierzanie czasu odmierzanie czasu stm32 timer1 odmierzanie czasu
domofon bezprzewodowy otwieranie bramy pompka volvo kupić tranzystory 2sc2166
elektryk kombajn podłącznie awaryjne budynku
Philips 423902186972 NTC Sensor in Steam Generators – Function, Specs, Faults Mercedes ML W163 Diesel – czas wymiany stacyjki EIS/EZS, programowanie, klucze