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,...
Ż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.
wiesz... coś mi chodzi po głowie, że przy którejś wersji gcc albo avr-libc nastąpiły jakieś zmiany nazewnictwa procedur obsługi przerwań. Głowy nie dam że tak było, ale w każdym razie u mnie procedura obsługi od przerwania pochodzącego od przepełnienia timera 0 nazywa się: ISR (TIMER0_OVF_vect) { ... } A druga rzecz, to z całą pewnością...
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.
wykorzystaj wolny timer w uC , wprowadź zmienną licznikową i np. co określoną ilość przepełnień timer ,skok do prodprogramu ;)
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...
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
Timer0 w Atmega8 może pracować tylko w trybie OVERFLOW (przepełnienia).
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...
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,...
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...
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ę...
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ł...
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...
ZUMEK wielkie dzięki. Doszedłem co było nie tak poprostu podczas wywoływania procedury od przetwornika analogowo - cyfrowego wyłączałem przerwanie od licznika 2. Przyznaję się do błędu. A przy okazji dla wszystkich co korzystają z winavr, jak będziecie się bawić optymalizacją kodu w make filu to z doświadczenia mojego wynika iż optymalizacja między...
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...
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...
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ę,...
[syntax=asm] .device ATmega32 .include "m32def.inc" .def temp= r16 .def counter= r17 .org 0 RJMP start .org $016 ;wektor przerwania dla przepełnienia timera RJMP przerwanie start: ldi temp, high(RAMEND) out SPH, temp ldi temp, (1<<CS00) | (1<<CS02) ;konfiguracja preskalera i zegara out TCCR0, temp ;w rejestrze TCCR0 (ustawienia główne timera)...
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...
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ą...
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,...
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...
użyj timera oraz przerwań ,wprowadź do programu zmienną która bedzie ulegać inkrementacji podczas przepełnienia timera
Włączaj timer w przerwaniu od przejścia przez 0, a wyłączaj go w przerwaniu od przepełnienia timera.
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...
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...
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; }...
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.
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.
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...
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...
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().
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...
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...
Nie znam za grosz bascoma... Ale ogólnie to tak... Pogonił bym go z wewnętrznej PLL (64MHz) na 16MHz... To samo z zegarem timera... Dzięki temu częstotliwość dla PWM będzie jako taka... W zasadzie to sprowadza się to do zrealizowania timera 12-bit... W C łatwiej mi pokazać o co chodzi niż pisać esej... ISR (TIM1_OVF_vect) { if(timer_compare==timer_counter)...
(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...
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
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...
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...
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
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...
Proszę o wyrozumiałość, od niedawna zainteresowałem sie uC i nie moge znalesc odpowiedzi na nurtujący mnie problem. Jak skonfigurować timer 8 bitowy w uC abym mógł: 1) obsługiwać przerwanie przy przepełnieniu timera 2) obsługiwać wypełnienie PWM TCCR2=(1<<WGM20)|(1<...
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...
A do czego jest Ci potrzebne to przerwanie? Zmartwię Cię: wykrywanie przekroczenia okresu przy łapaniu zboczy sygnałów to problem w zasadzie nierozwiązywalny. Informacja o przepełnieniu timera nic Ci nie da.
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.....
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...
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"...
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?
Chciałbym się upewnić w pewnej sprawie. Przeszkadza mi konieczność oczekiwania na konwersję tmperatury przez DSa nawet te ~100us przy rozdzielczości 9 bitowej to za dużo. Czy można zamiast waitus wykorzystać timer i zrobić odpowiednią procedurę z warunkami gdzie odczyt będzie realizowany po iluś tam przepełnieniach timera i tak w kółko ?
mam tablice danych np [8][10]. chce pobierac za każdym razem jednorazowo jeden wiersz, wykonac na danych z tego wiersza pewne działania (zajmie mi to nawet 5 sekund), uruchomic Timer na wartosc czasową, którą wyliczę. Czas na jaki chce się tu zatrzyamc powinien wlasnie byc odmierzany w Timerze. Następnie po przepełnieniu Timera (przykladowo te 5 sek)...
Gdzie tu się zmieniają parametry? Częstotliwość jest stała, amplituda jest stała. Spróbuj zrozumieć jak działa ta funkcja generująca po 512 próbek dla 16 (NoteMax = 16) różnych kanałów dźwiękowych na podstawie sampli w czasie rzeczywistym na STM32F746. Próbkowanie z częstotliwością 48 kHz. [syntax=c]void dds_generator(uint16_t len) { for(uint8_t NoteIndex=0;...
Znalazłem czas wniknąć w szczegóły...J Jaka ma być rozdzielczość/częstotliwość tego programowego timera? Bo z wartością 108 jest jakaś taka mało okrągła. Rozdzielczość 20ms nie wystarczy? Bo jeżeli musisz go tak skonfigurować do timerów programowych, to czwartego kanału serwa nie da się na nim zrobić. UART nie ma nic do rzeczy, ma swój generator częstotliwości....
Witam . Masz 3 przerwania zewnętrzne . W każdym przerwaniu uruchamiasz timer (rozumiem że dla każdej z faz inny ). Po wystąpieniu przerwania od przepełnienia timera włączasz długi impuls wyzwalający triak . Impuls trwa aż do wystąpienia przerwania zewnętrznego gdzie go wyłączasz.
$katalog_WinAVR$/doc/avr-libc/avr-libc-u... Tworzysz osobny plik w asemblerze (.S, nie .s) zawierający procedurę obsługi przerwania, kompilujesz do pliku .o i linkujesz z pozostałymi plikami. W dołączanym wo WinAVR szablonie Makefile jest przewidziane miejsce na wypisanie źródeł w asemblerze (ASRC = $tu wpisz nazwy plików$). Przykład,...
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
Patrzę też, że u Ciebie występuje niepokojąca manipulacja konfiguracją ICP w obsłudze od przepełnienia. W obsłudze od przepełnienia mam tylko konfiguracje timera gdyby był zanik sygnału.. Tak zwany "timeout" gdy nastąpi pod rząd ponad 10 przepełnień timera (400ms) a ICP tego nie skasuje bo brak sygnałów to ustawia timer na zbocze narastające i ustawia...
Dziękuję za słuszne rady, z których na pewno skorzystam :) Z tym zezwoleniem na przerwanie to jeden błąd ale znalazłem jeszcze jeden. Przerwanie się inaczej nazywa dlatego nie chciało pójść. Dla ATmegi8 przerwanie od przepełnienia timera nazywa się TIMER0_OVF_vect . Pozdrawiam
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.
Przyciski podłącz do przerwań Int0 i Int1, kod obsługi silnika daj do przerwania przepełnienia timera, przerwania int0 i int1 żeby zmieniały okres przepełnienia licznika, a przerwanie licznika powodowało zmiane kroku silnika.. na takiej zasadzie działa mój sterownik (avr, source nieudostępniam)
http://mikrokontrolery.blogspot.com/2011... uznajmy, że zrobiłbym tak, iż w tym przerwaniu miga sobie dioda czuwania jak mogę zrobić aby ta dioda gasła po włączeniu alarmu PORTC &= ~czuwanie nie działa :(, pytanie brzmi - Jak zatrzymać przerwanie od przepełnienia timera ?
zrób to mniej więcej tak: .INCLUDE "m8def.inc" .cseg ; początek segmentu pamięci programu .org 0 rjmp RESET ; wektor ZEROWY (po resecie) .org OVF0addr ; wektor przerwania od przepełnienia Timera0 rjmp Przerwanie_T0 ; i tu właśnie skok do obsługi tego przerwania RESET: LDI R16, HIGH( RAMEND) OUT SPH, R16 LDI R16, LOW( RAMEND) OUT SPL, R16 ; porządek...
Nie zerujesz rejestru SysTick->VAL. Opóźnienia w takim stylu są ciut bez sensu, a LCD lepiej obsługuje się w przerwaniu timera, co było pokazane parę miesięcy temu w EP (na STM32F0). W przypadku nibyopóźnienia mikrosekundowego - prawdopodobnie gubisz przepełnienia timera, bo okres SysTick jest zbyt krótki.
Nie znam Bascoma, ale z tego co widzę wykorzystujesz przerwanie od timer0,a niema w twoim kodzie etykiety "Przerwanie_co_2ms" do której masz skok po przepełnieniu timera (On Timer0 Przerwanie_co_2ms). Korzystaj z opcji syntax do umieszczania kodu w postach.
Co to za bełkot!? 1. Timer do odmierzania czasu skonfigurowany jako licznik impulsów z zewnątrz! 2. Podprogram obliczania czasu nigdy nie będzie wywołany z pętli głównej! 3. Wyświetlana ma być wartość licznika. Podaj kolego na koncówkę 11 impulsy z zewnątrz to je zacznie zliczać i wyświetlać. Bedziesz miał przynajmniej licznik impulsów. Program do zegara...
Lepszym rozwiązaniem byłoby zastosowanie przerwania od timera w skutek porównania a nie przepełnienia i non stop zmieniając wartość TCNT
Czyli pływa cały okres? Jeżeli tak to wychodzi że PLL jest "kiepski". Sprawdź stabilność tej właśnie częstotliwości - ustaw timer w trybie normal i zrób tylko toogle w przepełnieniu timera i sprawdź czy częstotliwość jest stabilna. Opisz jeszcze dokładniej jak to skacze? Jak zmienisz wypełnienie, czy normalnie się zmienia przy tych samych ustawieniach...
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....
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
Moze przerwanie nie wraca do miejsca w ktorym zostało wywołane przepełnieniem timera... Jest poprawnie. Prośba abyś wstawiał kod za pomocą znacznika SYNTAX a nie CODE - wybierając C w selectboxie. Czy to cały program?
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...
Czytając rozdział System Clock and Clock Options w dokumentacji Atmega8 oraz szukając dalej w całej nie znalazłem informacji jaką częstotliwość ma CLKi/o w stosunku do CLKcpu. To o tyle ważne, że przerwania od przepełnienia Timera są liczone preskalerem w stosunku do CLKi/o.
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...
Pokaż kod. Trzeba dodać sprawdzanie czy nastapiło przekroczenie zakresu a gdy tak to nie przeprowadzać obliczeń i wyświetlić 0. Bez tego po przepełnieniu Timera, Timer przekręca się do 0 i liczy dalej i z tego obliczana jest wartość. Czyli następuje dzielenie przez 0 albo inną małą wartość i stąd wychodzą bardzo duże wartości prędkości.
A może by tak trochę to obejść? Jeśli możesz, to poświęć na to jeden z wirtualnych kanałów ADC. ADC bez problemu możesz taktować przepełnieniem Timera. DMA będzie wyzwalane przez ADC ale robiło będzie swoje, czyli odczytywało stan portu. Tylko teraz czy to się kupy trzyma? Działać powinno ale czy warto, to ja już nie wiem niestety :) A może można prościej..
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...
1. (PC) Wyślij ramkę z rozkazem z do odpowiedniego uP. 2. (uP) Zeruj rejestr PER timera za każdym odebranym bajtem. 3. (uP) Po odebraniu ostatniego bajtu - czyli po przerwaniu od przepełnienia timer'a, który ustawiłem na 50ms - analizuj odebraną ramkę. 4. (uP) Jeśli ramka jest poprawna to postaw flagę zezwalającą na wysyłkę danych do PC. Przyznam że...
Tak użyte przerwanie nie ma sensu. Albo rób wszystko w przerwaniu timera, albo zrezygnuj z przerwania i testuj znacznik przepełnienia timera w pętli głównej. To, co masz w tej chwili, to w zasadzie przykład, do czego ie należy używać przerwań. Ponadto typ char (zmienna y) może być zaimplementowany jako bez znaku lub ze znakiem. W tym drugim przypadku...
A co do częstotliwości to w takim razie skąd się bierze ta dwójka we wzorze? Ponieważ gdy licznik osiągnie OCR0 zmienia stan pinu OC0 na przeciwny. Czyli jeden cykl to 2 przepełnienia timera. Wszystko jest napisane w fragmencie datasheet, który załączyłem powyżej. Masz oscyloskop, albo analizator logiczny?
i będziesz miał przerwanie co 1us, Porada pierwsza klasa ;-) Na procesorze 8bit przerwanie co 1us. Prolog + epilog przerwania + inkrementacja zmiennej co najmniej 32bit. Jesteś pewien, że zmieścisz się z tym w mniej niż 16 cyklach w C? Ile zostanie Ci czasu na resztę programu? Albert Racja, bzdurę napisałem, mea maxima culpa, moja porada byłaby OK...
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...
Taki OT jak już tu jesteśmy. Czy dobrze rozumuję, że reset można wykorzystać jako port, ale musimy być pewni co do działania programu, bo później nie ma już odwrotu (tylko fusebit doctor)? Tylko po co? skoro można brakujący pin 'odzyskać' używając generatora zamiast kwarcu i ustawiając w fusach zewnętrzne taktowanie. Tym bardziej że teraz generatory...
Zakładam, że ten pik występuje tylko raz, więc konkluzja jest taka, że dokładnie wtedy gdy timer sie przepełnia (i wyjscie ustawia się w stan wysoki), jakimś cudem modyfikujesz rejestr porównawczy. Zauważ, że stan niski trwa zawsze tyle samo.... Czy ten pik jest w 100% powtarzalny w tych samych warunkach? To wygląda tak jakbyś zmieniał TMRx bezpośrednio...
(at)tmf Tak, gdy włączam tryb enkodera pokazuje mi naprzemiennie 0 i 1. Dziwna sprawa, bo jak robię ten sam projekt, ale z TIM3, to w trybie zewnętrznego licznika jest podobnie, a w trybie enkodera od razu po przekręceniu pokazują się wartości zbliżone do max. wartości przepełnienia timera. Spróbuje z tym filtrem.Jeżeli chodzi o wybór kondensatora...
Nie znam Basica, ale blokowo program powinien wyglądać mniej więcej tak: Musisz napisać 2 podprogramy. Pierwszy obsługuje przerwanie od układu wykrywającego zero, drugi (oparty o timer) włączy triaka. Przy przejściu przez zero wyzwalane jest przerwanie, w przeraniu obliczasz opóznienie (wartość jaką należy wpisać do rejestru timera). Po przepełnieniu...
Po pierwsze, czy to musi być w assemblerze? W C to dosłownie 10 linijek kodu. Po drugie, co do zwalniania i przyśpieszania - można zmieniać delaye, ale najsensowniej to chyba zrobić na timerze. Ustawiasz timer w trybie CTC, klawiszami tylko zmieniasz wartość do której zlicza, a w procedurze obsługi przerwania przepełnienia timera wystawiasz kolejne...
Procedura obliczenia() musi być wykonana po każdym przepełnieniu timera i tylko po przepełnieniu timera (musi się wykonać dokładnie tyle samo razy ile razy wystąpiło przerwanie timera). Wymagana jest też w szybka reakcja na inne przerwania - szybsza niż trwają obliczenia() Prawie dobre rozwiązanie nr 1(pseudokod): Proszę wytknięcie błędów, opinie który...
Tylko jest tego rodzaju problem iż atmega taktowana zegarem 16mhz przy preskalerze 8 i 8 bitowym liczniku minimalny czas jest w porządku (0,5us) maksymalny natomiast 128us więc dalej musze inkrementowac w przepełnieniu zmienną . Dodatkowo z tego co widze input capture przypisany jest tylko do timera1 ja go używam do innych celów (2 kanałowy pwm). Poradziłem...
Skorzystaj z przerwań generowanych przez licznik TIMER1 (lub TIMER2 jeśli jest dostępny). To raczej wyższa szkoła jazdy, bo program będzie przypominać sheduler w systemie operacyjnym, a autor nie wygląda na tyle zorientowanego żeby samemu grzebać w stosie. Ja bym w każdej funkcji zastosował pętlę testującą pojawienie się flagi przepełnienia timera...
Lepiej byłoby napisać co sam zrobiłeś i w jakim stanie jest procesor. Ciężko się przebijać przez kod, żeby wyciągnąć te informacje. Nie ma tez danych jak realizujesz RTC. Rozumiem, że masz kwarc zegarkowy i timer pracujący jako real-time counter? Procesor jest kompletnie uśpiony i ew. wybudzają go tylko przerwania przepełnienia timera? Jeśli nie to...
INT1 działa tylko na poziom, a nie na zbocze: http://obrazki.elektroda.pl/1890326700_1... EDIT: Ale teraz zauważyłem, że jednak chyba ustawiasz INT1 na właściwy tryb w przerwaniu od przepełnienia Timera. Odnoszę wrażenie, że masz strasznie przekombinowany kod. Możesz napisać co on robi i co chcesz osiągnąć?
Problem wygląda następująco. Pisze program na atmega32, gdy zostaje wywołane przerwanie od porównania dla timera 0 to program się restartuje. Jednocześnie, gdy zdefiniuje funkcje ISR(BADISR_vect) to wlaśnie ona jest wykonywana zamiast funkcji od timera :/. Gdy próbuje wywoływać przerwanie od przepełnienia timer 0 to w ogóle się ono nie wywołuje, a przerwanie...
A nie możesz wykorzystać przerwania od zbocza np INT0? Jak pojawi się dodatnie zbocze to robisz krótki sygnał i program pracuje dalej. Dopiero jak ktoś puści przycisk i znów naciśnie pojawi się znów zbocze narastające które może wywołać przerwanie. Ideałem byłoby abyś po pojawieniu się przerwania od narastającego zbocza, włączał Buzzer potem uruchamiał...
Ja bym to zrobił takim schematem: Zmienna LicznikWcisniec jest domyślnie zerem Pierwszy aktywny sygnał z przycisku (wtedy, gdy LicznikWcisniec jest zerem) ustawia zmienną LicznikWcisniec na jeden, oraz zeruje i włącza jeden z timerów, który ogranicza ramkę czasu do okresu, w którym spodziewamy się czterech kliknięć (praktycznie okolo jednej sekundy)....
Raczej chcę, by transfer DMA był od przepełnienia timera, a częstotliwość generowanego sygnału zależała od PER. Obie tablice zapełnione danymi, 0 - przebieg piłowy, 2 - przebieg prostokątny. A brak działania to po prostu brak przebiegu na wyjściu(ach). Mam podobne programy, które uruchomiłem kiedyś na 128A4U-U, a rekompilacja na 256A3U spowodowała także...
wskaźnik przepełnienia uruchomienie timera reset timera
wskaźnik myszy przezwajanie generatora bezpiecznik zasilacza komputera
mikrofalówka przestała grzać traker sloneczny
Instrukcja obsługi mini wieży Sharp XL-30 po polsku Kolory przewodów w kostce lampy prawej Lexus IS 2017