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...
A co dokładnie nie działa? Pewnie cały czas świeci :) Przeanalizuj swoją pętlę while i zobacz co się dzieje po ustawieniu timera :) Podpowiedź: wykorzystaj dodatkową flagę i użyj tylko RAZ timera programowego.
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...
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ę. 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,...
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...
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...
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...
Wg. mnie najlepiej zaprzęgnąć do tego celu timer no chyba że już zajęty to wtedy programowo PWM.
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?
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,...
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...
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...
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...
Obsługiwał będę w programie docelowym: -UART -Timery Programowe + PWM (Na jednym timerze"2") -3xserva -Czujnik HC-SR04 na timerze ICP Do reszty nie są potrzebne przerwania i timery.
Witam! Mój przedmówca nie ma niestety racji. Timery nie służą do dokładnego pomiaru czasu. Dlaczego? Trzeba pamiętać, że timery pracują asynchronicznie w stosunku do wykonywanego programu. Kiedy wiec jakiś timer doliczy swój czas dowiemy się o tym dopiero przy najbliższym obiegu pętli programowej. Wynika z tego ze odmierzony czas może być (w najgorszym...
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)...
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.
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...
Możesz to przecież zrobić "sprzętowo" - każdy przycisk osobno do "dowolnego" portu, a dodatkowo wszystkie razem do portu "z przerwaniem", z tym, że od każdego przycisku do tego specjalnego portu dajesz diodę. Tym sposobem masz tylko jedno przerwanie, ale możesz wykrywać który przycisk został naciśnięty. Ponieważ i tak trzeba kombinować, to możesz zaoszczędzić...
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...
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...
Lepsza opcja to timery programowe https://github.com/adamdunkels/uip/blob/...
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...
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...
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.
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?
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 :)
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ął...
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,...
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.
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.
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?
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.
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.
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...
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ć...
Nie znam się na C ale na pewno do tego celu najlepiej użyć timera programowego który odpowiada za częstotliwość migania i zliczasz po prostu ilość mignięć po czym ustawiasz jakiś znacznik, który blokuje to miganie.
Timery i dokładne odmierzanie czasu w różnych miejscach kodu. Zamiast korzystać z kilku timerów, można w różnych blokach kodu konfigurować 1 timer i wstrzykiwać odpowiednią funkcję przerwania. Oczywiście pod warunkiem, że nie będziemy musieli odmierzać czasu dla dwóch bloków jednocześnie. Wygląda na to, że potrzebujesz po prostu callbacka w jednym...
Narzut na włączenie i wyłączenie swoje zrobi przy dużym time. A na zwykłej fladze od przerwania ominąłbyś ten problem, kombinujesz tylko po co? Nie prościej zrobić timer programowy z tego? Nie prościej zapisać odpowiednią wartość do ARR?
A ja z innej beczki... Sposób w jaki zrobiłeś miganie (program) kiedyś się na Tobie zemści ;) . Wystaczy, że coś na chwilę przyblokuje pętle główną i ustawiony czas migania pójdzie w maliny... Timery programowe do takich celów robi się troszkę inaczej - wybrałeś najgorszą z możliwych metodę.
Powrócę jeszcze do tematu. Timery programowe to objaśnił Mirekk36 w swojej książce oraz artykułach i wideo poradnikach, bardzo dobrze je się stosuje. Jest to proste, wystarczy ustawić jakiś timer w tryb CTC i wywoływać przerwanie co jakiś zamierzony czas (stosuje około 10ms). F_CPU/Prescaler/100 Zaokrągloną wartość wpisujemy do rejestru OCRx. W przerwaniu...
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.
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...
Na razie przestanę śledzić temat bo maili dużo :D Sprawa się rozjaśniła trochę. Compare pewnie używasz dlatego że chcesz mieć też sygnał przerwania i w nim ustawiasz jakieś flagi albo timery programowe. Spróbuj działać na zmiennej W w pętli głównej, a wartość przypisać w obsłudze przerwania.
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...
Może układ ma kwarc. Wtedy wystarczy przeczytać. Rezonatora wewnętrznego nie przeczytasz bo nie wiadomo czy i jakie przebiegi program wyprowadza na porty I/O. A nawet jak jakaś nóżka wykaże jakiś przebieg to trudno będzie się domyślić jakie jest F_CPU, jaki preskaler, tryby pracy timer'ów, jeszcze do tego timer programowy etc... Nie da się.
Zrób to przyzwoicie na timerze. Opóźnienia programowe to zabawka o niedeterministycznym działaniu.
mariooo: niby jak hcesz przehować zmienną zmienno-przecinkową w 51? avr'y mają bit carry dzięki czemu idzie sobie liczyć zmienne bardzooo duże.. co do metody liczenia są 2 inne metody: 1: puścić timer. programowo odliczyć 200 impulsów.. po tych 200 impulsach sprawdzić jaki czas upłynoł (wartość licznika) 2: puścić timer. programowo zliczać impulsy podczas...
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ą.
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...
Działam ostro już mogę robić animacje, Wyłączać timer programowo i wysyłać obrazki ręcznie ;) a teraz chcę mieć w programie zakładki takie jak są np. w windowsowych właściwościach ekranu. Jak to zrobić ? PS. Władowałem na formę obrazek i nie mogę się go już pozbyć a nie chce mi się robić całej formy od nowa da się to jakoś odkręcić ?
Ustaw znacznik gotowości w jakimś nieużywanym peryferialu albo załaduj timer wartością sprzed końca okresu i go włącz.
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.
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ć...
Znajomy kod :) Ad.1 Zrób po prostu podprogram, do którego się wskoczy po wciśnięciu przycisku gdzie wszystkie porty ustawiane są przez SET a gaszone przez RESET. To czy ma zgasić czy zapalić ustal w dodatkowej zmiennej bitowej "togglowanej" wspomnianym przyciskiem. Ad.2 Oczywiście - timer programowy... Ad.3 A czy przypadkiem w oryginalnym programie...
Załóżmy, że obsługujemy klawisz w przerwaniu zewnętrznym i ustawiamy flagę, że został naciśnięty. W pętli głównej sprawdzamy flagę i toglujemy diodą na wyjściu wysyłając jednocześnie po uarcie info - dioda ON/OFF. :idea: - taki przykład dla początkujących :D Osobiście zrobiłbym to zupełnie inaczej. Obsługa przycisków przy użyciu przerwania zewnętrznego...
Debounce spokojnie by tu wystarczył jeśli nie zależy Ci na ciągłości działania programu (ten zawsze wstrzyma na 25ms). Do tego wykorzystaj dodatkowy timer programowy do mierzenia czasu trwania buzera (ewentualnie można to zrobić w jakiejś pętli jeśli wstrzymanie programu jest nieistotne). Można też wykorzystać badanie portu z maskowaniem (AND) jeśli...
- w następnych programach postaraj się wprowadzić inne techniki opóźniania niż delay_ms. Poczytaj o tym, bo warto od razu przejść na taki "wyższy poziom" niż brnąć w ślepą uliczkę z blokowaniem programu przez zbędne delaye. Nawiązując do tego co kolega napisał, to poczytaj o timerach programowych. Dzięki nim będziesz miał opóźnienie bez blokowania...
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"...
Są 2 opcje albo na timerach albo programowo wystarczy poszukać jest pełno opisów i przykładów
No z delay na pewno nie :). Ustaw sobie w przerwaniach timer programowy co 1s, a w pętli głównej możesz zrobić "liczydełko" reagujące na zbocza. W każdym tyknięciu timera w przerwaniach zapisz ile impulsów zliczyło i wyzeruj licznik. To co zapiszesz to w zasadzie gotowy wynik, który co 1s będzie aktualizowany. To chyba najprostsze rozwiązanie. Można...
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.
No to tak. Nie lubię _delay(). Do kodu menu tmf dodałem timer programowy z książki Mirka. Najpierw kompilator powiedział mi że jestem głupi bo nie widzi Timer1 w pliku menu_alfa. To zgodnie z tym co napisł tadzik85 napisałem że jest extern volatile- no to kompilator się na to zgodził. Chociaż nie rozumiem- przecież Timer1 jest volatile- globalny w pliku...
Może jednak zdradzisz mi te niespodzianki? Zaoszczędził byś mi sporo pracy. Teraz tak z rękawa nie posypie, hmm... przykładowo Do...Loop jest mniejsze niż while...wend. Generalnie chodzi o zastępowanie, niektórych instrukcji BASCOM'owych własnymi rozłożonymi na części pierwsze warunkami. O działaniach na liczbach zmiennoprzecinkowych już nie wspomnę,...
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.
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...
No ale w czym problem - skoro maszyna jest obiektem, to w czym problem żeby ten obiekt miał dowolną ilość zmiennych i dowolną ilość instancji? Albo niech zmienne będą częścią stanów (również obiektów). Przecież tak się to robi w C++. W przypadku setki case'ów faktycznie się tego nie da zrobić inaczej niż zmiennymi globalnymi - właśnie tyle te case'y...
zastosować do timera (przy przepełnieniu) programowy licznik na zmiennej
Mirekk36 a jaką dać częstotliwość taktowania bo dla twojej funkcji mi dioda miga co około 72s Najpierw sprawdź czy jak dasz _delay_ms(1000) to czy miga ci co sekundę - jeśli nie to napisz/powiedz/sprawdź czy masz dobrze przede wszystkim Fusebity ustawione ? Na pewno sama funkcja i while nie robi takiego narzutu żeby zamiast 60s było 72s ;) - jak już...
Tylko nie wiem jak dopisać je na "sztywno" do tego: No, pomijając że masz źle napisany kod do odczytu temperatury bo twoje Wait 1 stoi nie w tym miejscu ;) .... to jeśli chodzi o pytanie powyżej a raczej odpowiedź na nie - to ja już ci podałem wyżej w tym linku. Poza tym - skoro pierwszy raz zaczynasz bawić się tymi czujnikami to niedługo zadasz kolejne...
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...
Jak najbardziej jest poprawne, tyle że zauważ że w obydwu przypadkach nie masz zrealizowanej programowej eliminacji drgań styków
Klawiatura jest skanowana z częstotliwością około 1 kHz (piszę: około, bo z lenistwa nie użyłem timera, tylko programowego opóźnienia). Wartość jest arbitralna, dużo poniżej możliwości procesora i w zasadzie można ją dowolnie zmieniać - tyle, że częstotliwości powyżej ok. 1300 Hz są bezsensowne, bo zaczynamy się opierać o przepustowość MIDI. Co do układów...
A jak nadejdzie krótsza a potem nic? Dalsze komplikowanie, jakies timeouty - po co? DMA jest wygodne i użyteczne do pewnych celów a do innych nie. Nie przesadzaj. Robi się to właśnie timeoutami i działa całkiem nieźle. DMA odbiera ciągiem (w trybie circular z przerwaniem od połowy i całego transferu), masz też przerwanie okresowe (albo timer programowy)...
Poza tym nie trzeba wcale mieć timerów ani zadnego supervisora, jeśli masz gwarancję, że dane przetworzysz szybciej, niz przychodzą. A parser i obróbka może się mielić najzwyklej w pętli głównej. Ja tutaj patrzę od razu pod kątem podpięcia takiego odbioru pod strumienie (czyli FILE, scanf() itd.), które z racji swojej asynchroniczności generalnie potrzebują...
1. Wysyłam żądanie konwersji. 2. Startuje timer1 generując przerwanie co ok. 2 sekundy. 3. Skok do obsługi przerwania, a w niej żadanie odczytu 1wire i pobranie dwóch bajtów danych. 4. Powrót do programu głównego. 5. W programie dokonuję niezbędnych przeliczeń i operacji na zmiennych. A czemu nie korzystasz z timerów programowych? Ustawiasz sobie jeden...
Podawałem już moje rozwiązanie w temacie http://www.elektroda.pl/rtvforum/viewtop... przytoczę jeszcze raz: [syntax=basic4gl]Dim L_d As Byte Sel_p Alias PortX.Y '-------- ' ' ' '-------- If Sel_p = 0 Then 'klawisz Waitms 25 'najlepiej zastąpić przez timer programowy If L_d < 255 Then Incr L_d If L_d = 30 Then 'czekaj około 0,7s...
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,...
Aaaa to ty tego PCF'a tylko dla tego 1Hz chciałeś ? - pewnie że to przesada. No ale nie ze względu na to że masz ileś tam wolnej pamięci Flash, bo to jest argument który ma się jak pięść do oka niestety. Pomyśl o czymś takim co się nazywa "timery programowe" to będziesz mógł mieć nie tylko 1Hz ale i inne dowolne częstotliwości dla wykonywania różnych...
"debounce" i "delay" A cóż to za magiczna funkcja "Config KBD"? Wszystko zależy od tego jak skonstruowane są bloki debounce. Jeżeli na zwykłych delay to leżysz. Jeżeli na timerach programowych - nie musisz się o nic obawiać. Niestety jest to tylko i wyłącznie gdybanie - nie zaprezentowałeś choćby odrobiny kodu, nie wiadomo jak podchodzisz do programowania....
Witam. Czy istnieją układy scalone do takich zastosowań to nie wiem ale bez problemu zrealizujesz taki pomiar na dwóch wejściach ADC w uC choćby jakiejkolwiek ATmegi lub innej. Ja tak realizuję swoje testery fazowe sieci energetycznej. Sprawdzam kolejność faz i ze wzorów i tablic matematycznych i za pomocą timera programowego lub sprzętowego można bardzo...
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.
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...
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.
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...
Fajną metodą jest zagospodarowanie sobie jednego timera do generowania "timera programowego". Opis: Któryś timer ustawiasz sobie tak, aby generował przerwanie co 10ms. W timerze tym tworzysz kilka zmiennych inkrementowanych za każdym przerwaniem i sprawdzasz, czy osiągnęły pożądaną wielkość. Jeśli tak, to ustawiasz sobie flagę/znacznik, że należy wykonać...
po chwili proszę odnieść do czasu jaki potrzeba na zerknięcie do instrukcji obsługi, który klawisz jako następny należy nacisnąć, odnaleźć go na klawiaturze na front panelu i nacisnąć lub odczekać podobny okres bez naciskania klawisza, czyli mówię w przybliżeniu o 3 sekundach na każde naciśnięcie skoro robiłem to z instrukcją w ręce pierwszy raz. Nie...
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.
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.
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
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.
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...
Programowo nie chce za bardzo bo raz że trzeba wykorzystać opóźnienia Wcale nie trzeba (; Można próbkować stan przycisków przy użyciu timera (sprzętowego lub programowego). 4\/3!!
Od INT0-narastające zbocze a od INT1 opadające. Potem TIMER. Chociaż to rozrzutne wykorzystanie zasobów sprzętowych. Pewnie da się taniej. Dodano po 29 Albo w pętli głównej (pooling): jeśli PD.2=1 to start timer odlicz 1ms(albo 2) (może programowo się podeprzeć-nie wiem jaki kwarc i podzielnik) ustaw PA.2 koniec jeśli. A jak nie: ustaw PA.2=0
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ą
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...
Nie chodzi o podłączenie, tylko o sterowanie. Wyłączenie tranzystora nieco trwa, stąd jeśli dokładnie w tym samym momencie włączysz Q1, a wyłączysz Q2, to zależnie od użytych tranzystorów przez ułamek sekundy powodują one zwarcie zasilania do masy. Od tego są specjalne mikrokontrolery z timerami z dead-time lub sterowanie programowe, które można zrobić...
przerwanie programowe kodowanie programowe przerwania programowe
szybkozłączka pneumatyczna przewodność mosiądzu cannot convert
Podłączenie kabla diagnostycznego do Toyota Starlet - instrukcja krok po kroku Łączenie przetwornic step-down 20A równolegle