Żeby wywołane zostało przerwanie musisz jeszcze odblokować globalną flagę zezwolenia na przerwanie (sei()) i skonfigurować kontroler przerwań - odblokować przerwanie o najwyższym priorytecie.
Witam, Popełniłeś kilka błędów: - aby odblokować przerwania od przepełnienia timera 1 trzeba ustawić bit 2 a nie 5 w rejsestrze TIMSK - wektor przerwania od przepełniania timera 1 to nie 0x12 a 0x24 Dobrze jest przy pisaniu w C korzystać z funkcji dostarczanych wraz z kompilatorem "intrinsic function" takich jak __interrupt_enable, __interrupt_disable,...
A masz jakiegoś LEDa podpiętego w układzie? Jeśli tak to zapal go wewnątrz przerwania. A potem okomentuj tę linię zapalającą LEDa, przekompiluj i uruchom jeszcze raz, żeby się nie zapalił. W ten sposób upewnisz się, że przerwane na pewno się wykonuje.
To po prostu fototranzystor odbiorczy+dodatkowy, i sygnał z takiego "odbiornika" (np. post #29) wrzucasz na Timer skonfigurowany podobnie jak miernik częstotliwości. Ciebie interesuje jedynie, czy jest odbierany sygnał czy nie, czyli z odpowiednim bramkowaniem, jeśli nastąpi przepełnienie Timera to sygnał jest odbierany, jeśli nie nastąpiło to brak...
procesor pracuje z czestotliwościa 10Mhz czyli jeden okres trwa 1/10Mhz = 0,1us domyślam się ze jest on ustawiony z preskalerem równym 1 przepełnienie timera i wywołanie przerwania następuje gdy timer osiagnie 2^16=65536 czyli w tym przypadki 65536 - 64566 = 970 cykli 970 cykli * 0,1uS = 97us cała filozofia czas ten zalezy od czestotliwośći kwarcu,...
Z obecnym kodem dioda miga bardzo szybko. Nie mam pojęcia co robię źle, męczę się z tym od dłuższego czasu. Zamiast korzystać z dodatkowych narzędzi, które też trzeba rozumieć lepiej zajrzeć do noty układu, w której jest wyjaśnione jak to policzyć. Problem w tym, że przy taktowaniu 8 MHz, nawet jeśli użyjesz preskalera 1024, to ciągle w ciągu 1 s masz...
Witam. Ja detekcję robiłem prościej - sieć przez rezystor 47k / 3W podaję na mostek prostowniczy a wyjście mostka na diodę CNY17. Tranzystor transoptora podłączałem kolektorem do wejścia INT1 atmegi, a emiter do masy. Rezystor podciągający kolektor do +5V miał wartość 4,7k lecz uważam że równie dobrze można było go nie stosować. W programie korzystałem...
Nie znam sie na Arduino, ale ogółem ja bym to na AVR zrobił tak że ustawił timer na przepełnienie co np. 70 ms i w procedurze przerwania napisał coś na wzór tego kodu: [syntax=cpp] ISR(TIMER0_OVF_vect) //przerwanie generowane co 70 ms { if(SERWO_PWM < zadana_pozycja) { SERWO_PWM += skok; } if(SERWO_PWM > zadana_pozycja) { SERWO_PWM -= skok; }...
Może spróbuj w ten sposób : $crystal = 4000000 Config Pind.5 = Output 'ustawienie wyjścia na pinie który standardowo sygnalizuje przepełnienie timer-a Config Timer0 = Timer , Prescale = 1 'ustawienie timer1 dzielnik 1 On Timer0 Przerwanie_timer1 'wywołanie przerwania po przepełnieniu timera Timer0 = 145 'wartość początkowa od której timer bedzie zliczł...
wykorzystaj wolny timer w uC , wprowadź zmienną licznikową i np. co określoną ilość przepełnień timer ,skok do prodprogramu ;)
Wyżej sam sobie odpowiedziałeś. Timer pracuje w trybie, w którym zapis "OCR1A = dzielnik" nie zapisuje wartości "dzielnik" do rejestru tylko do bufora, a wartość okrojona do ośmiu bitów zapisywana jest do OCR1A przy przepełnieniu timera.
Emarcus on liczy przepełnienia timera, który generuje przerwania, co 4ms i coś tam robi w przerwaniu. Ostatnia linijka postu, który cytujesz.
Program z założenia jest dosyć prosty: jak sygnał na wejściu zmieni się z niskiego na wysoki to startujesz Timer0, a zatrzymujesz po zmianie sygnału na niski. Porównujesz "zawartość" Timera0 z wartościami zadanymi (obliczonymi) i odpowiednio ustawiasz dwa wyjścia, po jednym na przekaźnik. Zerujesz Timer i czekasz na kolejny impuls. I to w sumie tyle....
Dodajesz przerwanie od przepełnienia timera i w nim zliczasz ilość przepełnień. Reszta to już matematyka. Przykłady: http://mikrokontrolery.blogspot.com/2011... http://mikrokontrolery.blogspot.com/2011...
Timer0 w Atmega8 może pracować tylko w trybie OVERFLOW (przepełnienia).
Tak się nie robi. Myślę że ten timer się parę razy przepełni zanim obsłuży LCD. Ustaw timer tak aby wywoływał przerwanie przy danej wartości i w tym przerwaniu dodawaj jakąś zmienną o 1 i czyść licznik.
1. Do wyznaczenia co ile następuje przepełnienie timera potrzeba znać taktowanie procesora. Dla kwarcu 12MHz timer zwiększany jest o 1 co 1us (= 12/12MHz). 2. Timer to licznik, który zlicza w górę. Wpisując liczbę do rejestrów tego licznika zlicza on od tej wpisanej wartości, czyli szybciej doliczy do maksymalnej wartości (65535) i "przekręci się" co...
Jeśli ARR=500 i CCR4 = 100 W tym przypadku LED duty cycle powinien wynosić w przybliżeniu 1/5 (precyzyjniej 100/501). Ale okresem (częstotliwość) przepełnienia timera zależy także od częstotliwości wejściowej i od PSC
Wygląda, że masz podobny problem jaki ja miałem niedawno na procesorze STM32F030R8... Sytuacja u mnie wyglądała tak: Taktowanie APB 48MHz, TIM1->PSC = 480. Co daje takt 10uS. Timer konfigurowany "po rejestrach". Zliczam impulsy timerem i czekam aż się timer przepełni: TIM1->ARR = 150 (zgłoszenie przepełnienia co 150*10uS=1.5mS) Okazuje się, że timer...
A jakiś przykład kodu jest kolega w stanie pokazać? Ustawiasz timer, tak aby się przepełniał po czasie np. 1,5 znaku. W przerwaniu odbioru, zerujesz licznik timera. W przerwaniu przepełnienia timera ustawiasz flagę - koniec transmisji. Oczywiście w zależności od konkretnych peryferiów dostępnych w MCU, można ten proces zoptymalizować. Do tego dodałbym...
Jeśli popatrzysz na swój kod dołączony do zadania, możesz zauważyć że nie tyle ty piszesz przerwanie dla przepełnienia timera, co podajesz funkcję, którą ma wywołać implementacja ISR z biblioteki, gdy przerwanie nastąpi . Oznacza to dla nas tyle że gdy korzystamy z tej biblioteki nie możemy napisać wektora przerwania u nas, bo doszło by do redeklaracji...
Daruj sobie obsługę przepełnień i przerwanie od przepełnienia timer - kompletnie nic one nie wnosi. Po prostu zapisz wartość timera przy zboczu narastającym, a przy zboczu opadającym odejmij od bieżącej wartości tę zapamiętaną - przewinięcie typu uint16_t przez zakres samo załatwi sprawę. Skąd wiesz, jakie masz wartości, skoro nic z nimi nie robisz?
Instrukcja Wait nie stopuje procesora. Procesor odlicza czas poprzez zmianę wartości rejestrów a więc działa. A skoro działa to powinien także odczytać informację, że nastąpiła sygnalizacja od przepełnienia Timera. Spróbuj zastosować tą instrukcję. Tylko nie wywołuj jej w obsłudze przerwania a w pętli głównej. Bo gdybyś wywołał jej obsługę w przerwaniu...
Czekaj, czekaj. Jeden czujnik odpali przerwanie INT0 a w tym przerwaniu sie uruchomi timer. Drugi czujnik po INT1 ma go wyłączyć. Raczej o tym myślałem. Lepiej tak: czy ktoś by mi dokładnie wytłumaczył jak wywoływać timery, zbierać z nich czas, do czego służą poszczególne rejestry. Noty katalogowej tego procka po polsku nie znalazłem, a dobrego poradnika...
Nie neguję rozwiązania przerwanie-w-przerwaniu, w niektórych sytuacjach jest to rozwiązanie bardzo eleganckie i efektywne, tylko należy pamiętać aby dobrze wyłączać przerwania. Nie popieram natomiast pętli oczekującej w przerwaniu, kod warto przeprojektować względem tych pętli pozbywając się ich - czy to przez automat skończony zmieniając INT1 na przerwanie...
Problemem jest to jakieś. Jesli timer ma np. okres 550us, a twoja pętla np. 551us to się robi problem - synchronizacja będzie się co raz bardziej rozjeżdżać, a kolejnej impulsy PWM będą co raz bardziej zniekształcone. Zamiast delay zrób tak jak pisałem - w funkcji obsługi przepełnienia timera uaktualniaj OCR. W dodatku musisz tak ustawić preskaler,...
Tak poza tym coś mi tu nie gra. - ATmega8A może być taktowana do 16 MHz a nie 14 MHz - nawet przy 14 MHz częstotliwość w FastPWM wyjdzie ~54 kHz. Zmniejsz rozdzielczość, tworząc na przerwaniach programowy PWM. W przerwaniu przepełnienia Timer-a możesz ładować odpowiednią wartość, zmniejszając tym efektywnie jego rozdzielczość. Pamiętaj przy tym, że...
Jeśli piszesz w WinAVR i otworzysz plik w asemblerze to zobaczysz, że każde nie używane przerwanie prowadzi do resetu. Nieużywane tzn. nie posiada funkcji obsługi przerwania. Przerwanie takie od np. przepełnienia timera może nastąpić jeśli zostanie odblokowane, ale jak mówisz w tym przypadku to nie to. Możesz po prostu wyłączyć watchdoga i upewnić się...
A nie możesz napisać własnej procedury "Getrc5" w bascomie? Uruchamiasz PWMy, więc znasz częstotliwość przepełnienia dowolnego timera. W getrc5 sprawdzasz odstępy pomiędzy zdarzeniami na pinie odbiornika IR - trzeba wziąć poprawkę na przepełnienie timera, ale oprócz tego nic się nie zmienia. Pozdrawiam, Dr.Vee
Tu uruchamiasz timer0 z preskalerem ... [syntax=c] //######## konfiguracja timera1 ############## TIMSK |= (1<<TOIE0); //Przerwanie overflow (przepełnienie timera) TCCR0 |= (1<<CS02) | (1<<CS00); // źródłem CLK, preskaler 1024 TCNT0 = timer_start;// //Początkowa wartość licznika //######################################... [/syntax]...
Zasada jest taka, że podczas wykonywania przerwania, wszystkie inne przerwania są zablokowane (chyba, że się jawnie ponownie załączy przerwania, ale to wymaga kilku drobnych operacji aby nie przeładować stosu). Jeśli w pętli głównej jest wywoływane "rc5decode", to przerwanie ustawiające "timer_flag" będzie się wykonywać. Natomiast załączenie rc5decode...
To, kiedy jest generowane przerwanie i jakie, nie zależy od tego, jakie napiszesz procedury obsługi przerwań, a od tego, jakie przerwania włączysz w odpowiednim rejestrze. Do każdego włączonego przerwania musisz napisać procedurę jego obsługi. Jeśli włączasz TOIE - musisz mieć procedurę timerX_ovf_vect, jeśli włączasz OCIE1A - musisz mieć TIMER1_COMPA_vect....
Można by ustawić przerwanie zewnętrzne na zbocze narastające, uruchomić timer i przełączyć przerwanie na zbocze opadające. Gdy pojawi się to opadające to zatrzyma timer i masz czas impulsu. Jeszcze jedynie uwzględnić przepełnienie timera, w razie jak się coś przestawi z czasami.
Jakim micro metalowy. Ale ten już jest dla mnie do przyjęcia bo to może być wina też chińskiego generatorka na układzie nuvoton n76e003at20 bez kwarc wiec też ma spore pomyłki zapewne. A tak jeszcze tylko zapytam przepełnienie timera, bo w sumie minuta ma 60s ale zegar pokazuje po 59 zero a jak tu jest? zegar tyka 65535-0 czy 65534-0?
Witam, nie wiem czy kolega używa CubeMX, ale w tym środowisku możemy ładnie określić coś takiego jak slave mode dla timera. I teraz ten drugi timer byłby slavem względem pierwszego i dodatkowo należy mu ustawić chyba trigger source na przepełnienie timera, który jest masterem. Piszę z pamięci także mogę się mylić. Ale musi być przecież taka opcja generowania...
Czy komuś udało się uruchomić prostą obsługę od przepełnienia TIMERA 2 w Atmedze 8. Mi się udało.
Co 3.88us wywołujesz przerwanie od przepełnienia timera. A przetwarzanie ADC w pętli while trwa 0.12ms- czyli 120us. Czyli podczas tej pętli pojawi się wielokrotnie przerwanie od timera0. A jeśli się pojawi podczas sprawdzania warunków tej pętli to moga się dziać dziwne rzeczy. Jedna instrukcja przy 8Mhz trwa 0.125us. Czyli obsługa przerwania powinna...
Przepełnienie timera 2 nie ma znaczenia, po prostu skrócisz czas pomiaru do np. 1ms, bo po co mierzyć dłużej? Dla 5MHz będzie to nieistotny błąd, a zawsze możesz timer rozszerzyć - w przerwaniu przepełnienia timera2 wystarczy w tym celu inkrementować kolejną zmienną. Co do przebiegu - tak, musi mieć wartośćTTL kompatybilną z zasilaniem procesora. Jeśli...
Pusty blok jest dlatego, że utknąłem na konfiguracji Timer0. Jeśli chodzi o rejestry, to podejrzewałem, że jest tak, jak Kolega pisze. Wartość TCNT0 = 6; trzeba będzie wpisać do przerwania Timera Przy ustawieniach: [syntax=c] TCCR0A = (1 << CS01)|(CS00); // źródłem CLK, preskaler 64 TIMSK = (1<<TOIE0); //Przerwanie overflow (przepełnienie...
Hehe... zrobiłem to właśnie według tego drugiego sposobu... Odmierzam 40 cykli timerem i po przepełnieniu odczytuje bit (już po synchronizacji). Problem polega na tym, że taka pętla z odczytem (w pętli jest tylko oczekiwanie na przepełnienie) timera może zająć ponad 20 cykli i właśnie na tym się wszystko wykłada. Teoria wygląda wspaniale - praktyka...
Załóżmy: Zegar = 8MHz Preskaler = 64 Obliczenia: 1 / (8MHz / 64) przerwanie , a w nim zwiększać niezależny licznik (jakąś zmienną). Wtedy wynik: CZAS timer nie zdążył się przepełnić , to od startu do teraz minęło 8 x 120 = 960us...
robisz sobie zmienna 1bajtową i na przerwaniu od timera (kiedy sie przepełni) inkrementujesz ją( zwiekszasz o 1). Wtedy łaczna ilosc zliczonych impulsów wyniesie zmienna1*256+timer. Piszesz sobie najpierw procedurke ktora wyswietli pojedyncza cyfre, nastepnie piszesz procedurke ktora wyswietli całą cztero cyfrową liczbe. Wyswietlanie robisz w petli...
Opisujesz kod inny niż wkleiłeś: [syntax=c]int main(void) { DDRD = 0xFF;//diody DDRC = 0xff;//przyciski //######## konfiguracja timera ############## TCCR0 |= (1<<CS02) | (1<<CS00); // źródłem CLK, preskaler 1024 TIMSK |= (1<<TOIE0); //Przerwanie overflow (przepełnienie timera) sei(); //Globalne uruchomienie przerwań while(1) { //...
sylwek2293 - jak masz to zrobić odpisał ci już inny sylwek :-) Najprostsza opcja to użycie timera w wersji 8 bit lub 16 bit. Gdy timer się przepełni to wygeneruje ci przerwanie, w tym przerwaniu odblokujesz pin który zbiera informacje. Aby w miare odmierzyć 2 sekundy to po każdym przerwaniu powinienes ręcznie załadowac timer jakąś wartością aby przepełnienie...
Musisz zanegować sygnał PWM (powiedzmy IN1) i wyprowadzenie IN2. Możesz negować sprzętowo zmieniając konfigurację lub wpisując do OCR wartość 255-pwm. Aby nie było szarpnięć itp musisz zrobić to w chwili przepełnienia timera. Zmieniając kierunek, silnik stoi (no raczej powinien, bo zmiana kierunku na max obrotach to nie jest dobry pomysł) i wydaje się,...
Niestety zgrubnie musisz określić czas wykonania funkcji i dobrać odpowiedni preskaler Timera. Bardzo zgrubnie. Ja bym użył timera 16-bitowego z taktowaniem 1MHz, to każdy takt to będzie 1µS...wtedy masz maksymalny dostępny czas 65ms - raczej wystarczy...robiw Dodano po 2 Poza tym możesz napisać prosta funkcje obsługi przerwania od przepełnienia...
Do obliczania wpisu do timera bez wdawania sie w "teorię" służy dostępny w sieci kalk.exe. Na Timerze0 zliczane są impulsy z zewnątrz w czasie 1 s. Niestety Timer0 może zliczyć tylko 256 impulsów, a częstotliwość np. to 8MHz czyli 8000000. Musimy zliczyć zatem ilość przerwań od timera, pomnożyć to przez 256 i dodać resztkę, która została zliczona ale...
1/ nadużywanie ustawiania bitów "|=". Nigdzie nie ma odpowiadającego wstępnego kasowania bitów, które są ustawiane, więc z góry zakładam, że ten kod może być zawodny. Najlepszym rozwiązaniem jest pojedyncze wpisanie do rejestru jednej wartości zawierającej żądane ustawienia wszystkich pól. 2/ [syntax=C]TIM1->PSC = 23999; TIM1->ARR = 1;[/syntax] Na timer...
Poniżej 1km/h już nie ma sensu dawać, ale fajnie że wspominałeś o tym przepełnieniu. Jeśli timer się przepełni to v=0[km/h].
Potrzebny jest Timer i przerwanie od timera. Timer ustawia flagę jak się przepełni. Np. co 1s. W petli głównej sprawdzasz czy już upłynęła 1s. Dopiero potem wolno Ci odczytać pomiar temperatury. Nie wolno stosować Waitms jeśli program ma obsługiwać więcej niż jedno urządzenia.
Najmocniej przepraszam, że odświeżam i podłączam się pod temat, ale nie chce niepotrzebnie rozpoczynać nowego. Mam pytanie, które dotyczy Timera, chciałbym zmieniać wartość TIM_Period podczas pracy układu (podobnie jak można zmienić wartość Prescalera - aktualizując jego wartość). Niestety nie wiem jak dokonać aktualizacji TIM_Period. Chciałbym przy...
Ok, to mógłbyś mi podpowiedzieć jak skonfigurować PWM tak aby otrzymać 22050Hz (lub 44100Hz)?. Poza tym skoro mam nie używać timera to kiedy wystawiać próbki (obecnie wystawiane są w przerwaniu kiedy przepełni się timer)?. Docelowo zmienię te pliki bo rzeczywiście to jest bezsensu :)
AVE... Jakiego PICa konkretnie chcesz użyć? Zasada pomiaru jest dość prosta: najpierw ustawia się któryś z timerów, by odmierzał 40 sekund i po odmierzeniu wywołał przerwanie. Potem tworzy się pętlę, która w nieskończoność sprawdza stan wybranego przez Ciebie pinu. Gdy jest tam logiczna jedynka, to dodajesz 1 do zmiennej. Gdy timer skończy zliczać czas,...
Witam wszystkich, próbuję swoich sił z przerwaniem od przepełnienia timera na diodzie LED. Chciałbym najpierw spróbować chociażby zaświecić diodą gdy nastąpi przepełnienie timera. Głównie potrzebuję pomocy jak napisać procedurę obsługi przerwania...bo jej za bardzo nie rozumiem. Czy w procedurze muszę wyłączyć timer, zapalić diodę i ponownie go włączyć...
Witaj !!! Tak jak napisał kolega LightHouser, nop to rozkaz, który nie robi na prawdę nic ale zajmuje cykl rozkazowy. W standardowym procesorze '51, zastosowano preskaler przez 12. Znaczy to, że częstotliwość taktująca (kwarca) wstępnie jest dzielona przez 12. Jeżeli zastosujesz kwarc np:12MHz to naprawde rdzeń procesora będzie taktowany częstotliwością...
Trochę to trwało za nim coś skleciłem Za mało czytałem bo mi coś nie wyszło kod wygląda tak [syntax=c]#include <avr/io.h> #include <avr/interrupt.h> #include<stdio.h> #include<util... #define LED3 PB1 #define LED2 PB2 #define LED1 PB4 #define S2 PB0 #define S1 PB3 //definicja początkowej wartości timera #define timer_start...
Wiec jakieś sposoby może z przykładami na AVRa..? Według autora linku którego podałeś najczęściej stosowaną metodą jest metoda z tego rysunku: http://www.auto-online.pl/serwis/poradni... i to jest chyba prawda. Metoda pierwsza i druga jest łatwa do pomiaru, wystarczy że bedziesz bramkował timer podczas otwarcia wtryskiwacza,...
Po zaprogramowaniu timera w tryb CTC oraz skorzystaniu z porad, dioda zapala się lecz nie gaśnie po określonym czasie. Nie jestem pewny co źle zrobiłem, wykorzystanie innej zmiennej sprawiało że dioda w ogóle się nie zapala. Prawdopodobnie źle zaprogramowałem timer, a jako że info na timer timera CTC z przerwaniem znalazłem tylko po angielsku więc bardzo...
1. W jakim języku piszesz? 2. Kalkuluje się to tak: Masz kwarc 16 000 000 Hz (16 MHz) i dajesz sobie jeden z dopuszczonych prescalerów, np. 64 i wtedy timer zlicza Ci impulsy z częstotliwością 16 000 000 / 64 = 250 000 Hz, czyli jeden impuls timera to 4*10^-6 s lub inaczej aby odmierzyć 1s musisz zliczyć 250 000 impulsów, Jako, że Timer0 jest 8 bitowy...
Witam:) Ponieważ dopiero od niedawna uczę się programować w języku C ma problem. Nie wiem jak napisać program, który zapisuje mi bit po bicie dane w komórce pamięci. Dane są zczytywane z przetwornika A/C (kanał 0 i kanał 1). Jeżeli ich różnica jest mniejsza od wartości X do komórki pamięci powinna zapisać sie wartość 0, a jeśli większe od X to wartość...
//############ Procedura obsługi przerwania od przepełnienia timera ############ ISR(TIMER0_OVF_vect) { n++; if(n>=1000) // Kwarc 16000000Hz / Prescaler 64 / timer 8 bitów czyli 256 - poczatek liczenia od 6 czyli 250 =1000Hz czyli 1us { n=00; sek++; if(sek>=60) { sek=0; min++; if(min>=60) {...
Timer 8-bitowy przepełnia się po zliczeniu do 256 a preskaler dzieli maksymalnie przez 1024 więc z prostego mnożenia wynika, że częstotliwość zegara, która spowoduje przepełnienie timera po 1 sekundzie to 1024x256=262144 Hz. Jeśli taktujesz mikrokontroler wyższą częstotliwością to na tym timerze nie zrobisz przerwania co 1 sekundę. Oczywiście timer...
Włączaj timer w przerwaniu od przejścia przez 0, a wyłączaj go w przerwaniu od przepełnienia timera.
Jako ze nie przepadam za pisaniem na maile, to odpowiem tutaj... Musisz skonfigurowac odpowiedni timer i przy przerwaniu, jakie generuje int czas=0; int timer0=131; SIGNAL (SIG_OVERFLOW0) { czas++; if (czas==5000) BUUM(); //jezeli czas osiagnal 5000ms, to wywolaj funkcje BUUM(); TCNT0 = timer0; // zaladowanie do...
Czy ktoś może pomóc, dać wskazówkę jak to zrobić. Ogólnie planowałem dać w przerwaniu 2 przyciski, jeden do zwiększania czasu a drugi do zmniejszania. W pętli głównej miał być po prostu migająca dioda. W arduino nie miałbym problemu, ale ogólnie mało robię coś w C i potrzebuje pomocy. Kod jest skopiowany z http://mikrokontrolery.blogspot.com/2011...
użyj timera oraz przerwań ,wprowadź do programu zmienną która bedzie ulegać inkrementacji podczas przepełnienia timera
A te pozostałe peryferia śmigają na przerwaniach?? Minimalny czas przerwania powinien być tak dobrany aby zanim przepełni się Timer zdążyło się wykonać jego przerwanie. U mnie tylko działał UART podczas pracy z serwami więc żadnych problemów nie było.
Proponuję coś takiego: 1. na przerwaniu, na zbocze narastające włączasz timer; 2. Jeśli wystąpi przepełnienie licznika, zmieniasz preskaler i czekasz na następne zbocze narastające. 3. na przerwaniu, na zbocze opadające zapisujesz wartość np. do eeproma. Nie wiem Jakie orientacyjnie czasy będziesz miał do mierzenia, ale jak to rozwiązanie będzie zbyt...
Musisz także uwzględnić, że timer po przepełnieniu musi zbudzić MCU, ten musi wykonać ileśtam operacji i ponownie zasnąć. Oraz to, że Atmega ma te same piny dla oscylatora asynchronicznego i głównego. Ogólnie to kiepski wybór na projekt Low Power. I uwagi GSM też weź pod rozwagę. Albert
Do pasma EKG układ w zupełności wystarczy. W kwestii punktu 4, chodziło mi o taką konfigurację licznika: - licznik zlicza w jednym kierunku, np. w górę. - Czas pełnego okresu (PSC i ARR) to trochę więcej niż czas transmisji + impuls LDAC (=210ns). - Do jednego z rejestrów porównujących ładujesz wartość, która odpowiada impulsowi LDAC, a wyjście konfigurujesz...
Po pierwsze, timer liczy od 0 do 255, ale to oznacza 256 impulsów pomiędzy przepełnieniami, czyli powinno być 256, a nie 255 * 128us. Po drugie zaokrągliłeś wynik z 32.64 do 32 przed dzieleniem, co w efekcie dało niedokładny wynik ilości przepełnień. W rzeczywistości częstotliwość przerwań można obliczyć dużo prościej: ( 8000000 / 1024 ) / 256 = ok. 30,5176.....
Dziękuje za odp. Konkretnie to np: a) Przykład z timerem. Migają na przemian dwie diody w czasie ustawionym przy wykorzystaniu timera. Może nastąpić przerwanie po naciśnięciu jakiegoś konkretnego przycisku (np. podł. do jakiejś linii portuD) co również zasygnalizuje inna dioda, jak również zasygnalizowane może być przepełnienie timera. b) UART. Podłączenie...
Chyba trochę uprościłeś. No dobra - warunek jest taki, że pomiędzy kolejnymi odczytami nie może upłynąć więcej niż max jeden pełny okres timera, może być max jedno przepełnienie (; Z testowaniem flagi przepełnienia można by niby wykombinować więcej, ale tu pojawiają się bardzo nieprzyjemne sytuacje brzegowe: - jeśli odczytujesz najpierw CNT a potem...
Wzorowy temat - są wszystkie istotne informacje, m.in. to o jaki układ chodzi! Niby wszystko działa, ale zawsze na starcie, zaraz po uruchomieniu Timera występuje przerwanie od przepełnienia. Tak jakby jakaś flaga byla ustawiona. To nie jest przerwanie od przepełnienia, tylko od "update event". Jeśli przed uruchomieniem timera wywołasz owy "update event"...
Witam. Zaczynam dopiero zabawe z mikrokontrolerami i mam juz pierwszy problem. Otóż nie działa timer0. Wszystko sprawdzałem pare razy i nie wiem co zle zrobiłem. [syntax=c] #include <avr/io.h> #include <avr/interrupt.h> #define LED1 PB1 #define LED2 PB0 int main(void) { TCCR0 |= (1<<CS02) | (1<<CS00); // preskaler 1024 TIMSK...
"Odpytywanie programowe" w Twoim konkretnym przypadku to typowy przykład programowania liniowego, w którym przetwarzanie wykonywania dalszych instrukcji blokowane jest na czas spełnienia jakiegoś warunku. Zauważ, że [syntax=C]CZEKAJ_OVF1: JNB TF0, CZEKAJ_OVF1;[/syntax] oraz [syntax=C]CZEKAJ_OVF2: JNB TF0, CZEKAJ_OVF2;[/syntax] powodują skok do "samych...
To nie Bascom jest przyczyną tylko źle napisany program ;). 1. odczyt timera1 16bit odbywa się po przez rejestr pomocniczy TEMP, ten rejestr jest też używany przez inne procedury i funkcje i jeśli jest użyty to właśnie niszczona jest wartość High timer1 bo ona tam jest wpisana gdy używasz komendy. wpisując tak timer1 do tablicy możesz gubić High timer1....
Klasa TwoWire (której obiektem jest Wire) też używa przerwań. Po wejściu do ISR przerwania są blokowane. Jeżeli chcesz, aby dane ISR nie blokowało innych przerwań można użyć ISR_NOBLOCK:[syntax=c]ISR(TIMER2_OVF_vec... ISR_NOBLOCK) { ... }[/syntax]Byłbym jednak z tym bardzo ostrożny, ponieważ może przydarzyć się przepełnienie stosu. https://www.nongnu.org/avr-libc/user-man...
Znacznie lepiej (i zdecydowanie dokładniej) byłoby wykonywać to w przerwaniu timer-a pędzonego rezonatorem zegarkowym, lub cały uC z niego taktować. Skrócenie okresu możnaby chociażby, realizować ładując odpowiednią liczbę do timer-a po przepełnieniu. Pozdrawiam, GSM
Prawdę mówiąc nie widzę sensu w realizacji dzielenia przez 40 sprzętowo. Ale jak pisałem, jeśli masz wolny timer, to do rejestru PER timera za pomocą którego realizujesz QDEC wpisujesz 39, wtedy co 40 impulsów wygeneruje ci przepełnienie, które możesz transmitować przez event system jako zegar dla drugiego timera, który w efekcie będzie zliczał co 40...
Bo kontaktrony w licznikach rowerowych są jakieś szybsze. Robiłem kiedyś eksperymenty z rowerem i faktycznie zwykłe kontaktrony "rurkowe" nie nadążały się przełączać. Pierwszy z brzegu kontaktron KA-02 ze sklepu na literę T przy napięciu 5V i i prądzie 100mA ma częstotliwość przełączania 125Hz. Czas załączania do oporu 1Ohma wynosi ok 2,5 ms Czas odpuszczenia...
Po pierwsze z jaką częstotliwością taktujesz mikrokontroler? Po drugie to nie jesteś w stanie uzyskać 1s z timera po jednym przepełnieniu (chyba że wykorzystasz kwarc o b.małej częstotliwości). Musisz zliczać kilka (kilkadziesiąt) przepełnień licznika aby uzyskać 1s. Ustaw timer tak, aby przepełniał się po np. 10ms. 100 przepełnień timera to będzie...
Czy jest potrzebna jakaś kontrola (synchronizacja) czasu przełączania się Tx/Rx poszczególnych par urządzeń? Jeżeli protokół komunikacji jest dobrze "napisany" i zaimplementowany to nie trzeba nic synchronizować, jeżeli tak nie będzie, to będą problemy (np: odpowiedź od slave'a może nadejść za późno i wtedy jak master w tym czasie "zajmie" magistralę...
Pytanie numer 3: (o ile można :) ) Z noty aplikacyjnej AVR400 wyczytałem, że przy częstotliwości kwarcu równej 4 MHz, rezystor R powinien mieć wartość 30 KOhm, natomiast kondensator C powinien mieć pojemność 8,2 nF. Przypuśćmy, że napięcie mierzone wynosi 1,5 V. Jaka wartość mi się powinna pokażać na porcie B i dlaczego ? (Chodzi mi oczywiście o wartości...
Technicznie wygląda to tak: W każdym takcie zegara (np w 1/1000000 s - przy taktowaniu 1 MHz) zliczany jest jeden impuls. Timer 16-bitowy od 8-bitowego różni się tylko tym, że przepełnienie następuje po 65536 taktach a nie po 255. Ale żeby policzyć dokładnie jedną sekundę to musisz nadal odliczyć ten milion taktów. Jak widać zegar będzie leciał wiele...
A jest lepiej gdy podajesz z palca i masz ustawiony PULLUP? Generalnie jeśli częstotliwość impulsów jest duża to lepiej zliczać je na timerach i przerwanie generować od przepełnienia timera.
I dobrze. Aby zmieniać wypełnienie musisz uciec się do pomocy przerwania ( to wada ,ale za to 1 timerem możesz mieć 4 zupełnie niezależne PWM). A działać może to mniej więcej tak (przykładowo): Timer0 ustawiasz na najmniejszy oczekiwany okres (rozdzielczość). Ustawiasz stan początkowy i jego przełączenie w EMR. MR ustawiasz na oczekiwaną długość stanu...
Robimy przerwanie od przepełnienia timera co czas wysłania na szyne danych diod pojedynczego bitu (ok 1,2 ms) WS2812 mają transmisję na poziomie 800kHz, 1,2ms to mniej niż 1000Hz, coś chyba Ci się pomyliło.
Z tego co wnioskuje to muszę zliczać ilość przepełnień Timera bo inaczej będzie mi się on nadpisywał tak? Czas chciałbym liczyć np do 5 sekund z dokładnością np 0,1s
Włącz przerwanie przepełnienia timera 1 i dodaj zmienną globalną, która będzie inkrementowana w tym przerwaniu oraz uwzględniona we wzorze liczącym ilość impulsów timera1, którą przekazujesz później do funkcji odleglosc_w_cm().
Obsługa przerwania ma być najkrótsza. Najlepsza analogia do życia, to gdy dzwoni telefon, to tylko go odbierzesz, porozmawiasz i koniec, nie będziesz nieruchomo stał, aż zadzwoni następny raz. Podobnie w procesorze są przerwania uzależnione od różnych zdarzeń, zmiany stanu zewnętrznego pinu, opróżnienia bufora transmisji wyjściowej, otrzymania bajtu...
Tutorial do avr taki znalazłem: http://avr.elektroda.eu/?q=node/8 Jak byś czegoś w sieci szukał, to raczej unikaj tutoriala z patron.net, uczy złych nawyków i jest nieco nie na czasie. Pomiar częstotliwośći na AVR realizuje się w miarę łatwo, przy wykorzystaniu timerów, jeden timer pracuje jako licznik impulsów z zewnątrz, a drugi odmierza czas, mozna...
Diody masz podpięte bezpośrednio pod porty ATmega? Jeśli tak to lepiej dołóż sobie oporniki aby nie spalić wyjść ATmegi. Bezpośrednio przy procku daj kondensator 100nF. Przed stabilizatorem np. 1000uF, a za stabilizatorem 100u (to i tak za dużo, ale lepiej więcej niż za mało). Zliczanie zrealizowałbym w taki sposób: - Odpalić któryś z wewnętrznych timerów...
Lepszym rozwiązaniem byłoby zastosowanie przerwania od timera w skutek porównania a nie przepełnienia i non stop zmieniając wartość TCNT
Nie podoba mi się twoje rozwiązanie. Ja bym to zrobił tak - timer odmierzający takty w rytm podstawowego okresu PWM (czyli przerwania np. 1kHz). Teraz zamiast tych porównań z licznikami, wrzuć wartość licznika do rejestru compare register. Dzięki temu masz przerwanie po przepełnieniu timera (nowy okres) - w tym przerwaniu inicjujesz wysyłkę danych po...
nie mierz częstotliwości, tylko OKRES! V=o/t V - prędkość w m/s t - okres jaki upłynął pomiędzy dwoma następującymi po sobie impulsami z czujnika o - obwód koła w metrach Tak działają fabryczne liczniki, dzięki temu mierzą już bardzo małe prędkości. dodatkowo przejechany dystans otrzymasz dodając z każdym impulsem obwód koła do całkowitego dystansu...
Nawet jak nie masz kwarcu zegarkowego, to zawsze można zastosować np 4MHz :] ustawiasz timer z prescalerem = 1 , czyli timer zwiększany będzie co 0,2500 us jeżeli ustawisz przerwanie od przepełnienia timera (timer 8bitowy np 0 lub 2) to przerwanie będziesz miał co 0,0640 ms, wystarczy w przerwaniu zliczać zmienną 16bitową, i gdy zliczy do 15625 wtedy...
(at)stozek - normalnie w Bascom nie jest potrzebna komenda Start Timer0 bo jest on uruchamiany od razu podczas konfiguracji. Używa się tej komendy tylko jeśli poprzednio zatrzymałeś Timer poprzez Stop Timer0. Rozumiem, że zatrzymujesz timer. Tak więc zatrzymywanie timera to zabranie mu źródła taktowania. Bascomowe komendy moża wiec rozumieć tak: Start...
Czy to jest przerwanie czy odwołanie się do podprogramu? Jeśli przerwanie- to jakie zdarzenie je wywołuje? Po co w przerwaniu- jeśli jest to przerwanie- blokujesz przerwanie od przepełnienia Timera? Przecież i tak jest zablokowane. Funkcja jest zdeklarowana?
A to trzeba korzystać z przerwania DMA? Chyba nie po to ono jest. Jest też inne przerwanie temu służące. SPI w F103 nie ma możliwości aby generować przerwanie po zakończeniu transmisji; jak DMA bitem TC. Chcesz reagować na każdy TXE? Chyba jednak nie. Do czego w takim razie jest przerwanie Transfer Complete od DMA, jeżeli nie do podjęcia akcji po zakończeniu...
enkoder przepełnienie timera przepełnienie zbiornika amica przepełnienie
świeci dioda power wiena mostek windows schowek
obciążalność prądowa przewodów obciążalność prądowa przewodów
Symbol klepsydry w quadzie Polaris - co oznacza? Naprawa radiotelefonu Tukan 1: Diagnostyka i porady