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...
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...
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?
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.
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....
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...
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.
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.
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.
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...
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.
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...
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...
ł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....
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,...
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ą.
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...
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.
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.
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.
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,...
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...
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)...
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?
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...
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...
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ą...
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...
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ć...
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.
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!!
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...
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,...
A czy zdajesz sobie sprawę z tego , że Twój programowy UART ma baudrate = 100 bps :?: :!: :!: :!: Poza tym ten Keil-owski kod , też jakiś ... dziwny :( /*...*/ static char internal_tx_buffer; static char user_tx_buffer; /*...*/ internal_tx_buffer = (user_tx_buffer<<1) | 0x200; Piotrek
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.
Totalnie nieczytelny ten Twój kod :( Stosuj tabulatory! piszesz: int x=0; x=0; Jaki to ma sens? Tzn ta druga linia? Co do timerów. W mainie ustawiasz ich tryb pracy, ładujesz odpowiednią dla Ciebie wartość do rejestrów TLx oraz THx po czym startujesz licznik. Wartości te dobierasz tak aby np licznik taktowany zegarem 1MHz (kwarc 12MHz - dalej dzielnik...
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...
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...
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. 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ął...
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...
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.
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...
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...
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...
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...
Ustaw znacznik gotowości w jakimś nieużywanym peryferialu albo załaduj timer wartością sprzed końca okresu i go włącz.
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.
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...
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.
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...
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.
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.
Sama idea co najmniej dziwna, plus brak blokowania przerwania. A tak swoją drogą po co angażujesz timer T0 skoro go nie używasz? I jak ma się wywołać przerwanie od T1 skoro nigdzie go nie skonfigurowałeś?
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...
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...
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ć...
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...
Wygląda na to, że procedura obsługi przerwania TIMER0_COMPA_vect się nie wyrabia (ma do dyspozycji 80 taktów). Innymi słowy czas pomiędzy przerwaniami jest krótszy od czasu wykonania kodu procedury obsługi przerwania. Wpisanie na początku procedury instrukcji TCNT0=0; powoduje po prostu wydłużenie czasu zliczania timera 0 o czas trwania prologu procedury...
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,...
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/...
No i nie udało mi się tego zrobić na Timer0- on sie kręci bez przerwy a ja potrzebuję włączyć i wyłączyć timer. Tak że na razie na Timer1- szkoda bo 16 bitów- ale zrobię na Timer2. Spokojnie użyj Timer0, który będzie zgłaszał przerwanie np. co 1ms. W procedurze obsługi tego timera dekrementuj zmienną, jeśli osiągnie 0 to należy zatrzymać dekrementowanie,...
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...
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).
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).
(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....
Pierwszy z tuzina problemów z tym programem - to użycie typu int zamiast uint8_t do reprezentacji liczb z zakresu 0..250. Drugi, ważniejszy - to niedziałający PWM na opóźnieniach programowych zamiast przerwania timera. Trzeci - użycie mnożenia do liczenia kolorów - policzy coś innego niż się spodziewasz. Zaczynamy od obliczeń, z których już za chwilę...
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.
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...
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 :)
Potrzebuje zrobić mruganie diody o określonej wartości pwm prze określoną wartości mrugania. Przyznam, że nie rozumie tego zdania. Możesz jaśniej? Użyłem timerów programowych, ale gdy działa pwm nie działa timer i na odwrót Użyj timera sprzętowego.
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.
Ratunku!- jeden timer. Są timery sprzętowe w każdym procesorze. No i w każdym można zrobić programowe- dużo timerów programowych w jednym timerze sprzętowym. Ale zacznij czytać książki- bo w internecie to jest mocno pokawałkowane- jakieś sterowanie w oderwaniu od reszty tego co ma robić procesor. Bascom dla początkujących występuje w przyrodzie. Bascom-a...
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?
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ć :)
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
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.
Można by tak: zegar 12 MHz i wtedy cykl maszyny trwa 1 us, timer T0 ustawiasz w tryb 2 (autoreload) wpisując do jego rejestrów TH0 i TL0 wartości takie by przerwanie od niego było co 10us (problem kroku załatwiony). Tworzysz licznik programowy w którym będziesz odliczał potrzebną ilość wcześniej ustalonych przerwań. Po przekręceniu licznika reakcja...
a instrukcje start timer1 i stop timer1? to tak najprościej, bo wogóle to to można zrobić na timerze0, przerwaniu i jednym liczniku programowym...
zastosować do timera (przy przepełnieniu) programowy licznik na zmiennej
rozdzielczość programowy atmega programowy przerwa programowy
podsłuch telefon analogowy bezpiecznik klatka schodowy płyta samsung główna grzeje
pioneer instrukcja obsługi polski pioneer instrukcja obsługi polski
Cewki w piecykach Junkers: ile i jakie? Volvo V50 2.0D - Poszarpywanie po rozgrzaniu przy 1800 obr./min