:D Ale nadal mnie nurtuje dlaczego przy takim programie i włączonym wewnętrznym pull-up generuje Ci się przerwanie, pomimo stanu wysokiego na wejściu INT1. Co tam masz podłączone?
Dokumentacja mówi WYRAŹNIE: najpierw należy ładować wartość do TCNT1H (który zostaje zapisany do rejestru TEMP), a dopiero potem do TCNT1L, co pociąga za sobą wpisanie do TCNT1 aktualnej części jako dół i wartości TEMP jako góra (przy odczycie najpierw należy odczytać dół, potem górę). Ciągu skutków powodujących takie zachowanie a inne nie chce mi się...
Nie za bardzo rozumiem o jakich przerwaniach piszesz. Slave SPI (abstrahując od przerwan błędów itd) ma przerwanie wtedy kiedy rejestr wysyłki jest pusty albo kiedy coś otrzymał (pominę kwestię fifo). Jeżeli jest to przerwanie od pustego rejestru TX to może tam wpisać dane, która zostanie wysłana przy następnej transmisji mastera. Jeżeli jest to od...
Wywal opóźnienie z przerwania. Po za tym wygaszaj kolumny za każdym razem jak wchodzisz w przerwanie.
No i właśnie o to pytam czy świeci start , jeśli nie to zacznij od sprawdzenia wyłącznika
Tak to raczej diody nie zaświecisz: #define LED_ON PORTB&=LED_PIN Zapomniałeś o jednym znaczku... ;) Zapewne też podłączyłeś diodę pomiędzy wyjście i masę, więc instrukcja, ktra iała ją gasić, obecnie ją zapala, a ta, która miała zapalać, nie robi nic.
A jaki konkretniej problem masz? Nie możesz włączyć timera, pogubiłeś się w rejestrach i bitach...?
Kwarc 16MHz pewnie ma dokładność rzędu 50ppm. Czy to dużo czy mało to sam musisz zdecydować. Da się znaleźć specjalne rezonatory o mniejszej tolerancji. 20 albo 10ppm. Opóźnienie w przerwaniu nie ma znaczenia jak obsługa przerwania będzie dobrze napisana. Po protu powstanie wtedy przesunięcie fazy. Ale to przesuniecie będzie stałe. Dodatkowo w mojej...
Powód jest bardzo prosty: zmniejszenie zmiennej w pamięci nie jest operacją atomową. Co prawda za każdym razem następuje odczytanie zmiennej, zmniejszenie jej a następnie zapis, to jeśli przerwanie wystąpi pomiędzy odczytem a zapisem, to utracisz zmianę dokonaną w przerwaniu. W przypadku gdy przerwanie i funkcja main konkurują o jeden zasób, musisz...
[syntax=C]void SysTick_Handler(){ SysTick_Config(prescaler_systic);[/synta... W jakim celu w obsłudze przerwania od SysTick, ponownie konfigurujesz licznik? Logika podpowiada, że raz uruchomiony działa i nie trzeba nic więcej robić. Jeżeli po odliczeniu czasu, przyjmujesz przerwanie, przechodzisz do ustawiania i na nowo startujesz licznik, to częstotliwość...
Równolegle z przyciskiem podłącz kondensator 100nF. Jak nie pomoże to większy. W procedurze obsługi przerwania możesz dać opóźnienie kilka - kilkanaście ms, też pomaga, ale jeśli nie może to być zrobione w ten sposób to tylko kondensator + wymiana przycisku na jakiś lepszy. Wszystkie te sposoby można łączyć ;)
arm.com: Cortex-M4 Technical Reference Manual ARMv7-M Architecture Reference Manual Co do timera: prawdopodobnie chodzi o opóźnienie kasowania zgłoszenia przerwania. Jeśli skasujesz pod koniec procedury, to po jej zakończeniu znacznik będzie jeszcze ustawiony i spowoduje powtórne zgłoszenie przerwania. Do sterowania NVIC proponowałbym jednak użyć pseudofunkcji...
Przerwanie jest zgłaszane, gdy zostanie odebrany bajt. Wywal przynajmniej jedno z porównań z 13. Przecież jeśli jest równe 13 to nei ma sensu sprawdzać, czy jest różne od 13. Stare przysłowie pszczół, które cytuję to co 3 dni: żadnego oczekiwania w obsłudze przerwania. Wyrzuć Waitms 100 z obsługi przerwania! Nie możesz również nic nadawać w obsłudze...
Zamiast robić tam opóźnienie można policzyć ile taktów zajmie uartowi wysłanie ostatniej ramki i robić sobie inne potrzebne operacje ,które zajmują czas a po odpowiedniej ich liczbie zmienić stan porty i tyle . Asembler daje wiele możliwości wykorzystania czegoś co się nazywa opóźnieniem . A jak masz wolny licznik to można na nim zrealizować opóźnienie...
Chciałbym jeszcze coś dodać, bo moim zdaniem zapotrzebowanie na RAM to nie jedyny problem w przypadku zagnieżdżania przerwań. Nie znamy programu, więc trudno przewidzieć, czy sprawa dotyczy tego konkretnego przypadku. W przypadku zagnieżdżania przerwań należy jednak pamiętać o pewnych zasadach. Procedury obsługi przerwań, które ustawiają globalną flagę...
To nie jest proces, to jest tylko informacja ile czasu jądro poświęca na przerwania sprzętowe i opóźnione wywołania procedur (DPC). Musi być i się tego nie pozbędziesz, aktualne zużycie czasu procesora jest jak najbardziej w normie.
Kolejne nie zostanie obsłużone, jeśli wejście to przerwania blokuje przerwania, lub zostanie ponownie wywołane w trakcie obsługi poprzedniego jeśli obsługa przerwań w obsłudze przerwań nie jest zablokowana. Jeśli przerwania są zablokowane w obsłudze przerwania, a obsługa trwać będzie dłużej niż ponowne zgłoszenie. To natychmiast po wyjściu z przerwania...
Każde przerwanie ma związaną z nim flagę. Dopóki nie doprowadzisz do sytuacji, w której kolejne, takie samo przerwanie, nie nadejdzie przed obsługą poprzedniego, to żadne nie zostanie zgubione. Po prostu obsługa przerwania się nieco opóźni, co ew. trzeba uwzględniać, jeśli masz sekcje krytyczne czasowo.
Ja proponuję po prostu pobierać czas bezposrednio z przerwania 21h. Albo użyć timera ;) (LUBIMY '51:D ) Nie pamietam akurat numeru funkcji, ale chwilka kopania w dokumentacji i sie znajdzie. A tak ostatecznie, to mozna uzyc instrukcji pobierania cykli zegara od startu kompa. Trzeba tylko pobrac "próbkę" i później tym mierzyć czas.
Ogólnie nie cierpię AVR'ów ! no ale... W przerwaniu jest błąd. INTERRUPT1: RJMP STOP Używasz polecenia RJMP (skok w pierwszej linii przerwania do etykiety a nie do procedury STOP ) a na końcu RET (czyli powrót z procedury ->w Twoim przypadku program leci "w kosmos"). Lepiej wpisz tam RCALL, albo wpisz cały kod w przerwaniu. Ale po co opóźnienia...
Proponuję do wykrywania dźwięku użyć przerwania zewnętrznego to zminimalizuje opóźnienie. Teraz program w pętli czyta ADC i sprawdza stan pinb.1 co nie jest optymalnym rozwiązaniem w tym przypadku.
Odniosłem sie do tego że OT przerwanie ustawił co 1ms i zlicza w nim do 20ms. Wiem, też to zauważyłem, pisałem bardziej ogólnie, ale masz racje, niepotrzebnie 'młóci' to przerwanie co 1 ms chyba że jeszcze coś będzie odmierzał. To raz a dwa to w pętli głównej bym odliczał te 20ms i od razu czytał klawiaturę a nie w przerwaniu, tam niech sobie tylko...
a _delay_ms i _delay_us Ci nie wystarcza ? Do opóźnień nie trzeba wykorzystywać koniecznie przerwań timera. Można wykorzystać flagi timera (o ile się da, ale wszystko zależy). Poza tym, zmienna deb w Twoim programie zapewne nie jest volatile, ale wrzuciłeś nam NIC, także pomoc też nijaka
No, tak, teraz widać, że LED ściemnia Ci się "w drugą stronę". Mały egzamin (dwa pierwsze pytania dotyczą Twojego układu): 1. Jaki sygnał wyzwala triaka? 2. Jaki sygnał zapala diodę? 3. Na jakiej zasadzie działa sterowanie fazowe? Triaka wyzwala stan wysoki na PC0. Celowo napisałem "wyzwala" nie włącza, ponieważ triaka się nie da wyłączyć (w przeciwieństwie...
Twój program mierzy czas od początku obsługi właściwego kodu w przerwaniu do jego całkowitego zakończenia przerwania (do momentu powrotu do programu głównego). Powodem jest złe umiejscowienie ustalania wartości zmiennej mark[0] tak jak mówi Dr.Vee. Wartość 49 w tym jednym konkretny przypadku jednak będzie dość dokładna bo mark[0] mimo że nie ustawiane...
Ważna zasada brzmi: nie stosuj opóźnienia w obsłudze przerwania bo uc będzie się restartował. Radzę to zapamiętać. Proponuję abyś w obsłudze przerwania umieścił flagę ktora będzie informacją że przerwanie zostało wywołane i na jej podstawie wykonywał operacje w pętli głównej.
Mając laser możesz użyć małych luster i odbić wielokrotnie promień lasera by w końca trafił na fotoelement. Trudniejsze jest wtedy ustawienie lasera ale zmniejsz się ilość elementów oraz można użyć wejść cyfrowych. Przy takich programach na arduino trzeba pamiętać albo o krótkim czasie wykonania pętli pomiarowych (tak by możliwie często sprawdzać stan...
Witam, problem polega na tym że urządzenie "wysypuje" sie w momencie generowania przerwań na INT0 Zasada działąnia jest tak że po zliczeniu odpowiedniej ilosci impulsów z into 0 załączany jest przekaźnik i zwiekszany jest stan licznika. Przekaźnik wyłaczany jest w przerwaniu TIMER_INT (po określonym czasie). Stan licznika można tez zmieniac za pomocą...
Minimalna częstotliwość odświeżania to ~100Hz. Jeżeli jest mniejsza, to cyfry "pływają" kiedy na nie patrzysz lub kiedy ruszasz głową. W praktyce przyjmuje się typowo ~250Hz, co dla 4 cyfr oznacza konieczność generowania przerwań z częstotliwością ~1000Hz. Więcej nie trzeba, ponieważ zajmujesz procesor obsługą przerwań, a nie daje to żadnego zysku na...
Na Timerze. W przerwaniu od INTx ustawiasz wartość początkową Timera i uruchamiasz go. A w przerwaniu od Timera ustawiasz/kasujesz pin wyjściowy.
Bezwzględnie wyrzuć to opóźnienie z przerwania! Ono ma być krótkie! Ustawiaj sobie tylko jakąś flage a w programie głównym kasuj.
No, nie zupełnie. Kiedy kończy się półokres, pojawia się zbocze narastające na INT, a moment póżniej sieć przechodzi przez zero. Ciężko oszacować ile wynosi ten "moment", ale jeżeli nie zdążysz wyłączyć sygnału triaka (obsługa przerwania się opóźni itp.) zanim sieć przejdzie przez zero, to triak włączy się ponownie i pozostanie włączony przez cały następny...
Bardziej zależy mi na pragramach.
Po co Ci tak funkcja czekaj() Może jest tak, że czas wykonanie tej funkcji jest większy od czasu pomiędzy przerwaniami?? Wywal tą funkcje. Przecież opóźnienie realizujesz na przerwaniu.
Pamiętaj że sama transmisja też swoje trwa :) a poza tym nie pokazałeś funkcji printf (może ona bawi się w _delay_ms() ?) Zauważ również że przerwanie występuje niezależnie od transmisji, może dochodzić do takiej sytuacji ze raz przerwanie zmienić Ci wartość zmiennej tuż przed transmisją a raz tuż po niej i to spowoduje Twoje opóźnienia. Spróbuj blokować...
col<<=1 o to mu zapewne chodzi. nop wystarczy a większe opóźnienie jak już daj w innym miejscu. Ja te klawiatury obsługuje w przerwaniu, więc to inna historia
Ale my mówimy o urządzeniu jednofazowym. Nie? jeśli na różnicowce trojfazowej zrobimy (at)kortyleski Zwykle nie stosuje się specjalnych RCD z opóźnionym przerwaniem toru N. Normy przewidują, że rozłączenie tego toru musi zajść przed lub równocześnie z torami fazowymi. Zwykle jest właśnie równocześnie, a że sam czas przełączenia jest bardzo mały, a...
Dzięki kordirko za info! kondensatory mam SMD i różne dawałem, kwarc też podmieniałem, ten sam procek w drugim układzie chodzi poprawnie, ścieżki też są bardzo krótkie. Problem w zasadzie rozwiązał się jak przylutowałem rezonator z trzema wyprowadzeniami czyli piki ma w środku niestety nie posiadam takich rezonatorów o odpowiedniej częstotliwości. To...
To proste rozwiązanie. Jak przerwanie może być wywołane nie częściej niż raz na sekundę to na samym końcu przerwania daj opóźnienie 1s i po sprawie).
Wystarczy jedno wejście I NTx , które będzie wykrywało ten impuls. Ale jeśli to będzie impuls "z ręki" jakiś klawisz to bez sensu - ze względu na drgania styków a potrzebny minimalny czas np 1ms. Jeśli to będzie impuls z jakiegoś wyjścia cyfrowego to ok. Założenia: - wykorzystamy tylko jedno wejście INTx - wykorzystamy tylko jeden Timer sprzętowy Przygotować...
pomiędzy włączeniem licznika a kasowaniem flagi przerwań miałem opóźnienie, które powinno spowodować to że zdążą sie wpisać nowe wartości do rejestrów. Mógłbyś pokazać ten kod z opóźnieniem o którym piszesz?
Witam mam takiego problema : Używam licznika Timer0 do generowania przerwań tzn. Config Timer0 = Timer , Prescale = 8 On Timer0 Generuj Enable Timer0 Enable Interrupts Load Timer0 , 100 Do ... ... ... Loop Generuj: Load timet0, 100 toggle porta.1 Return I tu się pojawia problem mianowicie mam kwarc 8MHz czyli 8000000/8=1000000 i 1000000/100=10000Hz...
hmmm Przede wszystkim: Enable Interrupts On Timer0 Przerwanie Stop Watchdog Config Timer0 = Timer , Prescale = 1024 Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 256 'PWM=250Hz Load Timer0 = 195 To włączenie przerwania jest wstrętne w tym miejscu:P Co do wniosków... może spróbuj zwiększyć stos o...
W tym uP masz zegar czasu (TIC), możesz go wykorzystać do odliczenia opóźnienia (nawet w przerwaniu), zamiast liczyć cykle maszynowe. Dodatkowo ten procek jest jednotaktowy więc jeden takt zegara to jeden cykl maszynowy. Co do tego ,że pętla "while" liczy inaczej od "for" to wszystko zależy od kompilatora, musiałbyś zobaczyć kod w ASM żeby to wszystko...
....... panie autor.... zastanów się, nad tym co się dzieje na twoim wejściu INT ??? Przerwanie sobie jakoś tam zainicjalizowałeś i ok, ale co masz na wejściu ??? bo wg mnie - trzeci stan Hi-Z. Czyli napięcie ci pływa - brak podciągania .... i dziwisz się, że przerwanie jest wciąż wyzwalane nawet bez naciskania przycisku? ..... Podciągnij wejście albo...
nie dość, że w przerwaniu dajesz opóźnienia waitms o czym wspomniał kolega powyżej - to jeszcze wyświetlasz coś w przerwaniu na LCD a to już msakra. do tego wszystkiego daj nie tylko dyrektywę informującą jaki zegar ale co najważniejsze dyrektywy ustawiające stos sprzętowy i programowy - dodatkowo zmień wtedy ich wartości na większe niż domyślne bo...
Program się zawiesi bo na czas zapisu program jest zatrzymywany w pętli oczekującej na zakończenie zapisu (tak robi BASCOM a domyślam się że mówisz o BASCOMowej funkcji zapisującej a nie jakiejś własnej). Kolejne przerwania od Timera będą wywoływane tuż po poprzednim a więc program główny będzie praktycznie stał w miejscu. O zajeżdżaniu pamięci EEPROM...
Bo z -O0 na końcu przerwania jest jeszcze kilka instrukcji które dają wystarczające opóźnienie. 4\/3!!
Panowie wydaje mi się, że właśnie w takim przypadku użycie volatile jest KONICZNE i to zdecydowanie, ponieważ to właśnie tylko w funkcjach a w zasadzie TYLKO w funkcjach zawierających pętle nieskończone bez możliwości ich przerwania dochodzi do buforowania zmiennych Nie jest to prawdą: Poczekaj poczekaj, może nie jest to prawdą jak napisałeś, ale opóźniony...
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...
Kiepsko znam angielski ale z tego co widzę to wydaje mi się ze rejestry TIMSK i TCCR0 odpowiedzialne sa za ustawienia licznika a ja nie używam licznika. Opóźnienie w przerwaniu służy likwidacji drgania styków gdy go nie ma to przerwanie wywołuje sie w momencie wciskania przycisku i w momencie jego puszczania. volatile - pomogło i jest teraz ok dzieki...
Może kwarc jest uszkodzony? (model China Export :wink:) Spójrz na to tak. Spóźnianie się rzędu kilku minut na godzinę to ok. 10% różnicy. Opóźnienie obsługi przerwań nie wchodzi w grę - musiałoby by być rzędu 100ms, a to nie jest możliwe. Oczywiście, można całkiem wyeliminować wpływ opóźnienia obsługi przerwań przez użycie timera 1 w trybie CTC. Ale...
A jak masz 10 przycisków wykorzystasz 10 przerwań? marnotrawstwo. wykorzystasz jeden licznik i po kłopocie zero opóźnień typu delay. Same zalety. minus? jeden: wykorzystany licznik.
Toż to najgorsza możliwa rzecz - opóźnienie w przerwaniu! To zbrodnia dla programu! Jak się to robi profesjonalnie? Np. tak: W każdym przerwaniu sprawdzam stan przycisku, jeśli jest wciśnięty to liczę liczbę przerwań podczas których jest wciśnięty, jeśli jest puszczony to tę liczbę zeruję. Jeśli liczba przekroczy zadaną ilość (~czas drgań) to wykonuję...
Ależ on to ma na timerze chyba, ta flaga flag_timer2, to jest pewnie globalna dla przerwania i funkcji.
"Zbyt dużo" - to może być 200 linii, ale nie 10 czy dwie, jak w Twoim przypadku. Ja bym raczej radził nie pakować kodu do pętli głównej, o ile potrafisz zrobić obsługę DS18xx w przerwaniu.
Pod koniec programu masz: Reset flagi przerwania. Opóźnienie 70ms. Jesteś pewien że w tym czasie nie pojawi się natępne przerwanie? Już nic nie generujesz- ale ile trwa wygaszanie impulsów odbitych?
No tak, czeski błąd. Zmyliło mnie to że na 123 też robili generatory. Z niego można wziąć sygnał przerwania-jak napisał szelus-zboczem opadającym. Faktycznie, jak jest taśma to z wyjść 42. Z tym że czas propagacji 93 jest 10-70 ns, 42 10-30 -razem może być 20-100 ns. Trzeba sprawdzić czas reakcji atmela na przerwanie. Jak za szybko zareaguje to da odczyt...
Proponuję zrezygnować z opóźnienia w przerwaniu i pętli for również. Proponuję zrobić coś tego typu: unsigned char i=0; ISR(TIMER0_OVF_vect) { PORTD=0xFF; //wygaszenie wyswietlaczy if(i >= 4) {i=0;} switch(i) { case 3: LED_MATRIX = ~cyfry[liczba/1000]; SEGMENTS &= ~T4; break; case 2: LED_MATRIX...
Szybkie liczniki i PTO są obsługiwane przez sprzęt, więc jeśli używasz technologii z pozycjonowaniem to odbywa się ono poza programem. Z programu wydajesz tylko komendy. Co do dokładności zliczania, w pierwszej kolejności sprawdź i zmniejsz opóźnienie filtrowania wejścia, którego używasz do pomiaru (we właściwościach tego wejścia z konfiguracji sprzętowej).
No to kawa na ławę. Instrukcja Getrc5 w czasie działania używa jest licznika TIMER0 i związanego z nim przerwania. Licznik ten jest służy do generacji wymaganych opóźnień podczas próbkowania sygnału. TIMER0 może być dalej używany przez program, lecz należy się liczyć z wynikłymi opóźnieniami, gdy wykonywana będzie funkcja GETRC5(). Jest tylko jeden...
Dziękuje wszystkim za pomoc. Umiem już sam napisać opóźnienie, jeszcze nie najlepiej opanowałem przerwania lecz jestem na dobrej drodze :)
Przede wszystkim PCINT wymaga większego nakładu programowego. Przy włączonych wielu źródłach danego przerwania PCINT trzeba analizować, który pin zgłosił przerwanie i w jaki sposób się to odbyło (które zbocze). PCINT jest niżej w hierarchii przerwań, zatem na obsługę tego przerwania trzeba czasem dłużej poczekać (w zależności od konstrukcji programu)...
Co do odmierzania czasu to możesz to zrobić na wiele sposobów. W normalnych pętlach albo klawiaturę obsługiwać w przerwaniu, wtedy opóźnienie definiuje to przerwanie i nie angażuje zbytnio procesora. A z drugiej strony to poszukaj na forum, sam tu umieszczałem program obsługi klawiatury matrycowej.
Wymagane opóźnienie zależy głównie od tego, na ile może być opóźniona obsługa tego przerwania, czyli ile maksymalnie SLAVE spędza czasu z zablokowanymi przerwaniami (w pętli głownej i w pozostałych przerwaniach). Wykonanie opisnego algorytmu (przerwania) przez SLAVE-a zajmie pojedyncze mikrosekundy. Pierwsze opóźnienie w funkcji clock() może być zdecydowanie...
w biosie normal=spp firma oki nie zaleca portu ecp w windows w ustawieniach portu (jeśli masz taką opcje)wybierz "zawsze używaj przerwania"
Nie można pewnie dlatego, ze mamy tam pętlę oczekującą na zakończenie czegoś, a więc realizującą poniekąd opóźnienie, a złota zasada mówi - 0 opóźnień w przerwaniach :D
A na jakim to jest procku? ATMEGA czy ATTINY? Dużo zależy od czystości sygnału i jego amplitudy. Zliczanie można zrealizować na przerwaniu INT0 ale wczśniej dobrze aby sygnał przepuścić przez komparator aby ukształtować ładny prostokąc, można też wykorzystać wbudowany w procek komparator analogowy.
Kod raczej mało skomplikowany - program główny to kilka pętli do losowej jasności diody i włączania cewki od ruchomości płomienia z opóźnieniami . Być może są tam błędy ale działa wg oczekiwań nie ma to żadnego wpływu na mój problem. Uruchamiany jeśli wykonuj == true. To czy program ma się wykonywać uzależnione od wartości w przerwaniu. Opóźnienia w...
Informacja o czasie cyklu w diagnostyce jest bardzo zgrubna. W przerwaniu można ustawiać wyjście bezpośrednio (używając odpowiedniego obszaru wyjść -> PQ a nie Q) nie czekając na zakończenie cyklu (czyli zniknie opóźnienie związana z przetwarzaniem). Tyle tylko, że wtedy trzeba by zmodyfikować Twój program tak, żeby każde przełączenie wyjścia było wykonywane...
Wszystko głupieje bo wyłączasz przerwania ;)
... po coś chyba jest ten PIN int0, int1 To w jaki sposób wykorzystujesz przerwanie zależy tylko od Ciebie. Dlatego już pisałem, że możesz nawet dać opóźnienie programowe w funkcji przerwania, tak jak zrobiłeś, tylko musisz znać tego konsekwencje. Jeżeli więc konsekwencje akceptujesz, to tak działaj ... młotek można wykorzystać nie tylko do robienia...
1. Po co opóźnienie na ustanie drgań styków jeżeli przerwanie już się wykonuje? Nic Ci to opóźnienie nie daje a tylko strasznie wydłuża wykonanie procedury przerwania. 2. Jeżeli już masz to opóźnienie to po nim powinno być ponowne sprawdzenie pinu PD2 które określi czy na pewno nastąpiła zmiana stanu na pinie. Na Twoim miejscu w obsłudze przerwania...
Przerwanie Co4ms psuje Ci działanie tego. Timer1 pracuje z preskalerem równym 256 i można go przeładowywać programowo, ale tylko gdyby chodził sam, a tutaj tak nie jest. Jeżeli przerwanie Co4ms wystąpi tuż przed przepełnieniem się Timera1, to obsługa przerwania Co4ms opóźni wykonanie się przerwania od Timera1 o więcej niż 256 cykli procesora i będziesz...
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...
To moja propozycja pomoże. Jest tylko kwestia drgań styków oraz zakłóceń. Przycisk powinien być sprawdzany w przerwaniu timera co np 50ms. W obecnej wersji możesz dodać niewielkie opóźnienie po wyłączeniu zgrzewarki i buzzera a sprawdzeniem pinu.
Debouncing w przerwaniu - tylko nie mów, że robisz to przez aktywne oczekiwanie wewnątrz przerwania. Jeśli tak, to zauważ, że to, że skasowałeś flagę przerwania i jesteś w przerwaniu wcale nie oznacza, że flaga nie może zostać ustawiona ponownie. Możliwy jest taki scenariusz: wciskasz przycisk, pojawia się zbocze opadające które ustawia flagę a więc...
Typowe wyrwanie z kontekstu... Przecież piszę o delayach w przerwaniu: Funkcja przerwania powinna być tak krótka jak się tylko da... wywal te delay'e... w tym układzie nic Ci nie daje to opóźnienie. Edit: Damy radę z tym nickiem ;]
A w ogóle spróbowałeś tak zrobić, jak napisałem? Czy z góry założyłeś, że nie mam racji? zauważ, że blokada INT0 wystąpi w przerwaniu tylko wtedy, gdy odczytany zostanie kod inny niż 0xFF No właśnie o tym piszę. Jeśli przycisk był wciśnięty w momencie wykonywania instrukcji GIMSK |= (1<<INT0); i przytrzymany dłużej niż opóźnienie 50ms w procedurze...
Moim zdaniem zamiast tych skomplikowanych wygibasów lepiej jest po prostu zrealizować takt 1 ms (ewentualnie, ze względu na lepszą rozdzielczość 1000 µs), można sobie twórczo zmodyfikować przykład pod tytułem "blink without delay". Jeżeli czas pomiędzy odczytami ma być odmierzany bardzo dokładnie można wyzwalanie odczytu zrealizować w przerwaniu...
Nie wiem jak to dokładnie wygląda w GE ale w Siemensie są różne OB - jeden z nich jest odpowiedzialny za przerwania cykliczne (cyclic interrupts) - podejrzewam, że w GE jest coś podobnego - wystarczy ustawić odpowiedni czas wywołania przerwania
Po 1) użyj znaczników [code]... Po 2) funkcje inline _delay_us i _delay_ms muszą być wywoływane z argumentami o wartości znanej w trakcie kompilacji (stałe) - było o tym wielokrotnie na forum. [url=http://www.nongnu.org/avr-libc/user... Po 3) co do inline asm to zobacz [url=http://www.nongnu.org/avr-libc/user...
Opóźnienie dałem aby sprawdzić czy jest przerwanie. Finalnie ma po przerwaniu zapalić się.
RTC zegar czasu rzeczywistego np. PCF8573
O masakra. Kto Cię kolego uczył tak pisać obsługę przerwania ? Opóźnienia w obsłudze przerwania ? , Bitwait ? Nie mam więcej pytań Wysoki Sądzie :)
//wlaczenie opoznienia FLASH FLASH ->ACR |= (FLASH_ACR_LATENCY_1); Dla częstotliwości 72 MHz, żeby pamięć Flash działała musisz ustawić jej dwa cykle opóźnienia a nie jeden.
Jedna uwaga tak na marginesie. Chyba wiem z jakiej książki korzystał kosmo90 i niestety jest tam błąd. Instrukcja Load Timer ma odrobinę inną składnię. Powinno być: Load Timer0, 250 czyli przecinek a nie znak =. Można ewentualnie napisać Timer0 = 5 co da taki sam efekt. A co do sposobu ładowania Timera to w pełni podzielam zdanie M.S. Taki trick poprawi...
To nie rób na opóźnieniach. Najlepiej w ogóle o nich zapomnij. Użyj milis. Czyli nadal możesz użyć przerwań np. na obu zboczach i porównaj czas między nimi ustaw flagę jeśli czas wynosi np 300ms i więcej nic w przerwaniu nie rób. Następnie w pętli głównej sprawdź czy flaga ustawiona wykonaj działanie i wyzeruj flagę.
> stoowa Twoje kłopoty powodują 3 ostatnie linijki w pętli while czyli obsługa LCD. W ciele funkcji obsługujących lcd na pewno sa instrukcje blokowania przerwań na czas transmisji danych do lcd. Powoduje to pomijanie wywołań przerwań a co za tym idzie zegarek będzie się spóźniał. Chcemy skrócić czas do następnego przerwania o czas opóźnienia obsługi...
Czołem. Piec gitarowy ma 4 przyciski do przełączania brzmienia. Wlutowałem się w obwody przycisków i wyprowadziłem je do przycisków w kontrolerze na podłodze, naciskane stopą, taki footswitch. Wszystko fajnie działa, przełącza brzmienia. Problem jest taki, że brzmienie jest przełączane w momencie kiedy przycisk puszczam a nie kiedy go naciskam - tak...
Po usunięciu pętli w podprogramach obsługi klawiszy przygasanie zmniejszyło się o około 90%. Obecnie widzę, że na czas obsługi nacisnięcia wyświetlacz ledwie przygasa. Spróbuję stworzyć obsługę w przerwaniu. Czy mogę w przerwaniu wpakować instrukcję debounce? Wiem, że domyslnie wprowadza 25ms opóźnienia, by wyeliminować drgania styków klawiatury. Wydaje...
Nie tak się eliminuje drgania zestyków na uprocesorze. Można to zrobić dużo prościej - poprzez zastosowanie opóźnienia ok. 80ms. Aby zadziałało przerwanie wyzwalane zboczem to zbocze to musi mieć odpowiednią stromość. Jeżeli wygładzisz je kondensatorem to już takie strome nie będzie. Spróbuj zrobić tak: usuń kondensator, a zamiast niego w procedurze...
Dobrze jest sprawdzać czas trwania okresu stanu niskiego/wysokiego (szybko można wykryć błędną transmisję), ale tak jak to zostało napisane czas trwania nie musi być dokładnie zgodny ze specyfikacją ja stosowałem tolerancje 1/4 trwania bitu. Tak samo odczytanie stanu bitu nie musi być dokładnie w 3/4 bitu może być chwile po synchronizacji, byle stan...
NMI, jak sama nazwa wskazuje, nie da się zablokować (no chyba, że sprzętowo), więc jedynym rozwiązaniem jest optymalizacja procedury obsługi przerwania, aby kończyła się przed kolejnym NMI lub blokada sprzętowa NMI (jeśli nie można go opóźnić)...
Sprawa dotycząca modbus, powinna być wykonywana co każde przejście pętli, bez żadnych opóźnień ponieważ w module mamy obsługę 8 wejść i fatek musi o tym wiedzieć bardzo szybko, aby wykonał odpowiednią procedurą obsługującą dany przycisk. Powinieneś więc w pierwszej kolejności przenieść obsługę modbus do przerwania, tylko w ten sposób będziesz miał...
define nie przyjmuje średników. I to opóźnienie w obsłudze przerwania karygodne. PORTB !=PORTB; powinno być PORTB = ~PORTB; Deklaracja F_CPU zbyteczna to ustawia się w makefile. Ps. SIGNAL() wyszło już z użycia.
Możesz zrobić przerwanie (UTC chyba miało przerwanie oddzielne) i w przerwaniu kasować kierunek :)
Atmega 328 Przerwanie 50hz do sterowania fazowego blokuje odliczanie millis(); , występują opóźnienia w całym programie. Trudno cię zrozumieć, ale sprawdzanie millis() wskazuje na to że nie używasz potencjału jaki jest w sprzęcie, powinieneś ustawić przerwanie tak aby timer wywołał je kiedy jest potrzeba zmiany stanu wyjścia, albo w ogóle bez udziału...
ja pisałem oczywiście o wejściu komparatora (on ma wejście różnicowe) ale jego przerwanie działą z opóźnieniem i dlatego osobno atmelowcy podprowadzili jedno wejście do int0. Ja mama inne dane co do tych błędów :-|
Dobrze byłoby mieć pomiar czasu zamiast generowania opóźnienia. Albo... skoro masz przerwanie od odebranego znaku, to w obsłudze przerwania zmieniasz kolor na czerwony (pewnie niezależnie od tego, jaki był) i ustawiasz flagę (wartość zmiennej), która blokuje normalne przełączanie kolorów (w taki sposób, że kod, który ma zmieniać kolory, rozpoznaje tę...
rs232 przerwaniu enkoder przerwaniu stm32 przerwanie przerwaniu
wejście cyfrowe wzmacniacz hella webasto schemat pasek frania
Spawarki Paton - Innowacyjne i Niezawodne Rozwiązania Podłączenie głośników Bose Lifestyle 650 do tunera 600