1. Nie definiuj zegara w kodzie tylko w opcjach kompilatora: http://mikrokontrolery.blogspot.com/2011... 2. Problem natomiast pojawia się wówczas, gdy funkcja obsługi przerwania wykonuje się długo. Docelowo będzie sterować portami przez około 16 sekund. Przerwanie ma się wykonywać krótko i tego zawsze się trzymaj, bo łatwo...
Nie potrzebujesz kolejnego licznika. Już masz jeden skonfigurowany do pracy cyklicznej i to w zasadzie już Ci mniej więcej wystarczy. Masz w tym momencie przerwanie co 1/18750sekundy czyli co jakieś 53,33(3)us. Jeśli chcesz zrobić opóźnienie w pętli głównej o na przykład 500ms to wystarczy, że poczekasz 500000/53,333=9375 takich przerwań. W tym celu...
spr dodać 'volatile' przy deklaracji zmiennej, możliwe że kompilator optymalizując wpisuje na stałe wartość zadeklarowaną na początku, w przerwaniu jej wartość się nie zmienia, dla kompilatora jest ona w tym miejscu jako stała ...
Ponieważ aktualnie mierzę się z podobnym problemem w driverach zaimplementowanych w moim RTOSie, powiem Ci szczerze, że taki sposób obsługi SPI jest po prostu niemożliwy do zrobienia poprawnie i tak żeby osiągnąć jakąś rozsądną częstotliwość. Sytuacja którą obserwujesz jest stosunkowo prosta. Natychmiast po uruchomieniu transmisji masz pierwsze przerwanie...
Dodatkowy wpływ na błąd ma niedokładność częstotliwości generatora kwarcowego. Błąd w sekundach na dobę, wyraża się wzorem: \Delta=86400*(1-\frac{fwzr}{f}) \Delta - błąd w sekundach na dobę (wartość ujemna oznacza spóźnianie się) fwzr - częstotliwość wzorcowa (czyli to co ma być np. 4000000 Hz) f - częstotliwość rzeczywista kwarcu lub generatora kwarcowego...
Chciałbym przedstawić jeden z możliwych sposobów wykonania cyfrowego regulatora PID Przestawiony regulator nie ma konkretnego zastosowania , to do czego zostanie wykorzystany zależy od czytelnika. Opis regulatora kieruję do osób które zaczynają przygodę z automatyką i układami regulacji. Spróbowałem wyjaśnić jak działa cyfrowy regulator PID, czemu ich...
https://obrazki.elektroda.pl/3496920600_... Jednym z pierwszych projektów, które zrealizowałem mając 9-10 lat było pudełko z kilkoma LEDami, przełącznikami i potencjometrem - taka tam wprawka w lutowanie. Drugim była migająca strzałka LED z kitu bodaj Jabela. Pierwszym, który zepsułem lutownicą transformatorową (której nie polecam)...
http://obrazki.elektroda.pl/6223122300_1... Domyślną metodą kontroli napięcia 230 V AC jest kontrola poprzez triak. Tak zrealizowany jest każdy ściemniacz. Kontrola taka oparta jest o kontrolę fazy - triak jest otwierany jedynie na pewną część sinusa napięcia przemiennego. http://obrazki.elektroda.pl/2250705900_1...
http://obrazki.elektroda.pl/2563369400_1... Witam wszystkich! Chciałbym zaprezentować pewien mały projekt, który wykonałem na prezent. Jest to drzewko szczęścia, w którym rolę liści pełnią diody LED RGB. Był to jeden z moich pierwszych projektów oraz pierwszy zawierający część analogową (dlatego zarówno projekt jak i wykonanie nie jest...
http://obrazki.elektroda.pl/6148316100_1... http://obrazki.elektroda.pl/9687194100_1... Mając kilka wolnych chwil, postanowiłem skonstruować odbiornik do bezprzewodowego czujnika stacji pogodowej Oregon Scientific RMR203HG. Stacje tej marki są ogólnie dostępne, jeśli chodzi o wrażenia z użytkowania – działa bez...
http://obrazki.elektroda.pl/9589280700_1... HPS 2014 Hybrydowy laboratoryjny zasilacz sieciowy. Parametry użytkowe zasilacza w skrócie: 1. Wykorzystanie tanich i łatwo dostępnych elementów. 2. Wydajność prądowa min 3A (dla niskich napięć może dochodzić do 5A). 3. Rozdzielczość DAC 12bit. (filtrowany PWM 4.9kHz) 4. Rozdzielczość ADC...
Sterowanie wentylatorem pwm przez arduino mega z wyświetlaczem (at)ElektrodaBot Jak to zrobić z pomocą zasilacza z dwoma wyjśćiami mianowicie 5v i 12v marki Mean Well? AI: Jaki model wentylatora PWM chcesz sterować? Wentylator Noctua NF-A14 iPPC-3000 PWM AI: Jaki typ wyświetlacza jest podłączony do Arduino Mega? Na pewno dotykowy Bezpośrednia odpowiedź...
https://obrazki.elektroda.pl/6692889600_... Od jakiegoś czasu czułem potrzebę sterowania komputerem za pomocą niestandardowej klawiatury. W wielu przypadkach, takich, jak emulatory starych komputerów i sterowanie urządzeniami za pomocą klawiatury, można przypisać funkcję programu do klawisza na klawiaturze. Na przykład komputer ZX...
Pomysł wydaje się być dobry, ale nie do końca. Teraz reakcja na kręcenie potencjometrem jest widoczna na oscyloskopie w postaci zmiany częstotliwości, także podczas przytrzymywania przycisku, ale obecnie nie da się sterować klawiszami. Tzn, teoretycznie się da, ale czas reakcji od naciśnięcia przycisku sw na wykonanie instrukcji wewnątrz pętli trwa...
Jak wspominałem komunikacja przebiega prawidłowo, wysyłałem daną wartość i następnie sprawdzałem czy dostałem to co chcę i tak właśnie było. Wykonałem również to co napisałeś i wyniki potwierdziły się. Problemem jest zmiana częstotliwości 3 kanałów jednocześnie, gdy otrzymam nowe prędkości nadpisuję zmienne w których przechowuję wartości do których...
Z odpowiednim filtrem sinusoida >100kHz też wyglądałaby dobrze. Ale Prostokąt czy piła już nie :-) Zanikanie przebiegu podczas przestrajania to zamierzony efekt, czy "bug"? Nie zamierzony, nie bug. W czasie generowania przebiegu wykonywany jest program: [syntax=avrasm] 1: add r18, %0;1 cycle adc r19, %1;1 cycle adc %A3, %2;1 cycle lpm ;3 cycles out...
Możesz dać gotowca jak masz i przeanalizuje to. Gotowca (źródła), który działa prawie identycznie (inne częstotliwości migania ale to drobny szczegół) jak Twoje założenia projektowe, masz u siebie na dysku. Jest to program demo wgrywany fabrycznie do płytek Nucleo i znajduje się w repozytorium programu STM32CubeIDE. Gdzie akurat u Ciebie na dysku jest...
Już dziś nie zajrzę do Twojego kodu (pewnie jutro wieczorem), ale jeśli chodzi o częstotliwość próbkowania, myślę że się pomyliłeś. Normalnie ATMEGA może zbierać prawie osiemdziesiąt tysięcy próbek na sekundę. Ja podałem kod na gwarantowane 1000 pps, a Ty chcesz spowolnić jeszcze ADC? To peryferium działa niezależnie od procesora i zmiana częstotliwości...
Cześć, programowanie embedded nie przestaje mnie zaskakiwać. Mam program, ogólnie dość rozbudowany, na procesor xmega. Program między innymi odtwarza dźwięk. Zajmując się czym innym chciałem sobie czasowo mrugać ledem, więc do sprawdzania czasu korzystam z funkcji millis(), która wygląda tak: [syntax=c] long millis() { long result; ATOMIC_BLOCK(ATOMIC_RESTORESTATE)...
Zmiana planów - attack/release zamiast ADSR do wewnętrznego filtra. Najprościej jak się da, jak w ARP Odyssey i Micromoogu. Dwie gałki mniej. Ja bym zrobił tak (i tak zrobiłem) - w przerwaniu uart'a przenoszę odebrany bajt do akumulatora. Jeżeli najstarszy bit jest ustawiony - wtedy odebrano status, jeśli wyzerowany dane. Analizuję status czy jest note...
Piszesz, że wiesz jak działa multiplekser, a w algorytmie ani śladu tej wiedzy. Już na początku włączasz przerwania od !INT0. Na schemacie ten pin nie jest do niczego podłączony. Gdzie tu logika? Co do samego MPXa, jeżeli chcesz skanować kanały, to potrzebujesz licznik, który będzie generował sygnał przerwania i adresował kolejny kanał MPXa z określonym...
Witam. Mam problem na który sensownej odpowiedzi nie znalazłem, w nocie katalogowej także nie ma opisanego takiego przypadku za to jest kilka innych które mi średnio pasują do czegokolwiek. Mianowicie potrzebuje produkować przebieg o niezależnie programowalnej częstotliwości i czasie trwania stanu wysokiego. Parametry tego przebiegu to częstotliwość...
Z tego co widzę czujnik ten wysyła sygnały PWM (modulacja wypełnieniem pulsu) o częstotliwości 100Hz i wypełnieniu 50% dla 0g. Zmiana wypełnienia o 20% oznacza zmianę o 1g gdzie czujnik ma gwarantowane działanie na +/- 1.7g min. Czyli wypełnienie 50%=0g, 30%=-1g, 70%=1g. Minus tych czujników jest taki, że żeby to dobrze obsłużyć to musisz łapać te zmiany...
Witam, potrzebny jest mi generator fali PWM o zmiennej częstotliwości i wypełnieniu. Górna częstotliwość wynosi 150kHz, dolna 10kHz. W programie wykorzystuję dwa kanały adc (tj. adc1, adc2) oraz jedno wyjście dla wspomnianej fali (tj. PC5). Atmega8 pracuje z zewnętrznym kwarcem 16MHz. Górna częstotliwość wymaga 106 cykli zegarowych, dolna natomiast...
Witam, Mam problem z ustawieniem SysTick'a na przerwania co 1ms(mam co 3.14ms). Podejrzewam, że mikrokontroler nie chce wystartować na częstotliwości 72MHz, ale nie wiem dlaczego. Program ładnie działał bez żadnego problemu na STM32F103ZET6. W momencie przejścia na STM32F105VBT6 pojawia się wyżej wymieniony problem. Program był napisany w cpp(nadmieniam...
Witam Problem tkwi w tym że nie ma żadnej synchronizacji pomiędzy procesorami US1 i US2. Układ 1 odbiera dane z RS485 i wystawia je na wyjściu portu PC.0 - PC.7. Układ 2 ma je odbierać i w zależności od wartości sterować triakiem. Ale zastanów się co on w rzeczywistości odbiera, przecież dane na porcie PC. US1 mogą być w trakcie aktualizacji, czyli...
Ja wcale nie twierdziłem, że to jest sztywna granica. Właśnie dlatego że twierdziłeś że więcej się nie da: Według moich szacunków, przy częstotliwości taktowania 16MHz, detekcji na jednym zboczu, procedurach napisanych w asemblerze i niezbyt wysokich oczekiwaniach dodatkowych co do pozostałych zadań wykonywanych przez mikrokontroler można osiągnąć...
Jak wielu z was, jestem szczęśliwym posiadaczem LCD od Nokii 6100 :D, z tym że nigdy go jeszcze nie używałem. Tak właściwie nigdy nie używałem żadnego wyświetlacza graficznego, więc obsługę tego traktuję jako wprawkę (chociaż wiem, że większe wyświetlacze mają raczej interfejs równoległy i steruje się nimi np. przy pomocy interfejsu EBI w MCU, a ten...
Witam Dopiero zaczynam przygodę z avr-ami dlatego chciałem się poradzić bardziej doświadczonych kolegów. W programie chciałem odczytać temperatury z 8 czujników KTY podłączonych do ADC. Odczytu dokonuję w przerwaniu, natomiast wyświetlenia i przeliczenia na stopnie Celsjusza chciałem dokonać w main. Niestety wyświetla mi jakieś dziwne wartości. Może...
http://obrazki.elektroda.net/39_12386675... Walentynkowy zegar Zastanawiałem się co by tu zrobić dla mojej połowicy… siedząc w kuchni chciałem sprawdzić która jest aktualnie godzina. Patrzę na elektroniczny zegarek w kuchence i co? Brak godziny, bo akurat przed chwilą niechcący wywaliło mi bezpieczniki. Tak się patrzę i patrzę…...
Częstotliwość wyjściowa wynika z faktu, że odtworzenie jednego okresu z tablicy wymaga wykonania 240 kolejnych odczytów czyli, że: Fwy=Fprzerwań/240 {Rąbnąłem się w pierwszym poście :oops: } A ogólnie: Fwy:=Fprzerwań/N gdzie Fprzerwań - częstotliwość przerwań N - długość tablicy sinusa. Użyta metoda zmiany częstotliwości przerwań dla zmiany Fwy ma pewną...
Nie, , teraz widzę zmiana CS00 na CS01 nie objawia sie zmianą częstotliwości przerwania (powinno być 8x mniej) ;/
I tu dochodzimy niestety do szukania maksimów, lub zmiany częstotliwości wyzwalania przerwania przy krokach dX. Najlepiej jak byś trafiał w końcowe indeksy. Albo przynajmniej bardzo blisko. Samym dX przy takich krokach tego nie zrobisz.
Obsługa przerwania nie ma być "jak najkrótsza", tylko "nie za długa". Odświeżanie wyświetlacza zawsze robi się w przerwaniu, gdyż zajmuje to czasu tyle co nic, a nie zrobienie tego w przerwaniu powodowałoby złe działanie wyświetlacza - nierówną jasność cyfr, zmiany jasności, migotanie, przygasanie itp. To ma być działać ze stałą częstotliwością, a do...
Gratuluję wytrwałości :) Jest jeszcze jedna rzecz, którą będę chciał zrobić - dodać dodatkowy timer, żeby zmienna lesser_delay_counter (flaga przyjmująca 4 stany w zależności od tego co ma być wyświetlone na ekranie "czas, temperatura, cisnienie, hPa") była niezależna od timera wyznaczającego częstotliwość multipleksowania, Jako alternatywę proponuję...
Okazało się, że po zmianie częstotliwości APB2 , przestał mi działać prawidłowo PWM, który steruje układem, który to ten generuje sygnały na wejściach EXTI. Wystarczyła poprawa w konfiguracji PWM, po zmianie częstotliwości APB2. Temat zamykam.
Zacznij od pokazania całego kodu. Jeśli korzystasz z przerwań, to najprawdopodobniej mikrokontroler nie wyrabia i powoduje opóźnienia. Policz sobie (BTW, przy OCR2 = 4, dostajesz 100kHz, popatrz na wzór, należy do OCR2 dodać jeden przed dzieleniem), przy częstotliwości 100kHz, procesor ma 10 taktów na obsłużenie przerwania, co na pewno trwa dłużej,...
Jaka jest aktualna częstotliwość zegara? Jak często uruchamiane jest przerwanie? Ile trwa naciśnięcie przycisku? Musisz zmieniać opcje tylko kiedy przycisk został naciśnięty, nie przytrzymany. Dodaj do przerwania warunek sprawdzający poprzedni stan przycisku. Pomyśl nad wyeliminowaniem delay.
Jak masz wolno-zmienny enkoder (impulsator) to można podpiąć kanały A i B pod wejścia zwykłe. Program: jak jest A i narasta (zbocze) B to funkcja zwiększ rejestr (+1), a jak jest B i narasta (zbocze) A to zmniejsz (funkcja -1) rejestr szybkości krokowej. Można podłączyć pod szybki licznik (wtedy praca w przerwaniach) ale trzeba analizować: czy zawartość...
Fakt, temat dziwaczny. Przykład - zliczanie zbocz w przerwaniu. Kod obsługi przerwania wygenerowany w C vs najprostsza obsługa asemblerowa. Policzyć cykle zegarowe w jednymi drugim przypadku i przeliczyć na dopuszczalną częstotliwość zmian na linii wejściowej przerwania.
Tutaj jest program w C częściowo można coś zobaczyć: https://www.elektroda.pl/rtvforum/viewto... ustawiasz timer1 (drobne zmiany na częstotliwość), w przerwaniu ISR(TIMER1_COMPA_vect) obsługujesz czas. Reszte kodu wyrzucasz. Musisz jeszcze dopisać testowanie czasu w tym przerwaniu, plus jakiś sposób ustawiania czasu. Czas możesz ustawić...
Zatem policz sobie oba czasy, na przykład w µs. Tryb, który użyłeś jest zupełnie sensowny, ma auto reload. Wydaje się, że dla TH0 = 0 maksimum to 256 taktów. Znajdź jakiś wspólny podzielnik dla obu wyliczonych czasów, tak aby dla dłuższego TH0 było mniejsze od 256, wiadomo, że dla krótszego będzie mniejsze. Ten podzielnik (na przykład w µs)...
Jeśli chodzi o ASM i sterowanie to nie trzeba wogóle przerwań, wszystko da sie upchnąć bez problemów na procku z 2ma sprzętowymi PWM na jednym liczniku (chyba ze inne częstotliwości) Licznik działąjący jako PWM potrzebuje tylko zaprogramowania by działać jako generator a pozniej ewentualnie zmieniac zawartość rejestru sterującego. Przerwania nie są...
Sądzę że to niemożliwe do policzenia podczas kompilacji ponieważ w programie może być pętla, a kompilator nie wie ile razy zostanie wykonana. W moim kodzie akurat w tym miejscu nie ma pętli ale są 3 warunki czyli co najmniej 2 bliskie skoki. Czyli też nei wiadomo ile czasu się bedzie wykonywać, bo skok to 3 cykle, a brak skoku to dwa cykle. Może są...
Jednak zmieniała stan 8 razy a nie 4. Miałem nagrany filmik - jak puściłem klatka po klatce i porządnie rano policzyłem to w ciagu sekundy było: 01010101 czyli 4 zapalenia, czyli 8 zmian stanu.
Jak i gdzie masz zdefiniowaną częstotliwość zegara F_CPU?
(at)WX3V To co napisałeś to jakiś zbiór życzeń i dziwnych przemyśleń. Albo dopiero zacząłeś programować, albo do tej pory pisałeś programy w asemblerze. Nie ma nic takiego jaki zachowanie kolejności zmiennych, sortowanie po typie czy innym kryterium. Zagnieżdżenie wstawki asm w funkcji obsługi przerwania jest możliwe i nie ma tutaj wątpliwości. Ale...
Najprościej chyba to zrobić w przerwaniu od jakiegoś timera. W każdym wywołaniu sprawdzasz warunki dla każdego silnika: "jeżeli prędkość_aktualna>prędkość_zadana to prędkość_aktualna+1" "jeżeli prędkość_aktualna<prędkość_zadana to prędkość_aktualna=prędkość_zadana" Potem w tym przerwaniu zamieniasz "Prędkość_aktualna" na odpowiednią wartość PWM...
gmp wrote: Procek obsluguje poprawnie 4xmnijesze czestotliwosci od zegara. Dziwne, ale z dokumentacji wynika coś zupełnie innego. Mikrokontroler poprawnie rozpoznaje zmianę stanu (przy reakcji na zbocze) o ile stan ten trwa dłużej niż jeden cykl zegarowy. Przy czasach krótszych może wykryć albo nie. Pan Arkadiusz Krysiak w swojej książce o AT90S2313...
1. Jeżeli przy braku wysyłania nośnej 36kHz na wyjściu TSOP masz stan wysoki, a podczas wysyłania nośnej masz stan niski to znaczy, że jest OK. 2. W jakim celu tak komplikujesz funkcję przerwania wykonującą zmianę pinu na przeciwny - wykorzystaj ostatni kod z mojego poprzedniego postu. 3. Najważniejsza jest jednak uwaga BlueDraco dot. sensu machania...
(...)Mam jednak pytanie, czy można to zrobić w jakiś inny sposób, aby zmiana tempa zależała tylko od zmiennej speed ? Ten sposób jest jak najbardziej odpowiedni. Mam tu następujące sugestie: - poprawić dokładność ustawiania tempa poprzez zwiększenie częstotliwości przerwań (ustawienie preskalera na 1), - przeliczać zadaną wartość tempa w bpm na wartość...
Potem calosc zestroilbym dodajac nopy i ewentualnie korygujac minimalnie timer Jak czas odmierza timer, to nop nie nadadzą się jako coś do korekcji częstotliwości.[/quote] Nie chodzi mi o korygowanie chwili wystapienia przerwania,lecz o dokladny moment zmiany stanu portu w procedurze obslugi przerwania.
O ile dorze rozumiem idee tego przerwania (nie miałem okazji wykorzystać go w praktyce) to określona zmiana na którymkolwiek pinie z grupy wywołuje przerwanie... i teraz myślałem, żeby za pomocą prostych warunków zliczać, który wywołał i ile w danym czasie. Problem widzę w momencie, gdy przykładowo czujnik A wywoła przerwanie w bardzo krótkim czasie...
Nowa płyta PCB umożliwia korzystanie z jednej jak i drugiej częstotliwości. To tylko mała żonglerka zworkami W sumie to obie częstotliwości dadzą podobne wynik, apteka byłaby jakby ktoś chciał robić z kobry generator serwisowy.... to wówczas będzie trzeba co do Hz ustawiać. Mam fajną procedurę na proste dżingle do programów... np. aby zmiana pozycji...
Istnieją dwie cyfrowe metody pomiaru częstotliwości: 1. Pomiar ilości impulsów wzorcowych w trakcie trwania okresu sygnału mierzonego. Konkretnie mierzymy imp. wzorcowe w trakcie trwania połowy okresu - zwykle, gdy jest poziom wysoki. W takiej sytuacji jeżeli zmierzysz N imp. wzorcowych w trakcie połowy okresu, to: Tx=2*N*Tw, gdzie Tx okres przebiegu...
Na nie możesz policzyć? Chyba że nie wiesz jak :D Masz 8MHz. A przerwanie przychodzi z częstotliwością 125Hz (dlatego trzeba 125 razy odliczyć aby wyszła 1 sekunda). Preskaler Timera 256. 8000000/256/125 = 250. I dlatego jest Load Timer0 = 250 Teraz chcesz kwarca 7372800. Więc musisz tak kombinować aby uzyskać jakąś sensowną liczbę przerwań i sensowny...
Napisał, że program nie działa tak jak chce, ale nie napisał czy w jakikolwiek sposób sprawdził czy układ wykonuje obsługę przerwania. Choćby przez zapalenie LEDa. W podanym przykładzie zmiana częstotliwości nastąpi dopiero po 15 sekundach. Czy autor czeka tyle? A może fusa ma ustawionego na 1Mhz i zmiana nastąpi za 120 sekund? JarekC
Z kąd to ostatnie '0'. ????? Pokaż kod po zmianach.
Wszystko zależy od tego, jak napiszesz program oraz którego z timerów użyjesz. Nie wiem, czy przy 1 Hz (Tu spodziewam się największego błędu), otrzymasz błąd mniejszy niż 10%. Spodziewam się, że tak. Tylko po co ci tak duży zakres zmiany częstotliwości?
Uwaga! 1) Jeżeli zmienną licznik będziesz miał zadeklarowaną wewnątrz funkcji obsługującej przerwanie to przykładowa deklaracja powinna wyglądać tak: static uint8_t licznik = 0; 2) Jeżeli natomiast zmienną licznik zadeklarujesz gdzieś w programie głównym, wtedy powinieneś ją przykładowo zadeklarować jako: volatile uint8_t licznik = 0; po co te "przedrostki"...
Witam dzisiaj usiadłem przy tym drugi sygnale PWM i starałem sie go zrobić według Twoich wskazówek ale cos mi jeszcze nie działa. Zrobilem przerwanie IRQ. int main(void) { #define T0EM0 1 #define T0EMC0_TOGGLE (3<<4) #define T0MCR_Reset_on_MR0 0x2U #define T0TCR_Counter_Reset 0x2U #define T0TCR_Counter_Enable 0x1U #define...
hardwarowo nie da się. Możesz natomiast użyć licznika do generowania sygnału PWM: np na przerwaniu od Timera ustawić ustawianie stanu zerowego na porcie, a w pętli głównej programu ustawić warunek porównujący stan licznika z jakąś stałą i jako warunek wyjsciowy dać ustawianie portu w stan wysoki. Jest to jednak dość karkołomne rozwiązanie, w którym...
Wpisywanie $CRYSTAL bez rzeczywistej zmiany taktowania procesora będzie powodować, że wszelkie opóźnienia i obliczenia kompilatora dotyczące liczników nie będą zgodne ze stanem faktycznym. GETRC5() korzysta aktywnie z licznika TIMER0. Tak manewruje wartością wpisaną do rejestru licznika oraz preskalerem by otrzymać jednakowe odcinki czasu zliczane później...
Twoje procedury obsługi przerwań są stosunkowo długie. Np. ISR(TIMER1_COMPA_vect) trwa ok. 670 taktów zegara. Z kolei odstęp między kolejnymi przerwaniami przy zmiennej okres1=127, jak sam napisałeś, wynosi 8*128=1024 taktów. Jeżeli zmienną okres1 zmniejszysz np. do 80 taktów, to przerwania będą częściej niż trwa ich obsługa, więc niektóre zostaną po...
W kwestii formalnej, ten kod się nazywa kodem Gray'a (od nazwiska Franka Gray'a 1887-1969, pracownika laboratoriów Bella, który go opracował) Co do samego problemu, to - prędkość obrotową wyliczysz z jednego kanału mierząc ilość impulsów w jednostce czasu lub mierząc czas trwania jednego okresu i przeliczając to na obroty (wiadomo ile masz impulsów...
Szkoda, że nie chciałeś się dokładnie zapoznać z data sheet dla xx8xC52... 1. Licznik T2 może zliczać impulsy z wejścia T2 (P1.0), a wejście T2EX (P1.1) może służyć do zmiany kierunku liczenia lub generowania przerwania na opadającym zboczu. T2EX może też być wyjściem sygnału o programowanej częstotliwości. 2. Tak, dostęp do górnych 128 bajtów RAM jest...
Masz źle zrobioną obsługę wyświetlania. Błędnie wyliczone parametry ale też jakiś gruby błąd w realizacji. Częstotliwość odświeżania całości powinna być nie mniejsza niż 120 Hz (tak, wiem, że w książkach piszą 50, 60 albo 80, ale to bzdura - ja zwykle stosuję od 150 do 240). Pomnóż to przez liczbę cyfr wyświetlacza - wyjdzie częstotliwość przerwań....
Której? PLL czy tej z dwoma Timerami? Ta z PLL jest bardzo zamotana (albo inaczej - zamotana nie jest ale wymaga dużej ingerencji procesora. A to bardzo spowalnia program główny więc trzeba to napisać a assemblerze i własnie to powoduje zamotanie). Podam więc ten drugi sposób: $regfile = "M8def.dat" $crystal = 8000000 $hwstack = 64 '---------------------------------------...
Nie znam nowych avrów, ten kod przypomina mi STM32, natomiast w starych była globalna flaga uruchomienia przerwań, sprawdzałeś czy tutaj takiej nie potrzeba? I przez analogię do STM, czy po zmianach częstotliwości zegara, nie trzeba poczekać ileś cykli aż się ustabilizuje? Jak tam prosty przykład? No i przeniósłbym zliczanie minut do przerwania, u siebie...
muszę to zrobić poza przerwaniem, lub w innym miejscu, jeżeli dalej chciałbym zachować taką funkcjonalność - możliwość zmian. Oczywiście że możesz poza przerwaniem. oczywiście z głową. pozatem masz mnóstwo innych timerów.
Tak, ten mój przykład z prostokątem 500Hz jest trochę mylący. 500Hz pochodzi nie z podziału zegara fast pwm ale dowolnego innego a prostokąt odtwarza zmiany wypełnienia. Częstotliwość na wyjściu pwm nie ma większego znaczenia. Myślałem o czymś takim, po inicjalizacji pwm, bez przerwań, 75 i 187 z sufitu: loop: OCR1A=75 delay 1ms OCR1A=187 delay 1ms...
nie wiem w jakim celu są te 2 minusy Operator predekrementacji. Zmniejsza div_1s o jeden. jakiego typu ma być ta zmienna div_1s? volatile? Może być np. unsigned short. Lokalna statyczna w procedurze obsługi przerwania. 50Hz jest wystarczające, aby oko ludzkie, nie wyłapało zmiany. Nie jest wystarczające (no, może dla żarówek... :D ). Jak mam ją zainicjować...
Bardzo przydatny tryb chociaż nazwa jest myląca. Wg mnie nazwa tego trybu powinna brzmieć "buffered CTC". Piszesz, że mozna bitami migać bezpośrednio - niby jak? PIND.0=1 PIND.0=0 i dalej co? RJMP to 2 cykle i nie pozwoli to na wygenerowanie równego przebiegu prostokatnego, a jak zmienić częstotliwość? wstawić NOPy? A programowo? Użycie przerwania to...
Policzyłęm impulsy i wychodzi mi że przy prędkości maksymalnej = 1500 obr/min i 4 impulsa na jeden obrót (tak podaje utor) z każdym obrotem na "wirtualne" wejście układu pomiarowego idzie 100 impulsów czy 100 Hz.=(1500/60)*4. Ganiając procka z maksymalną prędkością błąd pomiaru można zminimalizować bo impulsy na wejściu wewnętrznego licznika są szybciej...
Ja aby byc pewnym czy procek dziala czy nie zrobilbym mruganie dioda na przerwaniu. Dac odliczanie 1 sekundy i wszystko byloby jasne.
A może wyłumaczyć mi ktoś tak jaśniej niż whelpie bascoma ;) co to jest ten prescaler i co on dzieli. Może tak po kolei jak twój program widnieje: 1. Jeżeli PORTB jest przeznaczony do obsługi LCD to nie konfiguruj go w ogóle w stylu jaki podałeś w pierwszym poście. Config Portb = &B11111111 : Portb = &B11111111 ===> źle!!! Może to powodowac zakłócenia...
Obsługa UART jest przerywana TIMEREM i dlatego gubi znaki. Zrób odbiór UARTU na przerwaniach, odbieraj w nim tylko pojedynczy znak i ładuj go do bufora (nie czekaj w tej funcji,aż odbierzesz wszystkie znaki), a po odebraniu końcowego znaku ustawiasz flagę, że skończył. I w pętli głównej dekodujesz sobie na spokojnie tą ramkę. Popróbuj może jeszcze ze...
Zaprogramuj timer na zgłaszanie przerwań z częstotliwością np. 100 Hz. W obłsudze przerwania zrób rozejście wg. bieżącego stanu urządzenia. W obsłudze stanu sprawdć warunek zmiany stanu (np. wciśnięto przycisk) i jeśli on zachhodzi - zmień sterowanie wyjść i zmień stan. W stanie migania ponadto odliczaj przerwania timera i po osiągnięciu jakiejś liczby...
Dzieki za podpowiedź. To HAL miałby taki narzut czasowy ? Identycznie temat wyglądał z bibliotekami standardowymi. Sprawdzę oczywiście. Ale ta sama funkcja wpuszczona w zwykłego "while" generuje przebieg kilka MHz. Nie bawiłem się priorytetami przerwań bo przy takich zegarach (180MHz) chyba raczej nie ma sensu jesli problem jest przy 400kHz. Program...
Oczywiście, że się da. Najładniej wygląda regulacja podświetlenia przez PWM, z płynną zmianą jasności. I tak musisz mieć jakiś timer - zaprogramuj timer na zgłaszania przerwań z częstotliwością np. 200 Hz (to będzie dobre i do PWM), a w przerwaniach odliczaj czas wykonywania różnych czynności, np. gaszenia podświetlenia.
Tak wiem, dotarło to do mnie co napisałem jak już opublikowałem post. Prescaler ustawia tylko częstotliwość występowania przerwań. No tak... przerwanie trwa tylko tyle czasu ile potrzebuje na wykonanie instrukcji... Dobra, to da się to w ogóle jakoś osiągnąć poza zastosowaniem zmiany stanu ^= w przerwaniu? Co konkretnie chcesz osiągnąć?
[syntax=csharp]#include <avr/io.h> #include <avr/interrupt.h> //definicja LED1 (do którego pinu podłączony LED1) #define LED1 PB0 //definicja LED2 (do którego pinu podłączony LED2) #define LED2 PB1 //definicja początkowej wartości timera #define timer_start 6 //zmienna pomocnicza-licznik używana w przerwaniu volatile uint8_t cnt=0; void...
Właśnie na nowo podszedłem do CTC, prawie, że udało mi się opracować. Zanim wypuszczę nową wersję, to mam parę wątpliwości: 1. Czy to prawda, że CA80 tak naprawdę wykorzystuję tylko dwa kanały CTC? Czy dobrze rozumiem, że oba kazały są pobudzane tylko przez pozytywkę w wersji "z CTC", a konkretnie przez generatory o częstotliwości regulowanej potencjometrem?...
Chce mierzyć impulsy z zakresu 10kHz do 120kHz... 89cx051 (at)24MHz + Basic = Ciężka(niemożliwa?) sprawa przy 120kHz. Może w asm dałoby radę , ale Basic :( Zmienił bym także koncepcję/sposób pomiaru , a mianowicie: Sygnał podaję na INT0 i odwrócony(zanegowany) na INT1 , włączam bramkowanie liczników T0 i T1 i niech zliczają cykle maszynowe.T0 liczy...
Ja jestem zdania, ze procek powinien zbierać te dane. Trzymać je w RAMie i co jakiś czas je wysyłać. Właśnie chodzi chyba o to, żeby, żadnych występujących stanów nie gubić... Ewentualnie na wejścia dać przerwanie zmiany stanu i po każdym przerwaniu wysyłać. Zależy od tego jaką czestotliwość próbkowania chcemy osiągnąć
a gdzie tu wpleść PWM który będzie działać z częstotliwością 1kHz?? Ale PWM nie potrzebuje przerwania chyba że chcesz koniecznie programowy. Po to wymyślono PWM sprzętowy żeby własnie takich cudów nie wymyślac. A zabierze on 0.0001% czasu procesora łącznie uz uaktualnianiem co 0.2s. Jak chcesz umiescic w przerwaniu 0.16s to nawet 3 atmegi64 sobie nie...
Jak przeliczysz sobie sygnał sterujacy to potem tylko prostym równaniem ustalasz czas przerwania. I program wchodzi w pętlę naprzemiennie, właczając, czekajac i wyłączajac, czekając. Co powiedzmy sekundę powinien sprawdzić czy sygnał sterujacy uległ zmianie.
Podłącze się do tematu gdyż nie chcę zakładać nowego wątku. Mam timer (ATMEGA32) ustawiony w taki sposób [syntax=c]TCCR0 |= (1<<WGM01); TCCR0 |= (1<<CS02) ; OCR0 |=38; TIMSK |= (1<<OCIE0);[/syntax] Procedura obsługi przerwania zawiera funkcje komunikacyjne i zwiększa licznik. Problem polega na tym, że z wzoru podanego w nocie katalogowej...
Proponujecie zmianę platformy, wymianę procesora. Ja tymczasem chciałem dowiedzieć się zupełnie czegoś innego. Głownie chodzi o oszczędne generatory pracujące z małymi częstotliwościami. P.S. Tak, używam 2313A.
Przydałby się oscyloskop, lub wejście karty dźwiękowej, aby zobaczyć czy jest to stabilna częstotliwość. Czas między zmianami stanu to czasy pobierania kolejnych próbek. Jeżeli częstotliwość będzie zależała od wartości napięcia na ADC to jest to do niczego i trzeba zrobić "jak należy" czyli wyzwalanie pobierania próbek przez przerwanie od timera. Wtedy...
Czyli są to niemalże tak samo funkcyjnie przerwania jak INTy z tym że różnica polega na tym że nie można ustalać sobie czy ma być reakcja na zborze rosnące, opadające czy na stan niski? Dobrze rozumiem? Jeszcze odnośnie pierwszej częsci pytania: W każdym Datasheet znajdziesz rozdział: "Typical Characteristics", w którym są wyrażnie i dostatecznie omówione...
Przecież diody sterowane w pętli głównej nie mają zmieniać stanu co 1000 ms, tylko po odczekaniu 1000 ms od ostatniej zmiany. To opóźnienie nie uwzględnia innych czynności wykonywanych przez procesor, np. obsługi przerwań timera. Przy preskalerze 256 okres zgłaszania przerwania byłby zbliżony do 1s przy częstotliwości oscylatora 8.78 MHz.
Wydaje mi sie , że ... Twój projekt ma chyba coś wspólnego z samochodem hmmm...:?: Zgadza się. Gdybyś zliczał impulsy kierując się stanem pinu , wyszły by Ci herezje. Trzeba programowo zliczać zmianę stanu pinu z np. "1" na "0" lub na odwrót. Tak właśnie napisałem "sprawdzanie czy nie pojawił się impuls", czyli wykrycie zmiany stanu, problem jeśli...
Witam, Na początek przestawię kod konfiguracji timera: [syntax=csharp] LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 9); LPC_TMR32B0->TCR = 0x02; LPC_TMR32B0->PR = (SystemCoreClock/1000000) - 1; LPC_TMR32B0->MR0 = 1; LPC_TMR32B0->MR2 = PI_MAX_PERIOD; LPC_TMR32B0->MCR = (1 << 0) | (1 << 1) | (1 << 3) | (1 << 4)/*...
Ach, tak nie można robić. Nie dość, że zmienne współdzielone pomiędzy przerwaniem i programem głównym nie są modyfikowane atomowo, to jeszcze są modyfikowane i w programie głównym i w przerwaniu. Musisz się zdecydować. Po drugie, ta kolejność zmiany, która podałeś to występuje w programie rzeczywistym, czy na symulacji? A jeżeli na normalym procku,...
Witam! Chciałem wykorzystać timer0 do dokładnego odmierzania czasu, jednak coś powoduje zawieszenie całego programu. Dzieje się tak gdy próbuję odczytać wartość zmiennej w obsłudze przerwania lub w pętli głównej programu. Przerwania od timera są na pewno obsługiwane ponieważ działa zmiana stanu portu w obsłudze przerwania. Kod wygląda następująco: //ZMIENNE...
Witam, na potrzeby większego projektu testuje zliczanie impulsów z czujnika szczelinowego jak poniżej: https://obrazki.elektroda.pl/9434569400_... Chcę zliczać impulsy z dwóch czujników. Wykorzystuje do tego przerwania zewnętrzne INT0 i INT1, podłączając wyjścia sygnału z czujników odpowiednio do pinów PD2 i PD3. Przerwania ustawione...
Kod funkcji włączania i wyłączania np. diody Ten kod będzie powodował, że po pełnym zapaleniu dioda z powrotem zgaśnie i zacznie się rozjaśniać. Linijka z ifem nic nie robi, bo wartość byte nie może być mniejsza od zera ani większa od 255. Poza tym po wciśnięciu przycisku będzie dodawana nowa funkcja przerwania onLamp() bez usuwania starej i będą ze...
To nawet na oko widać że odczyt idzie 2x na sekundę zamiast 1x. To pytanie jaką zapodałeś czestotliwość? 1Hz? Wcześniej pisałeś o 10Hz. Dodatkowo wyniku nie buforujesz w żaden sposób, a jest to int - czyli wartość tej zmiennej (jej bajtów składowych) może ulec zmianie w przerwaniu podczas trwania funkcji pirintf. Ba ustawiając że jest ona volatile...
Zawsze w takim przypadku możesz migać jakimś LEDem i zobaczyć czy po odliczeniu 168000000 (przez preskaler, licznik) miga Ci co 1 sek. Np. używając przerwania z tego licznika do zmiany stanu. Ja tak robię w takich sytuacjach aby nie zawracać głowy na forum:)
zmiana częstotliwości pilota zmiana częstotliwości monitora zmiana częstotliwości pamięci
antena dookolny kierunkowy sygnał telefoniczny obrotomierz berlingo
najlepszy multimetr niegasnące światła stopu
Napięcia zasilania i poziomy logiczne kart SD Urwany przewód anteny w dekoderze LTC LXT203 - naprawa