Problem z timerem jest taki, że Match0 jest przyporządkowany do pinu Tx.0, Match1 do pinu Tx.1 itd., więc za jeden pin odpowiada tylko jeden rejestr porównania i jeden typ "akcji". Do generowania PWM w LPC zwykle jest jeden specjalny timer oznaczony PWM. Jeszcze jedną alternatywną metodą byłoby ustawienie Match na 50% okresu timera i w przerwaniu przestawianie...
Ja bym zrobił to w drugą stronę. Tworzysz 3 zmienne globalne jako liczniki (tak jak masz TCNT dla timera). W przerwaniu od timera jedyne co robisz to inkrementujesz te zmienne. W ten sposób częstotliwość zmieniasz poprzez wartość tych zmiennych (do ilu ma liczyć twój programowy timer). A pwm robisz na 3 ifach w pętli głównej (wypełnienie zmienisz poprzez...
1. Zaprogramuj timer w tryb CTC, np. na częstotliwość 100 Hz. W przerwaniu timera: - sprawdź, czy przycisk naciśnięty; jeśli tak - zapal diodę i załaduj wartość 1000 do zmeinnej - "timera programowego". - jeśli zmienna timera ma wartość różną od zera, zdekrementuj ją, a jeśli zdekrementowała się do 0 - zgaś diodę. Razem daje to 5 linii kodu w przerwaniu...
Wg. mnie najlepiej zaprzęgnąć do tego celu timer no chyba że już zajęty to wtedy programowo PWM.
Na 99% ustawiony programowo Time Out Timer na 3 sekundy. Tak się to zachowuje przynajmniej. Na 1% uszkodzone radio, ale wątpliwe. Bateria jak trzyma?
Eno bez jaj...wskaźniki?... Co tu jest skomplikowanego? Przecież tu wystarczy aktywować cykliczne przerwanie, którego okres zależy od częstotliwości i rozdzielczości potrzebnego PWM. Programowy PWM to raptem 2-3 linie. Do tego timer programowy do odliczania migania i to wszystko. W pętli głównej pozostaje tylko zarządzanie tym timerem i w zależności...
Sprzętowo tylko na wyjściach OC. Przy tej częstotliwości można sterować dowolnymi wyjściami programowo, obsługując wszystkie przerwania timera.
Generalnie w takich przypadkach nota układu twoim przyjacielem. Poczytaj to co napisałem w komentarzach. [syntax=c]#include <avr/io.h> #include <avr/interrupt.h> int main(void) { uint8_t i = 0; DDRD = 0xff; //TCCR2A |= (1<<WGM21)|(1<<WGM22); // źle ten tryb jest zarezerwowany TCCR2A |= (1<<WGM21) // CTC //TCCR2A |= (1<<CS20)|(1<<CS21)|(1<&l...
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....
Prawdopodobnie o żaden konkretny tylko o samo porównanie. Prościej więc po prostu programowo sprawdzać ten warunek (w końcu wartości pewnie też będą generowane programowo). A co do Timera to faktycznie on tylko porównuje na równość (==). Więc na nim tego nie zrobisz.
Zrobiłbym to tak: transil 3V3 blisko pinów ESP, rezystor szeregowy (może być 100Ω, ale może być nawet 1kΩ) i kondensator ceramiczny 100 nF równolegle do mikro-przełącznika. w celu wyeliminowania w jakimś stopniu drgań styków Można z powodzeniem zastosować rozwiązanie programowe w oparciu o timer sprzętowy.
A po co tak kombinować jak przysłowiowy koń pod górę? Przecież jeśli masz do dyspozycji mikrokontroler to programowo (timery, przerwania) możesz zrealizować fazowe sterowanie triakiem.
Masz narzucony zegar 12MHz i on jest podstawą do obliczeń. Timer będzie taktowany zegarem 1/12 Fosc czyli 1MHz i tego nie zmienisz. Masz do odmierzenia 2 czasy 3360us i 10640us. Wybierając tryb 2 Timera utrudniłeś sobie sprawę bo maksymalny okres który możesz zliczyć do 256us. W takim przypadku musisz zrobić dodatkowy programowy licznik. Największy...
Witam .. a może spróbować takiej konfiguracji [syntax=c]TCCR1A |= (1<<COM1A0)|(COM1B0); TCCR1B |= (1<<WGM12)|(1<<CS10); OCR1A = .....[/syntax] Pisane na podst. dataschetu - nie sprawdzane. Nawiasem mówiąc nie meczy Cię przeliczanie wpisu w rejestry na kod HEX ?. Co do szerokiego przestrajania poczytaj o timerach programowych. Pozdr.
łatwiej się już chyba nie da. Sorki, ale ja bym raczej powiedział, że: "JUŻ GORZEJ SIĘ NIE DA :(" Co to za rozwiązanie gdzie w środku siedzi jeszcze obrzydliwy Wait !!! brrr ale żeby nie być gołosłownym, który tylko krytykuje.... Ok, panowie - widzę, że wasze zmagania spełzają na niczym, pokażę wam więc jak się powinno podchodzić do programowania....
Zgadza się że czas w timerach odświeżany jest co pętle programową, ale sam pomiar czasu w timerach jest dokładny. Tylko odświeżanie (odczytywanie) tego czasu z timerów przez CPU przebiega cyklicznie co czas trwania programu. Kolega misio1234 chce mierzyć czas pracy urządzenia w sekundach więc cykl programu nie będzie miał dużego znaczenia, zważywszy...
Co zrealizować? Programowe zliczanie impulsów? Ustawiasz timer tak, żeby generował przerwanie co 100 us, sprawdzasz stan portu, robisz xor z poprzednim stanem i testujesz, które bity są ustawione - ustawiony, znaczy zaszła zmiana stanu, czyli inkrementujesz odpowiednią zmienną.
Witam, zmodyfikuj swój program: http://www.elektroda.pl/rtvforum/topic33... W programie obsługi przerwania timera dopisz: Badanie stanu przycisku z uwzględnieniem drgań styków. Obsługę programowego timera liczącego przerwania pomiędzy przyciśnięciami przycisku, w zależności od długości słowa tego timera możesz mierzyć czasy rzędu minut, godzin,...
Przy czasach na poziomie sekund, minut to nie jest to żaden problem. Jeden timer ustawić na stałe przerwanie np co 100ms, w przerwaniu od tego timera przeglądać jakąś tablicę, w której każdy jeden element odpowiada jednemu programowemu licznikowi. Zmniejszać liczniki w elementach w tej tablicy, po czym po wyzerowaniu się wywołać jakąś funkcję. W moich...
No fakt - najpierw inkrementuje :oops: Jeśli chodzi o TF2 to sprawa ma sie tak(to sprawdziłem w bibli 51): Ponieważ Timer2 posiada 2 źródła przerwań , za którymi stoją flagi EXF2,TF2 to nie są one zerowane sprzętowo , byśmy wiedzieli co spowodowało przerwanie T2 , a mianowicie opadające zbocze na T2EX(P1.1) czy przepełnienie licznika.Więc flagi TF2/EXF2...
Nie zakładał bym tego tematu jeśli alternatywnie mógł bym użyć sprzętowej opcji, lecz nie ma takiej możliwości ponieważ, timer0 oraz timer1 wykorzystuje do zliczania impulsów z silnika w celu określenia położenia w jakim znajduje się śruba. A nie możesz zamienić funkcjonalności, tak by odzyskać timer1 do generowania dwóch PWM? P.S. Żeby było śmieszniej...
Daj swoje źródło programu, bo nie wiem jak zrobiłeś to menu. ... Jeżeli masz wolny jakiś Timer to możesz go uruchomić podczas wejścia do menu i przy wykryciu naciśnięcia przycisku go zerować a jak nie to zrobić jakiś programowy Timer. W procedurze obsługi przerwania od Timera zrobić skok w odpowiednie miejsce.
Witam, piszę pracę inżynierską w oparciu o Arduino Ręce opadają... :( A co do tego programu to zrób sobie Timer programowy wykorzystujący Timer sprzętowy.
Witam wszystkich Elektrodowiczów! Mam obwód przetwornika napięcie-częstotliwość LM331, który generuje na swoim wyjściu sygnał o częstotliwości od ok. 100 Hz do ok. 4,0 kHz i o amplitudzie 3,30 V. Teraz muszę mierzyć tę częstotliwość mierzyć na wejściu Capture0 Timera0 (pin P1.26). Czy możecie pomóc mi w tym temacie? Jakieś proste, krótkie tutoriale/instrukcje...
To co rozważasz to bardzo dobry sposób ;) nie ma lepszego. Wszystko zależy czy potrzebujesz super dokładnego 100ms czy tylko zgrubnie odczekać 100ms. W tym drugim przypadku można zrobić programowy timer i na jego podstawie odmierzać różnej długości odcinki czasów dla wyzwalania jakichś zdarzeń itp. Ale jeśli precyzyjnie to tak jak piszesz.
Jaros: o ile zaświecenie na 1/1000 sekundy można zauważyć (ale niezbyt łatwo i mało to "informacyjne" w praktyce), to zgaszenia już nie, a o to Ci podobno chodziło. Takie rzeczy robi się zwykle tak, że przy zapisie danych do rejestru nadawania zaświecasz lub gasisz programowo diodę i nastawiasz timer programowy. W przerwaniu timera dekrementujesz ten...
Zgadza się. Na większości płytek jest 4k7 do +5, który dość skutecznie zastępuje 1k5 do +3.3. z grubsza chodzi o to, żeby przy podłączeniu na linii D+ pojawiło się napięcie nieco ponad 3V przy ściągnięciu w dół prądem ok 200uA. Stos USB z CubeMX nie wykrywa odłączenia, a funkcja Deinit() jest wołana tuż przed Init(). Są sposoby na wykrycie odłączenia,...
Czasami trzeba przeczekać na coś ileś tam czasu ale po co marnować go w delay? Jakie mamy alternatywy i jak z nich korzystać? Timery, przy czym mogą to być programowe timery zrealizowane w przerwaniu np 1ms. kolejna sprawa to "podział" czasu procesora na dwa zadania. Jak sensownie to wykonywać? Oczywiście nie chcę tu mieszać do tego RTOS'a. Najłatwiej...
Nie potrzebujesz przerwań co 8 us - skąd ten pomysł? Odbieraj znaki w przerwaniu UART i ustawiaj w nim timer programowy, dekrementowany w przerwaniu timera (np. co 1 ms). Równie dobrze możesz ustawić timer sprzętowy. Prawdopodobnie również najwygodniej będzie sprawdzać timeout (wyzerownaie timera programowego lub znacznik zatrzymania timera sprzętowego)...
np. Nie da się. TImer0 może zliczać tylko z pinu PD4. I to z PinD.4 a nie PortD.4 ;) Można i z PinD.0, ale nawet przerwania żadnego do tego nie ma więc trzeba by programowo. A nawet jak przerwanie by było (mowa o przerwaniach INTx) to Timer tego nie zliczy. Trzeba by programowo zwiększać zawartość licznika Timera0, ale po cholerę. Jeżeli to ma być...
mam zrobione generowanie na OC1A. Generujesz nośną programowo. Atomowi chodziło o generator sprzętowy (Timer w trybie CTC). Ale on chyba też używa przerwań? Dla mnie już za późno na myślenie. Do jutra.
Podobają mi się te rzeczy o których czytam tutaj (; Do tej pory myślałem że DMA raczej nie ma sensu przy odbiorze danych których długość jest nieznana/zmienna, a tu proszę... Wychodzi na to, że przy zastosowaniu standardowych mechanizmów RTOSa (programowe timery) + ewentualne przerwanie od IDLE można mieć samo odbieranie "gratis". 4\/3!!
To nie są przerwania na PB1, 2, 3, a sprzętowe wyjścia timerów. NA ATmega8 masz trzy wyjścia PWM - dwa z T1 i jedno z T2. Nie wiem, ilu w końcu potrzebujesz. Jednego powinieneś użyć do generowania 36 kHz, kolejnego (a może dwóch) do sterowania silnikiem. Czemu mają służyć te zabawy z przerwaniem timera i programowym machaniem nogą uC?
Zdaje się, że PWM-y generują przerwania a te pochodzą jak stwierdziłeś od zegarów. To w czym problem? Wyzwalaj pomiary A/D od przerwań PWM. Jak będzie za gęsto to dodaj prosty licznik w zmiennej z porównaniem i uruchamiaj przetwornik co n-te przerwanie od TOVn. Biorąc sygnał z wyjścia PWM i dzieląc go przez 2 uzyskasz przebieg o stałym współczynniku...
Zgadzam się jak najbardziej. Tyle, że (może powinienem o tym wspomnieć, a zapomniałem) w przerwaniu mam trochę funkcji do sprawdzenia i wykonania zanim uC poda sygnał na triak :D także masz rację jak najbardziej. Też używam Timera do załączenia drugiej połówki. PS. A programowo masz na myśli ustawienie wartości timera na wartość przeliczoną i sterowanie...
możesz zrobić przerwanie z timera + programowy "watchodg" który sprawdzi co jakiś czas czy procesor działa. Jeśli nie (bo wartość w programowym watchdogu jest zbyt duża) to wtedy taka sekwencja: 0. sprawdzenie flagi "gotowy" - jeśli ustawiona to czekaj na reset z WD - nie rób nic 1. reset wd 2. zapis do eeprom 3. ustawienie flagi "gotowy" cóż, słyszałem...
No to jest CM3 a nie 0 jak napisał sulfur. Z resztą żeby nie wprowadzać ewentualnych kłótni [url=http://www.st.com/internet/mcu/prod... jest źdódło. Różne częstotliwości na kanałach jednego Timera można uzyskać tylko programowo.
Też tak mi się wydaje. Sprawdzę po niedzieli czy to problem z delayem od HALa bo z tym programowym problemu raczej nie ma. Stosuję dwie funkcje ponieważ jedna daje opóźnienia w ms - HAL_Delay(), a druga to zrobiona programowo na timerze funkcja delay() która ustawia opóźnienie w mikrosekundach.
Możesz z procka wycisnąć to co chcesz , a nawet więcej.W zasadzie wykorzystanie PWM zajmuje część zasobów timera (przerwania przy porównaniu i decyduje o szybkości przepełnania. Czy PWM będzie ze stałą częstotliwością ? Jeśli tak to możesz przepełnienie wykorzystać do zliaczania czasów, a jeżeli wszystkie Twoje kanały PWM będą pracować z tą samą częstotliwością...
Soft PWM i filtr wyjściowy... To w sumie najmniej elementów... i chyba jedyne wyjście.... Tylko trochę zabawy z programem... Sprzętowy timer do interwałów a resztę programowo... Każde inne rozwiązanie wymaga zewnętrznych układów...
Witam, Ściągnąłem kod uniwersalnego programowego UARTa ze strony http://supp.iar.com/Support/?note=88469. Próbuję go dopasować do mojej atmegi32, ale mam duży problem, bo nie wiem jakie określić parametry Timera. Po pierwsze co znaczy: 5. timer_set( BAUD_RATE ) Sets the timer to 3 times the baud rate. Czy chodzi o to, że np. przy 31250bps Timer...
Jak najbardziej jest poprawne, tyle że zauważ że w obydwu przypadkach nie masz zrealizowanej programowej eliminacji drgań styków
Mija się. Kluczuj wyjście timera programowo w przerwaniu timera. Ponieważ przerwanie to będzie zgłaszane z częstotliwością 38 kHz, procesor musisz pędzić na minimum 8 MHz (lepiej więcej) i praktycznie żadnego innego przerwania już nie obsłużysz - w tym musisz zrobić wszystko.
1)Okej, czyli procedura przerwanie_od_T0 trwa 1 s ? 2)Gdzie tutaj miejsce dla właściwej treści programu, pomiędzy TR0=1 ,a while(1) w programie głównym? 3) Chciałbym uzyskać procedure która trwa równo jedną sekundę używając timerów, bo ponoć tak jest najdokładniej. Chciałbym później ta procedurę, SEKUNDA wykorzystać w dalszej części programu. 4) pojecia...
Można inkrementować zmienne, ale wystarczyło by po jednej zmiennej bitowej na każdy kanał zatrzaskiwana na 2s (jeśli nie potrzebne jest zliczanie tych impulsów). Czas można odliczać np. na programowym timerze. Takie rozwiązanie byłoby estetyczniejsze i nieco szybsze - w końcu działania są na pojedynczych bitach, a nie całych bajtach. No i o wielkości...
Popatrz np. do RM od ST do rozdziału poświęconego pamięci flash - do niektórych rejestrów trzeba tam zapisać pewne wartości dwa razy w określonym czasie. Można to zrealizować programowo z wykorzystaniem timera np.
Zafiksowany Kamyczku. Wykrycie naciśnięcia przecisku w przerwaniu timera - to 2 linijki kodu w C, wykonywane 50 razy na sekundę. Ty proponujesz rozwiązanie wymagające przerwania od przycisku, w którym to przerwaniu należy zablokować to przerwanie, ustawić znacznik/timer programowy, a następnie w przerwaniu timera odblokować przerwanie przycisku. Mamy...
A nie lepiej po prostu nie blokować i pozwolić programowi wykonywać się? Coś w stylu: [syntax=c] uint16_t tick_get(void); uint16_t tick_expired(uint16_t tick, uint16_t val); .... if (tick_expired(tick, 100)) { //do something tick = tick_get(); } ... [/syntax] Albo jak ktoś potrzebuje czegoś dokładniejszego to zrobić sobie programowy timer z możliwością...
Da się, stosując rozwiązania sprzętowo-programowe. Przy czasach rzędu 1s o jakich wspominałeś nie ma problemu. Timer generujący pwm tez może generować przerwanie w określonym momencie, więc można różne cuda, w tym zmianę wypełnienia realizować w obsłudze przerwania. Tu generalnie nie ma znaczenia jaki masz procesor, bo każdy timer działa mniej więcej...
1. dodaj timer programowy 2. pomyśl, jaki jest związek wartości timera, ilości przerwań, które wystąpią, częstotliwości zegara, prescalera i czasu jaki upłynął...
Ustaw znacznik gotowości w jakimś nieużywanym peryferialu albo załaduj timer wartością sprzed końca okresu i go włącz.
Trzeba było wykorzystać elektronikę wbudowaną w zegar do generacji impulsów co sekundę, w celu odmierzania czasu przez procesor. Tak, ale w takiej sytuacji trzeba programowo zliczać te impulsy za pomocą przerwania zewnętrznego. Już samo wejście do przerwania to jakieś dwa cykle maszynowe do tego trzeba kilkunastu cykli na wykonanie licznika. Język...
ad. 1. To znaczy, że jak spojrzysz do noty procka, do opisu wyprowadzeń OCx timera to się okaże, że timer może sterować tym pinem prowadząc do zmiany jego stanu. W efekcie wcale nie musisz tego robić programowo. Ustawiasz w timerze opóźnienie, wyzwalasz go w przerwaniu zera i tyle. ad. 2. Musisz wtedy pamiętać, że wartość tuż po zmianie MUX będzie dotyczyła...
Częstotliwość od 15Hz do 80 Hz, przy 15Hz wypełnienie 3-4ms a okres 62ms. Przy 65Hz wypełnienie to 6ms, a okres ok 15ms. Dla podanych przez ciebie warunków, może to być dowolny MCU. Czy wykorzystasz gardware - timery, czy zrobisz to całkowicie programowo, to każdy współczesny MCU da radę. Jeśli pobierzesz sobie darmowe przykłady do książki "Język C"...
(at)ebson1307 Tak jak napisał kol. (at)bart-projects - przejrzyj notę użytego procesora, niewykluczone, że timer ma możliwość wprowadzania czasów martwych w generowany przebieg. Jeśli nie - to z pewnością w użytej rodzinie znajdziesz MCU, które taką możliwość posiadają. Robienie tego softwarowo jest możliwe - zrób sobie po prostu pętlę, w której wykonujesz...
Sugestia jest jedna, cóż to za silniki, że potrzebujesz aż 3 timerów ??? Jeśli chodzi ci o to aby wykorzystać je do sprzętowych PWM - to wystarczy zrobić sobie programowe wyjścia PWM w oparciu o tylko jeden timer a dwa pozostaną wolne do twojej dyspozycji. Zatem w oparciu o kolejny Timer zrobisz sobie RC5 a jeszcze jeden zostanie ci wolny.
Ano całkiem spory problem. Załóżmy, że wystartowaliśmy przy stanie timera 0 i złapaliśmy zbocze przy stanie 65535. Podczas obsługi programowej przerwania timer przekręcił się przez 0 - mamy ustawiony znacznik przepełnienia. Nie da się tego rozwiązać bez dodatkowego przerwania, np. w połowie okresu timera.
Wolałbym nie pisać Ci gotowca ;) natomiast moja rada jest taka. Uruchomić timer i jeśli częstotliwość tych impulsów jest dość wysoka to bezpośrednio w przerwaniu timera dawać sygnał rozpoczęcia i zakończenia zliczania i zliczać w pętli głównej programu, a jeśli częstotliwość impulsów jest mała (np. w ciągu 5 czy 10s ma liczyć) to lepiej zrobić dodatkowy...
Witaj, Atmege 8 wykorzystałem ze względu na to że je mam w tej chwili, attiny nie miałem więc taki a nie inny procesor - a ze względu że dla klienta 5 zł w te czy we wte wszystko jedno to nie miałem ochoty gibać do elektronicznego po inny uP ;] (Odnośnie programowego Timera - w 1 wersji taki właśni był wgrany sposób sterowania diodami ale się nie do...
Nie typu, tylko z takim specyfikatorem - to był skrót myślowy... [syntax=c] volatile uint8_t softTimer; //Zmienna dekrementowana co 10ms (timer programowy dla debouncingu) [/syntax] [syntax=c] ISR(TIMER1_COMPA_vect) { register uint8_t timerValue; timerValue = softTimer; if(timerValue) softTimer = --timerValue; //Timer programowy dla nieblokującej obsługi...
Dondu -> Po czym wnosisz? Nie uwierzę, jak nie zobaczę zdjęcia z oscyloskopu :D Tu Cię mam! PWM był programowy na Timerze - chodziło o to, aby zależność nie była liniowa, tylko proporcjonalna do jasności diody LED.
Jak dobierzesz priorytety przerwań (programowo) z TIMERA i ZCD, i transmisję z UART też zrobisz przerwaniowo to czym się martwisz. UART ma bufor 3 znakowy i jest jednostką samodzielną.
Mnożenie można zrobić robiąc programową symulację PLL. Zwykła symulacja wymagała będzie użycia jednego Timera i dość zamotanego kodu. Ale można inaczej. Dwa Timery. Jeden Timer zlicza okres przebiegu. A drugiego ustawia sie żeby zliczał powiedzmy do 1/3 wartości zmierzonej pierwszym Timerem. Taki układ ma już w miarę dobre parametery bo powinien działać...
Na tego typu problemy jest jeden prosty sposób, wielokrotnie dyskutowany na forum: automat w przerwaniu UART. Jeśli ma być wykrywana "przerwa w transmisji" najpierw trzeba zdefiniować, co to jest ta "przerwa". Jeśli "przerwa" - to brak nowych danych przez czas np. potrzebny na transmisję jednego bajtu - UART potrafi takie coś wykryć w sprzęcie. Jeśli...
Nie o to mi chodziło. Tą wielowątkowość zrobiłem dla bajeru. Waitms-y użyłem żeby było prościej i żeby było widać o co chodzi. Programowe timery stosuję tylko nie wiedziałem że to się tak nazywa :D Linka do wielowątkowości podałem, bo autor tematu napisał że swój problem już rozwiązał, więc założyłem że nie będzie brnął w wielowątkowość. Zresztą gdyby...
No jak "za ciasno" z timerami to można zrobić PWM programowy. Wtedy jeden timer do teoretycznie dowolnej ilości PWM. I tym samym timerem sprawdzasz stan przycisku. Zaczyna się na str.395 książki.
Zaprogramuj uczciwie timer w tryb CTC. O ile pamiętam (mogę się mylić, bo AVRy rzuciłem parę lat temu), to na końcu cyklu masz tu przerwanie od "zawinięcia" timera. Ogólnie nie jest dobrym pomysłem programowe restartowanie timera, jeśli ma on odliczać stałe odcinki czasu. A to, co zrobiłeś, działa prawdopodobnie dzięki temu, że preskaler się sam nie...
Lepsza opcja to timery programowe https://github.com/adamdunkels/uip/blob/...
opcja z PWM chyba nie wystawi sygnału jednorazowo PWM + ONE SHOT daje radę. Musisz jeszcze określić jaki ma być wyzwalacz (drugi timer, sygnał zewnętrzny na pinie, jakiś inny event, programowo).
Może by tak te impulsy na próbę podać na zwykły licznik/timer i zobaczyc ile zliczy na sek. i czy zlicza stabilnie? Przynajmniej bedzie wiadomo czy to problem bardziej sprzetowy, czy programowy.
Odnośnie dokładności w odliczaniu przerwania Oczywiście, jeśli tak Koledze działa program to spoko. Odnośnie dokładności w odliczaniu przerwania Jeszcze lepiej oprzeć się na rejestrach procka. Dodano po 1 działanie oparte na programowych timerach O ile zwiększył się kod programu ? Jeśli Timera 1 lub 2 nie używamy w ogóle do PWM, lub przerwań to można...
Zgaduję, że o drgania styków chodzi - trzeba to programowo obsłużyć - przerwanie timera, czyli coś, co wraca tu 2 razy na tydzień (ostatnio wczoraj).
Interesuje mnie jak rozwiązałeś to programowo,będzie szansa na udostępnienie wsadu bascom?
(at)atom1477 Jeśli ja wygeneruje przerwanie co 1 ms, to muszę mieć potem możliwość coś zrobić, czyli w przerwaniu muszę chociaż zmienną inkrementować, albo zrobię toggle pin i połączenie z głównym MCU przez INT0 tak jak pisałem post wcześniej . Mam kwarc 20ppm i nie jest on wystarczająco stabilny, dlatego poszedłem na DS3231 i źródło timera od T1....
W sterowniku jest już bateria. Chodzi mi o rozwiązanie programowe.
Całkiem błędna sugestia - sygnał pochodzi ze styków, a ATmega nie ma sprzętowego filtrowania wejść timera. Tu sprawdzi się tylko zliczanie programowe w przerwaniu timera. Proponuję na początek częstotliwość ok. 50..100 Hz - powinieneś w ten sposób bezpiecznie ominąć drgania styków.
Witaj, To pytanie jest podobne do pytania, jak nastawić zwykłe radio na dwie różne stacje radiowe by słuchać ich jednocześnie? Odpowiedź zapewne znasz :) Co do Timera, także odpowiedź znasz chociażby dlatego, że znasz schemat timera i fakt, że aby go ustawić w różne tryby używa się tych samych bitów. Innymi słowy: czy PWM może działać bez timera? Tak,...
Napisałem co trzeba zrobić. Ustaw wyjście fizyczne na sumę logiczną. Iloczyn zrób sobie gdzieś na wyjściach wirtualnych, a fizycznym wyjściem ma być suma logiczna sterowana z wyjść którymi chcesz sterować wyjście fizyczne Suma fizyczna narusza wyjście jeśli JAKIEKOLWIEK z wyjść sterujących jest naruszone.
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 ten STM32 nie będzei miał prawie nic innego do roboty, to i programowo mógłby to dekodować. Sensowniej jednak byłoby zaprząc do tego timer w trybie pomiaru okresu i szerokości PWM. Uda się i jedno i drugie, o ile nie będziesz korzystał z SPL.
co do organizacji całości- dokładnie tak, to są tzw. timery programowe. A co do odświeżania - mogę Ci pomóc wieczorem, jak wrócę z pracy :)
Spojrzałem w ten kod i niestety jest tam o wiele więcej problemów. Typowy kod początkującego, ale OK - każdy kiedyś zaczynał i pisał takie potworki ;-) Co można naprawić? Już Ci to mówili w innym wątku: przede wszystkim wywalić czasochłonne operacje z przerwania. W ISR ustawiasz tylko flagę, a w pętli głównej sprawdzasz jej stan i, jeśli zachodzi warunek,...
dodatkowo podpiął bym to przez najzwyklejsze diody do INT0 i w przerwaniu obsługiwać wykrywanie zwartego pinu. albo lepiej, skoro masz procesor z PCINT to wykorzystaj dwa piny PCINT i odpowiednia obsługa programowa. dokładając timer możesz z grubsza mierzyć czas impulsu żeby eliminować drgania styków
Flagę sprzętową, np. w rejestrze EIFR, tak samo można kasować programowo. Więc stosując flagę programową nic nie zyskujemy. Tracimy za to czas na obsługę przerwania (mały, ale zawsze te kilka cykli) oraz kilka B Flasha. No ale tłumaczenie takich rzeczy to troszkę jak tłumaczenie komuś, że 2 x 2 to równa się 4. Wątpię, żeby ktokolwiek z opowiadających...
Ponieważ lista peryferiów ATTINY13A to zaledwie timer, ADC, watchdog i komparator, każdy protokół komunikacji będzie musiał byś zrealizowany w większości programowo, wszystko będzie zależało od biblioteki, której użyjesz, jeśli ktoś napisał bibliotekę z użyciem timera i przerwań z portów. To mogłoby nieźle działać, jeśli nie, to protokoły powolne (1-Wire...
Chodziło mi z strony programowej jak to jest zrealizowane używasz timera ?
Dla ćwiczeń - jak najbardziej. Edit: Edytowałeś post więc dodam: Jeśli musisz oszczędzić piny PWM lub timery do innych celów, to oczywiście rób PWM programowo. Ale wtedy musisz zadbać, by każde przerwanie wykonywało się szybko, by PWM się wyrabiał, bo znowu serwa będą drgać :)
Na razie masz impulsy o długości 920us co 2.46ms. A powinny być 1-2ms co 20ms. Poza tym te impulsy są niestabilne. Znierzone oscyloskopem- widzisz jakie długie mam sondy... A teraz masz 142us co 2.64ms. Dalej źle. No tak-oba timery ustawiają PORTB.0.
Zrób to przyzwoicie na timerze. Opóźnienia programowe to zabawka o niedeterministycznym działaniu.
Hmmm... ale jeśli poprawa wydajności ma polegać na cyklicznym wysyłaniu jednego znaku z bufora, np raz na 1ms korzystając z timera programowego lub sprzętowego, to i tak linia RW nie jest potrzebna. Po wysłaniu każdego znaku, funkcja obsługi wyświetlacz by się kończyła, a w tym czasie procek robiłby coś innego. Można założyć, że w ciągu tego czasu...
dsPIC no tak jak sama nazwa wskazuje jest to procek specjalizowany. Nie jestem w stanie ci powiedzieć w którym miejscu nastąpiło przekłamanie. Mogę ci powiedzieć że problem rozwiązało nieblokowanie timera tylko programowe odłączanie/dołączanie wyjścia PWM timera do pinu portu bitem w odpowiednim rejestrze.
Pomyśl, skąd bierze się przerwanie timer? Stąd, że w rejestrze timera został sprzętowo ustawiony znacznik, który można odczytać programowo. Ustawiając w przerwaniu timera znacznik programowy bezsensownie dublujesz znacznik sprzętowy - wystarczyłoby bez żadnego przerwania sprawdzać znacznik sprzętowy zamiast tego programowego. Dobre rozwiązanie polega...
No i właśnie ze tego powodu każdy projekt powinno zaczynać się od spisania wymagań, a następnie od wyboru mikrokontrolera na podstawie tych wymagań. Znajdź taki uC, który ma tyle kanałów PWM o programowanej częstotliwości i wypełnieniu, ile potrzebujesz, a nie staraj się na siłę zrobić na tam uC, jaki masz, czegoś, czego on nie potrafi. Jeśli liczba...
Można toggleować ale nie skrócisz cyklu timera do tych 4ms, to musi być wykonane poprzez ocr2a, ewentualnie zerujesz programowo w przerwaniu od ocr2b. To z tym read only musi być błędem, w datasheetach też się takowe zdarzają
PLL to podstawa jeśli chcesz to robić programowo. Dlaczego jednak nie wykorzystasz timera + ECCP?
szczerze to nie mam pojęcia o "timerach programowych" zostańmy na poziomie "umiem pomigać diodą". Co do zwłoki czasowej to chcę zrobić ją w pętli coś w stylu powyższego przykładu. Jeśli się mylę co do mojego powyższego postu to mógłby mi ktoś wytłumaczyć jak to działa?
Można. Można też zamiast sprawdzać stan pinu programowo, podłączyć pin wyjściowy Timera pod jakieś przerwanie INTx.
jak ustawisz na counter to liczy z wejscia p3.4. a teraz gate=internal/external to jest tylko ustawienie czy timer bedzie wlaczeny programowo czy sprzetowo. jak dasz external to timer liczy gdy na p3.2 jest stan 0
zastosować do timera (przy przepełnieniu) programowy licznik na zmiennej
odczytywać stan przycisku w timerze (programowym, sprzętowym, jakimkolwiek) co (przykładowo) - 20-50ms i zapisywać to do zmiennej. Zmienna ta to "odfiltrowany" stan przycisku. Ewentualnie - jeśli masz już RTOSa albo kolejkę zdarzeń - z funkcji wywoływanej co te 20-50ms można od razu kolejkować jakieś zdarzenia.
licznik timer programowa programowa atari transponder programowa
strumienica zamiast katalizatora triak przekaźnik radio alpine schemat
philips senseo sterownik ładowarki akumulatora
First 5152 - Zatrzymujące się mieszadła w wypiekaczu Optymalne ustawienie przedziału beacon w routerach ASUS