W przerwaniu przycisku blokujesz przerwanie przycisku i uruchamiasz timer sterujący wyświetlaniem, który kiedyś tam, gasząc wyświetlacz, włącza przerwanie przycisku. To "czekanie 20 ms" i powtórne sprawdzanie przycisku to jakaś magia i nie ma ani trochę sensu.
Odczyt stanu przycisku powinieneś realizować kilkukrotnie w przerwaniu, aby wyeliminować drgania styków. Twoim problemem jest fakt iż podczas zdarzenia wywołanego przyciśnięciem przycisku, cały czas sprawdzasz jego stan i znowu wywołujesz akcję. Skorzystanie z dobrodziejstw przerwań rozwiąże problem.
Powyżej podałem przykład co powinno się znajdować w obsłudze przerwania od timera. Natomiast same przyciski możesz sprawdzać w pętli while() jeżeli nie chcesz angażować do tego osobnego przerwania.
1. Nie wykluczyles drgan na przycisku s1 2. Zebys wykonac to co chcesz zrobic bedzie ci potrzebne przerwanie. 3. Dziwie sie, ze sprawnie dziala ci ten kod (chyba, ze specjalnie robisz sprawdzanie przycisku w petli, zeby nie bylo przerwania i wykonal kod do konca, a pozniej sprawdzil czy przycisk jest wcisniety. W tym przypadku przepraszam)
Z każdym przyciskiem skojarz jedną zmienną, która będzie zawierała stan licznika timera, w chwili wykrycia jego naciśnięcia. W kolejnych przerwaniach overflow sprawdzasz: 1. czy przycisk jest ciągle naciśnięty, 2. jeśli 1. jest prawdą to czy różnica pomiędzy licznikiem timera a wartością zapamiętaną w skojarzonej z przyciskiem zmiennej jest większa...
Jeżeli ten program nic nie robi poza sterowaniem silnikami poprzez timery, to po co sprawdzać przycisk w przerwaniu? Sprawdzaj go po prostu w głównej pętli main i tyle. W zależności czy wciśnięty, czy nie, ustawiaj odpowiednie klucze, zmieniaj ustawienia timerów itp.
Powtórzę ponownie: Wyrzuć wszystkie delay i zrób animacje na przerwaniach, czyli "Po Bożemu".
Mikrokontroler mega.2560. Arduino Mega, czy sam "czysty" mikrokontroler, bez środowiska Arduino? Pierwszym projektem jaki się robi podczas nauki na mikrokontroler jest miganie diodą. Drugim projektem jest włączanie diody przyciskiem. Stan przycisku możesz sprawdzać poprzez przerwanie zewnętrzne (tylko na niektórych portach), cykliczne sprawdzanie w...
Błędy są wszędzie. Pierwszy - to użycie przerwania zmiany portu zamiast sprawdzania stanu przycisków w przerwaniu timera. Drugi - to użycie delay w przerwaniu. Trzeci - to źle napisane if else w przerwaniu timera. Czwarty - użycie własnego bool zamiast standardowego _Bool. To tak na początek.
to z tym ne to układ znacząco nadmiarowy, w wypadku uC układ zamykałby się w 2kondensatorach, rezystorze, attiny13 i ew stabilizatorze(i 2kondensatorach do niego). Najbardziej łopatologicznie to sprawdzać stan przycisku w pętli do czasu przerwania z licznika który zerujesz / uruchamiasz w czasie pierwszego wykrycia zmiany stanu i zmienić stan wyjścia...
Obu timerów używam do generowania PWM, można je wykorzystać jeszcze do opóźnień ? Albo lepiej, do generowania przerwań, w których sprawdzał bym stan przycisku (zamiast przerwania INT0). A na tą książkę już odkładam kase ;) Dzięki wszystkim za pomoc.
Mam takie zadanie. Włączać / wyłączać miganie diody. (długi czas migania) Zadanie polega na dostrzeżeniu różnicy między przerwaniem z przycisku a sprawdzaniem w pętli stanu przycisku. Różnica ma polegać na tym, że z podczas przerwania miganie zostaje natychmiast wyłączone, a podczas sprawdzania stanu przycisku w pętli występuje opóźnienie (aż pętla...
Dobry początek. Czy dioda załączona czujnikiem nigdy się nie wyłączy sama? Teraz wyobrać sobie, że w przerwaniu timera, np. 100 razy na sekundę, sprawdzasz stan czujnika i przycisku i odpowiednio zapalasz/gasisz diodę i zmieniasz stan automatu. Proste?
Jak wyrzucisz z przerwania obsługę przycisków- to będzie krótkie. Jak masz przerwanie co 10ms to daj flaga++ kasowanie w głównej pętli co 3-4 przerwania- 30-40ms. w linkach -nie pamiętam. Ale niektórzy zamiast napisać "wykorzystując przerwanie" piszą "w przerwaniu" Ja napisałem tak: "Wystarczy w przerwaniu ustawiać jeszcze jakąś flagę. Potem w głównej...
AVE... Co do kodu, to nie wiem, bo jestem podchmielony lekko winem herbacianym... Program podziel na dwa kawałki: pętlę główną i przerwania. W pętli głównej za pomocą if-then sprawdzasz sobie jakieś tam flagi bitowe związane z przyciskami. I zachowujesz się adekwatnie, w sensie zmieniasz status zapalenia diod. W przerwaniu sprawdzasz po kolei dwie rzeczy:...
Przycisk powiadasz. Wg. mnie przyciski najlepiej obsługiwać w polling-u, załatwiając od razu kwestię eliminacji odbić styków. W tym, konkretnym przypadku, może w przerwaniu TIMER1 najpierw wykonywać rzeczy krytyczne czasowo, a potem sprawdzać przycisk?
Witam. Wydaje mi się że w tym przypadku to nie pomoże. Przewód pewnie robi za antenę i sciąga jakieś śmieci. Kolega Tomson pewnie impuls na INT0 traktuje jako wciśnięcie przycisku. W takim przypadku każdy impuls (rzędu pewnie nawet ns) wywoła przerwanie. Cała obsługa powinna wyglądać trochę inaczej. Otóż nawet krótkie wciśnięcie przycisku zwiera jego...
Podłącz przycisk do nóżki INT, skonfiguruj jako wejście z podciągnięciem, ustaw int jako low level, procesor ustaw w powerdown. W przerwaniu tylko sprawdzaj czy przycisk wciśnięty dłużej niż 3s czy krócej (wtedy znów powerdown). I nie trzeba tu bitwaitów. Nawet timera do sprawdzenia 3s (robisz do-loop while i w tej pętli co np 100ms inkrementujesz jakąś...
A może nie wykorzystuj 2 przerwań tylko sprawdzanie przycisku wstaw odrazu do przerwania od zegara: [syntax=cpp] ISR (TIM0_OVF_vect)//3,4ms { sei(); if(przycisk wciśnięty) { t1=t1+1; } else { t=t1; t1=0; } } [/syntax] czy jest może jakaś zależność od l?? np przy l = 0 działa lepiej a przy l=4 działa gorzej albo na odwrót? PS i dołóż kondensator 100n.
Przerwania to nic innego jak wywoływanie konkretnej funkcji, gdy wystąpi określone zdarzenie (np. przepełnienie licznika, odebranie danych z UARTA, zmiana poziomu na pinie INT0) Polecam zapoznać się z datasheetem od uC, którego używasz. Tam znajdziesz informacje o przerwaniach, m.in jakie przerwania są dostępne, jakie rejestry odpowiadają za odblokowanie...
Pomijając już opóźnienia w obsłudze przerwania i użycie przestarzałej funkcji obsługi przerwania (SIGNAL),ta linijka while(!(PIND & 0x04)) {} powoduje zawieszenie się programu w obsłudze przerwania, kiedy na PIND4 pojawi się logiczne 0. Ja napisałbym to w ten sposób: ISR (INT0_vect){ _delay_ms(10); if(!(PIND...
Generalnie postaraj się tak napisać program, żeby uniknąć instrukcji "wait" i "waitms". Program w tym czasie nie robi kompletnie nic, a już tym bardziej nie sprawdza stanów przycisków. Zamiast Wait można użyć pętli które się wykonują wielokrotnie. Zdefiniuj X jako word, wykonaj pętlę for x = 1 to 50000 - w pętli umieść sprawdzanie przycisków i masz...
1. Sprawdzasz stan przycisku co jakiś czas, co przerwanie timera, np. 10ms (w przepełnieniu licznika np. Timer0 Overflow można regulować czasem pomiędzy przerwaniami, wpisując na początku obsługi przerwania odpowiednią wartość licznika, oraz wybierając preskaler w odniesieniu do częstotliwości zegara systemowego {1; 8; 64; 256; 1024}). Procedura timera...
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ę...
Da się zrobić. Użyj przerwania timera do sprawdzania stanu przycisku i modyfikacji wypełnienia PWM dla serwa.
Zakładam, że przyciski są podłączone do pinów i zdefiniowane jako KLIK_MENU itd. Nie sprawdzaj w pętli głównej stanu przycisków tylko wrzuć sprawdzanie do przerwania od któregoś timera z ustawianiem wartości jakiejś flagi a w pętli głównej wykorzystaj funkcję switch - case. Poza tym nie widzę inicjacji portów.
Zrób to w przerwaniu od zegara co np. 100mS. Sprawdzasz czy przycisk jest wduszony i jeśli tak to przypisujesz zmiennej typu static wartość 100. Dalej w tym samym przerwaniu sprawdzasz czy ta zmienna jest większa od 0. Jeśli tak to zmniejszasz ją o 1 i zapalasz podświetlenie. Jeśli nie to gasisz podświetlenie.
Rzeczywiście dało się to uprościć mocno. Ponieważ dla potrzeb programu mam zrobione "fajne" makra typu: brfs Nazwa_Flagi, Etykieta ;skocz do Etykieta jeśli flaga ustawiona brfc Nazwa_Flagi, Etykieta ;skocz do Etykieta jeśli flaga wyzerowana setf Nazwa_flagi ;ustaw flagę clrf Nazwa_flagi ;zeruj flagę ..to korzystam z flag również przy przyciskach (upraszcza...
W przerwaniach masz _delay()- to wielki błąd. A _delay() w pętli- to duzy błąd. Masz Timer i masz go ustawić na przerwanie co 20ms. W tym przerwaniu ustawiasz sobie tyle flag ile trzeba i je zwiększasz. W głównej petli sprawdzasz czy flaga1==1, zerujesz i wykonujesz jakiś warunek. Potem sprawdzasz czy flaga2==5, zerujesz i robisz to co ma być robione...
1. Definiujesz stałe w pamięci RAM, zamiast w ROM. 2. Niepotrzebnie używasz przerwania WDT i portu. Wystarczy jedno przerwanie timera o częstotliwości rzędu 100 Hz, w którym sprawdzasz przycisk, odliczasz czasy i zmieniasz światła.
Generalnie przy LEVEL przerwania są tak długo emitowane, aż zniknie ich przyczyna, w efekcie wywoływane jest ISR i natychmiast zgłaszane jest kolejne przerwanie. Musiałbyś więc po zmianie z LEVEL na RISING jawnie kasować flagę przerwania. W większości przypadków się więc nie używa LEVEL. Piszesz strasznie skomplikowany kod - nie prościj dać BOTH_EDGES...
W celu eliminacji drgań styków należy użyć przerwania licznika, by odczytywać stan przycisku tylko raz na około 10 ms . Nie używamy funkcji Debounce i delay_ms ! Czy przycisk został naciśnięty sprawdzamy w zmiennej globalnej dostępnej w programie głównym.
2k dla rezystora diody, to 5x-10x za dużo. Używaj nazw pinów PD5, zamiast DDD5 czy PIND5. A może jednak błędny opis na schemacie producenta, polega na tym, iż prawidłowy jest opis, a podłączenia nie. Czyli przeciwnie niż się spodziewasz. Sprawdzałeś to? Masz multimetr? Zmierz napięcie na wejście INT0 przy naciśniętym i puszczonym przycisku.
Zmieniłem obsługę przycisków z generowania przerwań na sprawdzanie ich stanów w przerwaniu timera. Oczywiście wydaje mi się, że mogłem pomylić pojęcia priorytetu przerwań DMA, a priorytet DMA. Człowiek się uczy całe życie, a z ARM'em mam styczność dopiero od ponad miesiąca. Dodatkowo dodałem sprawdzanie stanów przycisków przed uzupełnianiem bufora do...
Ok ale jak by wtedy procesor pozostawał w uśpieniu? z każdym wywołaniem przerwania sprawdzał by wtedy stan przycisku - przynajmniej tak to rozumiem. Mógłby ktoś powiedzieć czy dobrze jest ustawione wywołanie przerwania INT0? Czy jest zboczem narastającym i czy odpowiednio pod to podłączyłem przycisk.
Jak masz jakieś pojęcie o programowaniu to nie powinno być problemu. Najlepiej zrobić to na timerze i przerwaniach. Sam program byłby dosyć prosty w działaniu. Ja zrobiłbym tak. Przerwanie z timera przychodzi jakieś 100 000 razy na sekundę. Robisz 1 zmienną na liczenie przerwań i porównujesz z 2 zmienną która określa jasność świecenia. Przez wszystkie...
Faktycznie aktywnym stanem jest zero i wtedy ten fragment kodu nie powinien dać żadnego rezultatu, ale co dziwne cokolwiek nacisnę i tak się wykona. Znaczy, dlaczego nie. Jak wcisnąłeś przycisk 0, a sprawdzasz 2, to przerwanie sie wygeneruje, ale na dwójce jest stan wysoki, to warunek (pierwszy) zadziała. Jak sprawdzam czy stan jest równy zero to też...
Nie musi to być stricte funkcja przerwania tylko sprawdzanie flagi przerwania w pętli, która zapisuje wyniki. Po wykryciu przerwania INT od przycisku niech od razu zablokuje to przerwanie i zgasi jego flagę.
Proponuję zrezygnować z obsługi klawiszy poprzez INTX, gdyż jest przeznaczone dla stabilnych i krytycznych czasowo sygnałów, a przyciśnięcie przycisku to ruletka impulsów, zwłaszcza, gdy już jest sporo czasu używany. Klawisze najlepiej sprawdzać cyklicznie, np. w procedurze obsługi przerwania, przypisując mu jakiś jednobajtowy kod i tworząc ogólny dekrementowany...
W książce do której jest link w mojej stopce są darmowe przykłądy do ściągnięcia. Masz tam m.in. implementację takiego sprawdzania przycisków. Ale ok, można to zrobić też na timerze. Więc po kolei - zainicjowałeś timer, teraz w procedurze obsługi jego przerwania sprawdzasz stan przycisków. Dzięki temu ich stan będzie okresowo sprawdzany. Potrzebujesz...
Przejrzyj setkę wątków na forum poświęconych temu, dlaczego do przycisków nie uyżwa się przerwań portów, a potem zrób to w przerwaniu timera, np. tak, jak w tym artykule: http://ep.com.pl/files/10324.pdf Samo programowanie prtzerwania też masz ciut bez sensu - najpierw uruchamiasz przerwanie, potem programujesz linię portu, która ma je zgłaszać. Zanim...
O eliminacji drgań pamiętam - na razie jest poprzez kondensator i opornik, lecz jak będę kończył program, to to dopiszę. Możesz mi wyjasnić dlaczego jest źle?: Sprawdzam sobie stan samego timera z częstotliwością 10hz w tym wypadku, a stanu przycisku nie sprawdzam, ponieważ jest wywoływany przerwaniem INT0 Edit: Już sobie poradziłem - pomyliłem PINB...
Oczywiście że bez delay. Spróbuj tak jak napisałem. Pewnie nie jest to optymalne, ale myślę, że dobry początek. Zacznij od obsługi wejścia. Sprawdzasz stan przycisków (czujek) cyklicznie, nie w przerwaniu, i ustawiasz odpowiednie zdarzenie, np PRZYCISK_UP, PRZYCISK_DOWN.
samo menu wielopoziomowe ze zmianami parametrów już jes dość rozbudowana częścią kodu. Samo sprawdzanie przycisku nic nie zmienia. kwestia jak kolega te pomiary zczyta i jak zrobi menu. jak zrobisz zle to czy przerwanie czy nie i tak sie zacznie mylić
"pod koniec obsługi przerwania wyzerowć jego flagę". Po czym następuje proces zdejmowania ze stosu. Ileś cykli trwa. W tym czasie teoretycznie może nastąpić jeszcze jedno ustawienie flagi. Teoretycznie- bo czekanie na wygaszenie drgań 2x80ms to jest wieczność. Dlatego sądzę że używanie przerwań zewnętrznych do sprawdzania stanu przycisku tylko komplikuje...
PWM powinno być generowane przez timer. Stany przycisków można sprawdzać w przerwaniach, a nie w jakiejś pętli. W programie użyłeś funkcję delay() 294 razy, a powinieneś 0 razy. Cały kod jest napisany źle. Nie zaplanowałeś działania programu. Sklejenie po prostu dwóch różnych programów nie spowoduje, że staną się jednym programem. Hasło na dziś: "Planowanie...
2. Takie ogólne pytanie gdzie w kodzie należy umieszczać obsługę przycisków, pomiar czasu, pomiar temperatury, obliczenia (przerwania czy w pętli while(1) ) czy może jeszcze gdzieś indziej ? Z jednej strony w wielu postach jest napisane aby w przerwaniach było jak najmniej instrukcji z drugiej strony gdzieś to wszystko trzeba przetworzyć. W przerwaniu...
Jak rozumiem ma być czytane przerwanie z klawiatury ( miedzy innymi ) , a czemu nie zrobić przerwania z jakiegoś timera które będzie cyklicznie sprawdzało pin podłączony z tym klawiszem ( przyciskiem ).
Postanowiłem odświeżyć temat. Wymiana przycisków nie pomogła. Płytka sprawdzana, ścieżki nie przerwane. Co to moze być? Przyciski nadal niesprawne. pozdrawiam
W zasadzie nie potrzebujesz JP13. To chyba taki ukłon w stronę 8051 z dwoma przerwaniami zewnętrznymi. AVRy mają przerwania PCINT na prawie wszystkich pinach i w momencie jak wciśniesz przycisk i tak możesz wywołać przerwanie. Niemniej w ogóle nie powinieneś robić tego na przerwaniach zewnętrznych (poza wyjątkową sytuacją gdy wprowadzasz uC w głębokie...
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.
gdyby zatrudnić przerwanie do sprawdzania stanu przycisku to odpadłby problem sprawdzania przycisku w każdym obrocie pętli :-)
Witam! Lepiej co jakiś czas w przerwaniu zegara sprawdzać stan przycisków, nawet jeśli zegar jest potrzebny do czegoś innego można rozbudować jego podprogram. Popieram, też tak robię. Sprawdzam stan klawisza po 20ms od wykrycia wcisnięcia w celu eliminacji drgań styków. Było to opisane kiedyś w EP.
Właśnie sprawdzam inne, SysTick działa, ale ono nie idzie na wrota NVIC'owe, zaraz sprawdzę normalne timery. No fakt :D Ale wspomniałem o tym, że w przerwaniu bym sprawdzał wszystkie przyciski to dostałem odpowiedź, że jeśli nie będę miał już timerów to co bym zrobił :p To jest taki projekt sprawdzający, więc chyba bardziej chodzi o to, żebym pokazał...
Miałem Ci odpisać wcześniej, ale czasu nie starczyło. Więc najlepiej użyj jakiegoś timera generującego przerwanie np. co 100ms. Następnie w przerwaniu od tego timera, sprawdzaj stan przycisku, a dokładniej licz czas wciśnięcia. W momencie zwolnienia przycisku, sprawdzasz ten czas i jeżeli przycisk był wciśnięty poniżej 1sek, to robisz to co było zapisane...
Korzystam z samego modułu ESP na autorskim PCB którego już nie zmienie. Przyciski celowo podłączyłem do GPIO0 GPIO2 żeby trzymając je dwa i startując układ wchodził w download mode. Wygląda na to że będę musiał zrobić fuszerkę tj. porzucić nie działające przerwania i taskiem co 50ms sprawdzać stany przycisków
Do kolegi arktik1 dlaczego kolega namawia do sprawdzania w petli danego pinu skoro luki55 ma w programie sprawdzac tylko ten przycisk to lepiej go dac w przerwanie zewnetrzne a do glownego do__loop wstawic nop. Jesli juz taki "duzy" procesor stosowac to wykorzystac go przynajmniej tyle ile sie da i ile ulatwi zycie. P.s. Attiny13 tez bylby za duzy :D
Dziękuję za propozycje :) Niestety nie do wykonania przeze mnie, z uwagi na poziom moich umiejętności programowania, jak zaznaczyłem na wstępie :) Kwestia drgań i zakłóceń nieistotna, tact switch dobrej jakości. Poproszę o kawałek kodu, pasujący do oryginalnego, sprawdzający przycisk w przerwaniu timera co np. 50 ms oraz dodający niewielkie opóźnienie...
gaskoin- a eliminacja drgań styków sprzętowa to jak niby wydłuża czas życia przycisków? Bo ciekawy jestem. kaczor90- w ustawianiu rejestrów w ARM to Ci nie pomogę- strasznie to wszystko porąbane. Może kiedyś. Ale zwróć uwagę na to co napisał gaskoin. Sprawdzanie stanu przycisków za pomocą przerwania zewnętrznego jest takie sobie. Lepiej robić to za...
Przycisk ma kondensator. Nie mam pojęcia jak miałbym sprawdzac przycisk bez przerwań w RTOSie?
Problem to jest np. zwykły debouncing, czyli masz przycisk który powinien generować IRQ przy zmianie z 1 na 0 potem kiedy przerwanie jest obsługiwane sprawdzam stan linii od przycisku i ona nie jest zero tylko 1. Więc teoretycznie przerwanie zostało wygenerowane nie poprawnie.
Oto rysunek z pomysłem. Wciskasz raz przycisk, tym sposobem zasilasz mikrokontroler, który ustawia bit na linii która steruje tranzystorem. Po puszczeniu przycisku układ jest już zasilony. Kolejne wciśnięcia w kwestii zasilania nic nie zmieniają ale na linii przerwania ustawia się poziom wysoki i zanika, wykorzystujesz to jako przerwanie dla mikrokontrolera,...
Jedynym przerwaniem, jakiego potrzebujesz, jest przerwanie timera, tego samego, który generuje PWM. W obsłudze przerwania sprawdzasz stan przycisku, pamiętając przynajmniej jeden poprzedni stan w jakiejś zmiennej. Jeśli nastąpiła zmiana stanu - zmieniasz tryb pracy i ładujesz nowe wartości PWM. Coś z lekka podobnego masz tutaj: http://mikrokontrolery.blogspot.com/2011...
W jednym swoim projekcie mam taką obsługę przerwań : [syntax=Basic4GL] Config Timer0 = Timer , Prescale = 256 On Timer0 Przerwanie Enable Interrupts Enable Timer0 Load Timer0 , 250 Do 'petla glowna Loop End Przerwanie: Load Timer0 , 250 Incr Czas8ms If Czas8ms = 125 Then Czas8ms = 0 Incr Sekunda End If If Przycisk = 0 Then Flaga = 1 End If Return [/syntax]...
niestety nie da się obsłużyć przerwania z tego miejsca. Możesz tylko na bieżąco sprawdzać czy nie zmienił się stan przycisku lub czy nie jest on przyciśnięty i tyle. ewentualnie podłączyć go w inne miejsce
A wg mnie lepiej sterowanie pwm( jeśli dobrze zrozumiałem bo być może to sterownie diodami to tylko włącz i wyłącz to moja porada nie spełni oczekiwań) dać na przerwaniu np od timer0 a przyciski sprawdzać w pętli w ten sposób sprawdzanie przycisku nie wpłynie na pwm , minusem może być "mułowate" trochę sprawdzanie stanu przycisku ale wszystko zależy...
Moim zdaniem jak zrobisz prawidłowe procedury debouncingu (chociaż może nazwa nie jest idealnie trafiona), to żadne zakłucenia nie powinny tutaj przeważyć. Jeżeli np ustawisz tak timer, że przerwanie będzie sie "uruchamiało" co 10ms, następnie sprawdzasz wszystkie kolumny (czy tam wiersze). Tam gdzie wykryjesz wciśnięcie przycisku zwiększy wartość licznika...
1. Podprogram obsługi przerwania "Przerwanie" musi kończyć się instrukcją "Return" 2. Wciśnięcie przycisku z tego co widzę łapiesz przerwaniem zewnętrznym INT0, w takiej sytuacji równolegle z przyciskiem przydałby się kondensator rzędu 100nF lub większy (trzeba popróbować), inaczej będziesz miał trzaski i w efekcie wielokrotne pojawienie się przerwania...
nie trzeba analizować całości :) ale mogę się mylić Możliwe, możliwe też że problem leży w ogarnięciu siekanego stylu pisania programu. Przecież obsługa tego typu sprowadza się w zasadzie do dwóch etapów. Zapisania startu czasu przy wciśnięciu, i sprawdzaniu czy ten czas został przekroczony. W sumie z początku myślałem że chcesz tylko mieć czas trwania...
Ja zrobiłem coś w rodzaju matrycy. np. 4 przyciski podłączone do 4 linii i przez diody do przerwania. Przerwanie wywoływane jest dowolnym przyciskiem,a w podprogramie sprawdzałem (po pewnym czsie)jaka liczba wychodzi z tych 4 bitów (przycisków). Dzięki temu mogłem zrobić kombinacje naciśnięć kilku przycisków jednocześnie. Opóźnienie odczytu liczby było...
Gdy już usuniesz wewnętrzną pętlę do..loop to zwróć uwagę, że stan przycisku będzie sprawdzany raz na 60s. Możesz zrobić sprawdzanie np. tak (co 1 sek.): dim x as byte ... do 'sprawdź przyciski if x=60 then x=0 toggle ... end if wait1 incr x loop end Albo wykorzystać timer lub przerwanie.
[syntax=c]uint8_t klawisz_wcisniety(uint8_t klawisz) { if (!(PINC & klawisz)) //sprawdzanie czy wcisnięty klawisz { _delay_ms(80); //drganie styków if (!(PINC & klawisz)) return 1; } return 0; // ponowne sprawdzanie czy wcisnięty klawisz }[/syntax] Tak wygląda funkcja do zatrzymywania stopera na przycisku, bez użycia przerwania zewnętrznego INT0. Jak...
Błędów całe mnóstwo. 1. Nie robi się przerwań od przycisków. Zrób przerwanie timera np. 100 Hz, w nim sprawdzaj stany przycisków. 2. __attribute__ ((interrupt)) jest zbędne. 3. Znacznik przerwania kasuje się na początku, nie na końcu obsługi przerwania. 4. Do zmiany stanu linii portów służą rejestry BSRR- jeden zapis zmienia stany dowolnie wybranych...
Według mnie autor opisał jasno co chce osiągnąć, mianowicie po przyciśnięciu przycisku włącza się któraś sekwencja, a po przyciśnięciu innego przycisku program "przełącza się" na obsługę innej sekwencji. Kolega nic nie pisał o przytrzymaniu przycisku więc najbardziej prawdopodobną opcją jest że chodziło mu o zwykłe "kliknięcie"(jeżeli się mylę niech...
Po pierwsze jesli chcesz sam dfodac krancowki to uwazaj. Ich niezadzialanie moze uszkodzic silnik a nawet wywolac pozar. Jakie silniki chcesz wykorzystac, bo jak rozumiem nie sa to dedykowane silniki do rolet? Co do drugiej czesci - ruch rolet i sprawdzanie krancowek musisz zrobic asynchronicznie w stosunku do glownej petli programu. Czyli np. tak:...
Zarezerwuj sobie na godziny i minuty po rejestrze w procesorze. Zrób obsługę klawiatury. Ja bum dał 3 przyciski. 1 - jak przytrzymasz dłużej to wchodzi w trym ustawiania. Jak potem na krótko to przechodzi po kolejnych rejestrach i ustawiasz 2 pozostałymi wartość godziny minuty, dnia, miesiąca, roku. 2. zmienia wartość w górę 3. zmienia wartość w dół...
Użyj przerwania timera do migania diodą, a najlepiej do wszystkiego (czyli również do sprawdzania stanu przycisków).
Teraz spłodziłem coś na chacie w bascomie ;-) Może w końcu ta koncepcja ruszy.... uwzględnia drgania styków, działa na innej zasadzie... powinna byc odporna na wszelkiego rodzaju czasy między puszczeniami wciśnięciami itp... w przerwaniu co 10ms sprawdzamy stan przycisku zadziałanie przycisku następuje najwcześniej po 10 jego sprawdzeniach (po 100ms)...
Co do tego przerwania timera. Ustawilem przerwanie co 30ms. W przerwaniu sprawdzam stan pinu i pytanie co jeszcze należy dodać do przerwania by funkcjonowało poprawnie? Jakieś małe opóźnienie i kolejny raz sprawdzenie stanu po czym uznawać że przycisk wcisniety realizować co potrzebuje ?
Witam. Mam taki dziwny problem - odpalam sobie przerwanie co 10ms, w nim chciałem zrobić coś w stylu bufora dla danych wejściowych, ponieważ mam przerwanie z innego timera, które trwa dość długo (odczyt temp, ustawienie na podstawie tej wartości stanu wyjść, wypisanie temp. na lcd). Na to przerwanie dałem wyższy priorytet, i po prostu sprawdzam stan...
A po co 8 pętli do obsługi 4 przycisków? Przerwanie nie przerywa pętli tylko wstrzymuje ją na czas wykonania programu przerwania. Wystarczy jedna pętla główna w której sprawdzasz stan całego portu do którego są podpięte przyciski, wtedy w tej samej chwili masz odczytany stan przycisków. Jak rozumiem z opisu robisz pętle do obsługi każdego przycisku?...
Niestety projekt mam do oddania "na wczoraj" więc nie będę się w to bawił. Ale na pewno porada przyda się na przyszłość. Mam pytanie z innej beczki: Do interakcji z urządzeniem będę wykorzystywał 5 przycisków. Czy dobrym pomysłem jest sprawdzanie ich stanu w przerwaniu generowanym np co 25ms?
Jeżeli sprawdzasz przycisk podłączony do masy, to czemu przerwanie Timer ma być wyzwalane zboczem rosnącym ? Config Timer0 = Counter , Edge = Rising
Wiec tak: W ogóle wyrzuciłbym zmienna/flagę F. Nie jest potrzebna tutaj. W programie głównym zamiast sprawdzania F, sprawdzaj A, czyli warunek IF z przerwania przenieś do programu głównego, łącznie z zerowaniem A. W przerwaniu zwiększaj tylko A. Zamiast: If F = 1 Then Cls Locate 2 , 1 Lcd "przerwanie" Wait 1 Cls F = 0 Enable Int0 End If zrobilbym...
Witam. Szczęśliwie dla użytkowników praktycznie wszystkie wyświetlacze alfanumeryczne LCD obsługuje się tak samo. Ich chipy sterujące są zgodne z HD44780. W skrócie obsługa LCD'ka wygląda tak: - inicjalizacja (zestaw komend sterujących, ustawia się min. sposób podłączenia 4/8 bit, ilość linii itp itd.). Sprawa dosyć dobrze opisana w większości datasheet'ów...
Jaki byście podali powód niedziałania ogrzewania tylnej szyby? 1. Przycisk działa świeci się, słychać że przekaźnik pyka jak się włączy czyli jakby prąd do chodzi czyli bezpiecznik ok. 2. Nie są przerwane grzałki na szybie dokładnie sprawdzałem latarką, nie widać żeby była przerwana. 3. Kabel wygląda ok jest w osłonie oryginalnej czarnej. Co można jeszcze...
rejestry PINx w atmedze128 są tylko do odczytu więc nie wolno do nich nic zapisywać. jak chcesz sprawdzić stan przycisku to robisz tak: ustawiasz pin do którego jest podpięty jako wejście podciągasz go do stanu wysokiego w pętli głównej sprawdzasz czy dany pin nie jest = 0 (co będzie miało miejsce gdy go naciśniesz) czyli mniej więcej tak: PORTA |=...
W takim przypadku czyszczę flagi przed włączeniem przerwania (choć to zależy od konstrukcji programu i co ma robić i jak reagować ), natomiast w przerwaniu wyłączam przerwanie. Ponieważ jeśli nie masz dobrego sprzętowego debouncingu to na wejściu możesz mieć wiele takich impulsów i kilkukrotne wejście do przerwania. Nie bez powodu często polecana metoda...
Witam Do wyjść klawiatury wpinasz równolegle bramkę NAND 4-wejściową (zakładam klawiatura 4x4), a wyjście bramki do wejścia z przerwaniem zewnętrznym (INT0, INT1). W momencie naciśnięcia przycisku z klawiry na wyjściu bramki będzie "1" które wykrywasz (lub zbocze) na INTx. W obsłudze przerwania sprawdzasz klawisz jak normalnie.
Już Ci ktoś tłumaczył w innym temacie, że _delay_ms(i) gdzie i się zmienia nie zadziała tak jak trzeba. Jak widać nauka poszła w las... W Twoim przypadku dzieją się tylko 2 rzeczy równolegle: 1) sterujesz silnikiem (z odpowiednim opóźnieniem między impulsami, od 4 do 1000 ms) 2) sprawdzasz stan przycisków (co 30 ms). Dlatego ustawiasz sobie timer na...
Zrób sprawdzanie portów do których podpięte są przyciski w pętli głównej, albo w podprogramie obsługi przerwania Timera0 - po wyświetleniu cyferek na wyświetlaczach. Zawsze pozostaje jeszcze Timer2 :D, ale jak zapuścisz przerwania z 3 timerów i do tego jakieś zewnętrzne int to mogą być problemy...
Znasz obsługe przerwań? Konkretnie to przerwania zewnętrznego Int0? Pod ten pin musisz podłączyć przycisk. Następnie w podprogramie obsługi tego przerwania piszesz instrukcje zwiększania jakiejś zmiennej. Po czym w tym podprogramie sprawdzasz wartość tej zmiennej w kilku przypadkach i zależności od tego przechodzisz do odpowiedniego podprogramu, w którym...
Niedawno zbudowałem timerek w którym stan przycisków sprawdzam tak : callsprawdz ;sprawdzaj stan przyciskow -------------- ------------- ------------- sprawdzcallspr_s1 callspr_s2 return ;---------------------- spr_s1btfscPORTB,4 ; wcisniety ? return ; nie btfscPORTB,4 ; puszczony goto$-1 ; nie -------------- ; tak, puszczony ------------- -------------...
Warto zacząć od uwzględnieniu sytuacji awaryjnych: 1. Co jeśli czujnik się odczepi, uszkodzi. Brak światła? 2. Co jeśli bateria pod wpływem wstrząsów chwilowo straci kontakt a mikrokontroler zasilanie. 3. Skoro to mikrokontroler, to może warto dodać stan baterii? Natomiast kolejne wciśnięcie switcha podczas ściecenia LED nie resetuje licznika czasu....
Serwo po zmianie wypełnienia błyskawicznie ustawia się na nowej pozycji więc jeśli chcesz płynnie zmieniać pozycję serwa to musisz sam powoli zmieniać zmienną "pozycja". Najlepiej w jakimś przerwaniu zegarowym. Proponuję tak: - robisz zmienną "pozycja" i zmienną "zadana" i nadajesz im odpowiednie wartości początkowe W pętli głównej: - inicjalizujesz...
1 Nadal źle napisane Load Timer. 2 Brak inkrementacji zmiennej Sekunda. 3 Sprawdzanie warunków powinno być w pętli lub (gorsze rozwiązanie) w przerwaniu.
Witam. Czy posiada ktoś jakieś materiały, e-booki dotyczące wykorzystania timerów i przerwań od nich, dla programowania w języku C? Chcę wykonać następującą rzecz: W chwili wciśnięcia przycisku podpiętego do jakiegoś tam portu uruchamiam timer0 (tryb 1), który po 10ms sie przepełnia i wywoływane jest przerwanie. Za każdym razem w przerwaniu, tj. co...
Czyli wiemy że UPC działa i reaguje na komendy w sieci CAN oraz że kompresor i jego okablowanie jest sprawne. :D Obstawiam, że gdzieś w instalacji jest przerwane. Nie bardzo. :D Teraz pytanie - czy przewody z przycisku od klimy idą bezpośrednio do UPC, czy po drodze jest jeszcze coś? Przewody z przycisku klimatyzacji idą do modułu zespolonego UCH który...
Czy po wciśnięciu przycisku program ma wykonywać w kółko wybraną sekwencję? Pewne tak, a wtedy: jak w trakcie wykonywania sekwencji program ma reagować na wciśnięcie przycisku? Ma dokończyć wykonywaną sekwencję, czy ją przerwać? Jeśli program ma rozpoznawać wciśnięcie przycisku w czasie wykonywania sekwencji, to zamiast _delay_ms() trzeba wstawić własną...
Nie znam Bascoma Odpalasz timer, tak żeby generował przerwanie co 50 ms. W tym przerwaniu sprawdzasz stan portów i to w zasadzie wszystko. W pętli głównej monitorujesz ten stan i odpowiednio reagujesz.
obsługa przycisku przerwaniu sprawdzanie stanu przycisku opóźnienie przerwaniu
hella sterownik instrukcja navigon młotowiertarka milwaukee
napęd bramy przesuwnej wzmacniacze operacyjne
Dioda LED nie świeci w czajniku Zelmer, Philips, Bosch – typowe usterki i naprawa Typowe usterki wzmacniacza Luxman A-331