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.
Najprościej w zewnętrznym warunku daj Timer1.Enabled:=FALSE;. Spowoduje to zatrzymanie timera.
Najprostsze rozwiązanie - w przerwaniu od czujki uruchom sprzętowy timer. Przerwanie od timera powoduje włączenie alarmu. Jeśli użytkownik wyłączy system przyciskiem, to w procedurze przerwania przycisku wyłączasz timer. Żeby wszystko działało jak trzeba, musisz zezwolić na zagnieżdżone przerwania (czyli żeby ISR od timera mógł się wykonać w momencie,...
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...
Tak, zwróciłem uwagę profilaktycznie :) W Twoim pseudokodzie brakło tylko gaszenia flag - nie zapomnij o tym.
1. Dlatego, że w przerwaniu od przycisku musisz zablokować to przerwanie i uruchomić timer, a w przerwaniu timera odblokować z powrotem przerwanie - to zajmuje jakieś z 8 linii kodu i wymaga dwóch przerwań. Obsługa przycisku w przerwaniu timera zajmuje 2 linie kodu i wymaga jednego przerwania dla dowolnej liczby przycisków. 2. Robi się to, kiedy jest...
1. To stary wektor przerwań, a nowa funkcja ISR(). Musisz zastosować nowy wektor do tej funkcji. Znajdziesz go w tabelce szukając starego: http://www.nongnu.org/avr-libc/user-manu... 2. Drgania trwają od kilku do kilkudziesięciu milisekund. Możesz na przykład wykorzystać jakiś timer do odliczania tego czasu począwszy od pierwszego...
1. Zaprogramuj timer w tryb CTC, np. na częstotliwość 100 Hz. W przerwaniu timera: - sprawdź, czy przycisk naciśnięty; jeśli tak - zapal diodę i załaduj wartość 1000 do zmeinnej - "timera programowego". - jeśli zmienna timera ma wartość różną od zera, zdekrementuj ją, a jeśli zdekrementowała się do 0 - zgaś diodę. Razem daje to 5 linii kodu w przerwaniu...
Zafiksowany Kamyczku. Wykrycie naciśnięcia przecisku w przerwaniu timera - to 2 linijki kodu w C, wykonywane 50 razy na sekundę. Ty proponujesz rozwiązanie wymagające przerwania od przycisku, w którym to przerwaniu należy zablokować to przerwanie, ustawić znacznik/timer programowy, a następnie w przerwaniu timera odblokować przerwanie przycisku. Mamy...
W kodzie jest sporo błędów. Nie do końca jestem pewien, czy rozumiem, o co chodzi, ale jeśli przerwanie INT0 jest od przycisku, to nie ma prawa działać poprawnie, a przyczyna efektu, który obserwujesz, leży w operacjach na zmiennej b. Takie przerwanie po wystąpieniu musiałoby być blokowane przy pomocy timera na jakieś 30 ms, co jest znacznie bardziej...
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.
Jakoś nie widzę żebyś tu korzystał z przerwania od Timera... Bo nie musisz ;p mogłbyś pokazać jakiś przykład obsługi przycisku w przerwaniu timera ? Nawet jakiś URL do innego projektu. Więc chyba oczywistym jest że ten fragment kodu należy umieścić w przerwaniu od Timera.
Jaką masz częstotliwość przerwań timera? Testowanie stanu przycisków powinno następować z częstotliwością rzędu 30..50 Hz jeśli pamiętasz tylko jeden stan wstecz. Jeśli masz większą częstotliwość, to albo testuj je w co którymś przerwaniu, albo wsuwaj stan do zmiennej i wykrywaj sekwencję stanów (bitów) np. 1110.
Nie napisałeś nic o środowisku programowania. Jeśli to jakaś samoróbka Eclipse, stawiam na błędną konfigurację stosu/stosów. żeby poprawnie obsłużyć przycisk w przerwaniu portu, musisz i tak mieć przerwanie timera i wyłączać przerwanie przycisku po jego przyjściu, a potem włączać je w przerwaniu timera - bez sensu - dużo łatwiej i krócej zrobić to w...
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.
Skoro upierasz się na przerwanie od przycisku, to w obsłudze przerwaniu musisz zablokować to przerwanie i uruchomić timer, od którego przerwanie odblokuje przerwanie przycisku - i trzeba to zrobić dla każdego przycisku oddzielnie. Moim zdaniem zawsze łatwiej wrzucić do obsługi przerwania timera dwie linijki kodu, które załatwią obsługę przycisku, niż...
Metoda jest taka ze w momencie nadejscia przerwania od przycisku odpalasz timer, ktory odmierza kilka milisekund, po czym sprawdza czy przycisk nadal jest wcisniety. Jesli tak, to znaczy ze impuls pochodzi od faktycznego nacisniecia a nie od drgania po nacisnieciu. Dla pewnosci mozna zamiast 2 dokonywac 3 sprawdzen. Czas timera musisz dobrac doswiadczalnie.
przerwanie od timera dla przycisku jest ok próba wyświetlania czegoś na wyświetlaczu z przerwania nie jest ok kasuj flagę przerwania na jego początku usuń te trzy tony zduplikowanego kodu który tam masz
To nie ma szans poprawnie działać bez przerwania timera, a kiedy już masz przerwanie timera, to przerwanie od przycisku staje się całkowicie zbędne.
Zanim włączysz konkretne przerwanie włącz przerwania globalne. wpisz tak Enable interrupts Enable int0 Pozdrawiam :)
W STM32F nie można równocześnie przyjmować przerwań z wejść różnych portów o tych samych numerach. Do wejść przerwań nie podłącza się przycisków, bo przerwanie od przycisku jest dużo trudniejsze w oprogramowaniu, niż testowanie przycisku w przerwaniu timera.
Witam, Chcę obsłużyć przycisk USER za pomocą przerwania. Myślę, że wcale tego nie chcesz. Przycisk obsługiwany przez przerwanie nadaje się do jednego - do wybudzania procesora z głębokiego uśpienia. Do wszystkich innych celów dużo łatwiej jest użyć do obsługi przycisków przerwania timera.
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...
Musisz chyba użyć timera ustawionego tak aby przerwanie z niego następowało później niż czas między kolejnymi wysyłanymi paczkami z pilota. Z tego co pamiętam to pilot w standardzie RC5 wysyła przy stale wciśniętym klawiszu kod co jakieś 89ms. Jeśli używasz przerwań do czytania kodu to dajesz mu wyższy priorytet niż timerowi. W timerze zerujesz pin...
Przerwania są zagnieżdżone,tzn. jestem w przerwaniu od timera, wysyłam wynik z przetwornika do uarta, a potem czekam na przerwanie od przycisku nie wychodząc z przerwania od timera. Gdy wcisnę przycisk to CPU idzie to obsługi przycisku i mam przerwanie zagnieżdżone. Tu nie pomoże żadna wiedza o wielkości stosu. Program trzeba przepisać. A przedtem...
W ten sposób daleko nie zajdziesz. Zacznij od tego, żeby testować przyciski w przerwaniu timera - kod bęzie znacznie prostszy i bardziej niezawodny. http://mikrokontrolery.blogspot.com/2011... żeby pozbyć się if() możesz napisać signal_incrValue = !!(PIND & 0b00000010); albo signal_incrValue = PIND >> 1 & 1;
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...
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...
KEY=((PIND & 0x01) & 1); 1. Nazw zmiennych zwyczajowo nie pisze się wielkimi literami 2. Wystarczy: key = PIND >> NR LINII PRZYCISKU & 1; - w ten sam sposób dla każdego przycisku. 3. Nie ma sensu deklarować zmiennych związanych ze stanem przycisków poza procedurą przerwania timera, bo nie są one nigdzie więcej potrzebne. Zmienne keystate powinny mieć...
I pomyśleć, że zrobienie tego w przerwaniu timera bez przerwania przycisku zajęłoby < 20 linii...
Hint: timer, przerwanie timera. drgania styków, denouncing Dodano po 1 http://mikrokontrolery.blogspot.co.uk/20...
Wywal przerwanie od przycisku, wykorzystaj timer w tym celu. Wtedy eliminacja drgań jest banalna. Na stronie http://mikrokontrolery.blogspot.com/ znajdziesz przykłady gotowców.
A nie widzę nigdzie innego użycia przerwań niż tylko przy wciśnięciu klawisza klawiaturki. Przerwania zewnętrzne mają wyjątkowo ograniczone zastosowania. Nadają się np. do tego, żeby obsługiwać sygnały od innych układów scalonych, świadczące o tym że dany układ ma coś ciekawego do powiedzenia. Do przycisków nadają się wyjątkowo słabo, bo żeby to działało,...
Przerwanie od przycisku jest całkiem trudne do poprawnej obsługi. Po wykryciu zmiany musisz je zablokować, odliczyć czas w przerwaniu timera i ponownie odblokować. Dużo prościej testować przycisk w przerwaniu timera.
Witam! Zrobiłem prosty projekt wysokościomierza ciśnieniowego. Wszystko działa w jak najlepszym porządku. Teraz muszę go przekonwertować aby działał na mniejszej płytce zasilanej z baterii. Z tego powodu postanowiłem użyć funkcji sleep i przerwań. Program ma działać tak: - w funkcji setup następuje inicjalizacja karty i czujnika, jeśli wszystko działa,...
eee... a po co tu licznik? program twoj ma robic jednoczesnie 2 rzeczy: 1. zajmowac sie wyswietlaniem czegos na wyswietlaczu (przerwanie od timera moze byc) 2. sprawdzac, czy nie jest wcisniety jakis przycisk jesli jest wcisniety pierwszy, to zwieksza cyfre, a nastepnie sprawdza, czy cyfra przekroczyla 9, jesli tak, to zeruje ja. jesli drugi, to z grubsza...
To da się bardzo prosto zrobić z przerwaniem od zbocza: - przerwanie od zbocza blokuje przerwanie od zbocza i uruchamia timer w trybie one shot, - przerwanie timera włącza przerwanie od zbocza. Jak widać wystarczy dedykowany timer i dwa przerwania i już można obsługiwać przycisk przerwaniem od zbocza. Zamiast dedykowanego timera może być programowy...
To w takim razie może uruchamiać mój pomysł przerwaniem? Wtedy te przerwania timera, co kilka ms, byłyby wykonywane tylko podczas naciśnięcia przycisku? 1. Przerwanie zewnętrzne uruchamia timera (co kilka ms), samo blokuje siebie. 2. W przerwaniu timera robimy to co wyżej, dodatkowo jeśli wykryjemy puszczenie przycisku (tylko dopiero jak już mamy stan...
Port a nie ma przerwań, ale jeśli to ma być obsługo przycisku można wykorzystać przerwanie timera co np 50ms. przy 2 wykryciu stanu niskiego wykonujesz odpowiednie działanie. przy 2 bo dzięki temu od razu wyeliminujesz drgania styków.
1) Czas masz źle policzony, rzeczywiście wychodzi 2 sekundy :) Policz jeszcze raz, np: #define F_CPU 14745000ul #define TIMER_PRESCALE 1024 #define SECONDS(s) ((s)*(F_CPU)/(TI... 2) podpięcie przycisku pod przerwanie to pomyłka - poczytaj o eliminacji drgań styków 3) po wyłączeniu diody musisz zatrzymać...
W jakimś przerwaniu timera migasz diodą. w trakciemigania sprawdza jakąs flagę czy ma migać a jak nie to wylacza diodę. W pętli jak klawisz sie nacisnie (zakładamy tylko jeden stan - wyłaczenie - a właczenie migania następuje poprzez inny magiczny przycisk = reset) ustawiasz flagę na niemiganie. Jezeni wyłaczenie ma nastapić natychmiast (a nie przy...
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?
Przerwanie wywoływane przyciskiem, oraz drugie, od timera, które liczy czas. W momencie pojawienia się przerwania zewnętrznego, zapamiętujesz licznik w tablicy, zerujesz go i czekasz na następne.
Proste - w przerwaniu timera jakieś 50 razy na sekundę oglądasz bieżący stan każdego przycisku, porównujesz z poprzednim, który zapamiętałeś i jak wykryjesz, że poprzednio był zwolniony a teraz jest wciśnięty - robisz to, co trzeba (włączasz/wyłączasz cośtam).
Zupełnie zły pomysł. Przerwanie timera 50 Hz sprawdza stan przycisku. Przy wykryciu wciśnięcia przestawia zmienną określającą kierunek. Co któreś przerwanie na podstawie zmiennej kierunku zmieniamy sterowanie diod. Na oko max. 20 linii kodu w całym programie. - zainicjować port i timer - 4 line, test przycisku - 4 line., odliczanie i zmiana - pewnie...
Że w sensie przerwaniami mierzyć czas a w loopie obsługiwać przyciski? Dowolnie byle nie tak jak Ty to zrobiłeś. W przerwaniu timera obsługiwać przycisk, czy w loopie, będzie lepiej lub gorzej - ale poprawnie. W przerwaniu zewnętrznym niepoprawnie. Dlaczego - poczytaj choćby na elektrodzie.
Tlumaczylem, ze restart bedzie tylko raz mozliwy, w petli programu. Nie napisales jasno, ze ma byc w kazdej chwili. Moze jutro ci wlepie kawalek kodu. ________________________________________... CONFIG INTx = LOW LEVEL On Intx Przerwanie Enable Interrupts do loop:end Przerwanie: disable intx '.... tu reset '.... enable intx Return...
tak jak pisze poprzednik: sformatuj i napisz od nowa. na pierwszy rzut oka: - masz dwie pętle nieskończone (while(1){}) - nie bez powodu podałem Ci odczyt stanu przycisku wewnątrz wektora przerwania (ISR(TIMER2_COMP_vect)), ponieważ polega on na odczytywaniu stanu przycisku co 10ms (przerwanie Timera) - Ty odczytujesz stan przycisku wewnątrz pętli głównej...
Ja bym sugerował podpiąć przycisk pod przerwanie zewnętrzne. Jeden timer byłby puszczany i zatrzymywany w przerwaniu do pomiaru czasu, a drugi do multipleksowania wyświetlania.
Co do bascomowego symulatora to działa on u mnie bardzo wolno, a Hardware simulator wyświetla jakieś bzdury Symulację można przyśpieszyć dodając $sim , ale działa to przez usunięcie opóźnień, więc może zmienić zachowanie. W każdym razie polecam przyjrzeć się co się dzieje w pamięci RAM. [url=https://avrhelp.mcselec.com/index.h...
Nie po to wymyślono przerwanie od portu, żeby wykrywać stan przycisków. Jeśli uprzesz się na takie rozwiązanie, potrzebujesz dwóch przerwań - od portu i od timera. W przerwaniu portu blokujesz dalsze przerwania i uruchamiasz timer, a w przerwaniu timera ponownie odblokowujesz przerwanie portu. Na samym przerwaniu timera bez przerwania od portu jest...
cześć. A w przypadku kiedy program jest w obsłudze przerwania od Timera a ja w tym momencie kliknę na którykolwiek przycisk to czy program wykryje to kliknięcie czy nie??. Czy dopiero kiedy skończy obsługiwać przerwanie od Timera program widzi kliknięcia od innym przycisków?? I co zrobić żeby w czasie wykonywania obslugi od Timera program również obsługiwał...
Jest taka jedna święta zasada: w przerwaniu się NIE CZEKA. Na nic! Zgłaszanie przerwania od przycisku w zasadzie służy tylko do jednego - budzenia systemu z głębokiego uśpienia, co u Ciebie nie ma zastosowania. W każdym innym przypadku prawidłowa obsługa przerwania od przycisku jest znacznie bardziej złożona, niż obsługa przycisków w przerwaniu timera....
Zamiast pętli while skorzystaj z komponentu timer . Timer załączaj i wyłączaj przyciskami.
Jak widać masz wykrywać naciśnięcie (zmianę stanu przycisku w przerwaniu timera i po wykryciu zmieniać stan automatu, a zapalać diody w zależności od stanu automatu. 2 linijki kodu na wykrywanie i zmianę stanu plus jedna na zapalanie diod z wektora - razem 4 linie kodu w przerwaniu timera (dla jednego przycisku, dla dwóch pewnie z 8).
Nie używaj przerwania od przycisku. Testuj przycisk w przerwaniu timera. Było już na ten temat ze 100 wątków. Ile masz tych przycisków? Schemat jakiś by się przydał i opis, jak to ma działać.
Niestety ale nie mogę zrezygnować z delay_ms ponieważ jest to ,,obowiązkowy punkt programu,, Poszukaj na forum kodu multipleksującego wyświetlacze LED w oparciu o przerwanie od timera. W pętli głównej zrobisz sobie opóźnienie, test stanu przycisku i zmianę zawartości wyświetlanych znaków. Niestety ale nic nie znalazłem...
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...
Przyciski "floating" - czyli pryz zwolnionym przycisku mamy losowy stan wejścia z możliwymi oscylacjami. W dodatku używasz przerwań od przycisków, o których co tydzień tu piszę, że to nie jest dobry sposób na przyciski. Ignorowania drgań ani śladu w oprogramowaniu. To chyba nie ma prawa działać. Zacznij od przerwania timera - tam testuj stan przycisku...
Witam, zmodyfikuj swój program: http://www.elektroda.pl/rtvforum/topic33... W programie obsługi przerwania timera dopisz: Badanie stanu przycisku z uwzględnieniem drgań styków. Obsługę programowego timera liczącego przerwania pomiędzy przyciśnięciami przycisku, w zależności od długości słowa tego timera możesz mierzyć czasy rzędu minut, godzin,...
Od każdej reguły są wyjątki. D wybudzania z głębokiego uśpienia możesz użyć przerwań od przycisków, tylko wtedy musisz również użyć przerwania timera i obsługa przycisków z 2 linii na pojedynczy przycisk rośnie do jakichś15..20. Masz też timer LPTIM, pracujący w trybach głębokiegu uśpienia - do testowania przycisków wystarczy jakieś 20 Hz.
"Program i założenia są błędne". ;) Przycisku nie obsługuje się przy użyciu przerwania portu - należy to robić przy użyciu przerwania timera. Ponadto w programie jest jeszcze jeden paskudny błąd: z powodu operacji logicznych na portach w obsłudze przerwania, opercje na portach w pętli głównej muszą być wykonywane w sekcji krytycznej - przy zablokowanych...
Witam, Ile jeszcze razy trzeba będzie napisać, że przycisków NIE obsługuje się przy użyciu przerwań generowanych przez zmianę stanu wejścia? Temat powraca co kilka dni. Rozwiązanie, które Autor próbuje wdrożyć, po usunięciu błędów związanych z programowaniem timera i tak nie będzie działać, więc po co te starania o poprawne zaprogramowanie niedziałającego...
Bez podłączenia impulsatora do INT nie będzie działania poprawnego w żadnej prawie konfiguracji z przyciskami na tych samych pinach. Timer zaprzęgnięty do tego ale czasy aktywacji w licznikach dobrane w praktyce dla impulsatora i przycisków. Podłączenie impulsatora, czy przycisku pod przerwanie nie jest dobrym pomysłem. Jeśli coś ci się gryzie to masz...
No to tak: Jeżeli dobrze czytam program to masz 4 przyciski, timer ustawiony tak aby przerwanie od niego występowało co 50 Hz i nic poza tym. Używasz tylko przerwania od Timera - boisz się innych? Czy może to tylko nieznajomość AVR. Aż prosi się żeby przyciski działały pod INT0 / 1 - zewnętrzne przerwanie i po kłopocie. Następnie _delay_ms(750); zamienił...
Wydaje mi się źe coś jest nie tak ze sprawdzaniem stanu przycisku- nie bardzo mogę to zrozumieć. Klasycznie to robi się tak: if(przycisk==0) delay() if(przycisk==0)//dalej 0 przycisk=1 //naprawdę wciśnięty Można też inkremantować jakąś zmienną aby sprawdzić to 3 czy więcej razy. A lepszym sposobem jest do liczenia opóźnień wykorzystać Timer. I tak masz...
Popatrz tu: http://mikrokontrolery.blogspot.com/... -ostatni przykład. No i oczywiście nie używaj przerwań od przycisków, a przerwania timera - tak, jak w tym przykładzie.
Da się zrobić. Użyj przerwania timera do sprawdzania stanu przycisku i modyfikacji wypełnienia PWM dla serwa.
W przerwaniu od timera, które ma następować co ileś tam ms (20, 30). Bufor to dość patetyczne słowo :D chodzi o tablicę lub po prostu jakieś zmienne gdzie jest przechowywany stan przycisku.
(at)Piotrus_999 Te tajemnicze biblioteki są dostępne w internecie od ponad 10 lat bo sam używałem ich do pracy magisterskiej. Użycie google pozwoli Ci rozwikłać ta zagadkę. (at)Soberro Według mnie masz problem z problem z obsługą przerwań od przycisku. Byćmoże robisz tam coś czego nie powinieneś. Bez kodu nie da się więcej powiedzieć. Powinieneś zrezygnować...
Antystatyk - sprawa polega na tym że masz źle napisany program. Wyświetlanie zawsze robi sie w przerwaniu. Obsługe klawiszy i innych bzdetów w głównej pętli programu. I nie interesuje cie wtedy czy masz debounce czy wait 200. Wyświetlacze zawszę będą działały prawidłowo. Więc popraw swój program. Obsługa i multipleksowanie wyświetlaczy do przerwania...
Do obsługi przycisków NIE używa się przerwań zmiany stanu, a przerwania timera (w którym programowo testuje się stan przycisków). http://mikrokontrolery.blogspot.com/2011...
Radziłbym Ci zobic tak: Cały PWM zrób na przerwaniu od jakiegoś Timera; nie uzywaj zmiennych typu single, jeżeli częstotliwośc przerwań bedzie odpowiednio szybka wystarczy zmienna typu byte lub word. Obsługe LCD czy przycisków i innych obliczeń zostaw w pętli główne Przykładowy PWM dla portb.3: Gdzie a to jakas amienna a do b podajesz wartosc PWM (0-255)......
Kod będzie działał na LPC1343 tylko należy zmienić plik nagłówkowy jak i na większości Cortex'ów od NXP. Jak już wcześniej wspomniałem najlepiej program przepisać by korzystał tylko z jednego przerwania timera CAP (przerwanie capture).
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.
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...
Tak to jest, kiedy nie sprawdza się stanu przycisków w przerwaniu timera...
W tym wątku liczyłem na konkretną wskazówkę na temat wektorów i C w xpresso Wszystko co potrzeba do uruchomienia przerwań dla Timera16B1 z częstotliwościa 1Hz [syntax=c]LPC_SYSCON->SYSAHBCLKCTRL |= AHBCLKCTRL_CT16B1; LPC_TMR16B1->PR = 50000; LPC_TMR16B1->MR3 += 1000; LPC_TMR16B1->MCR |= ( 1 << 9 ); LPC_TMR16B1->TCR = 1; NVIC_SetPriority(TIMER_16_1_IRQn,...
Po pierwsze - jeśli chcesz się przekonać czy kod działa to go uruchom i to sprawdź. Po drugie - nie wiem po co tak bardzo grzebiesz w rejestrach timera, wpisujesz jakieś własne wartości do TCNT0 i TCCR0 w przerwaniu, jaki to ma cel? Uruchom przerwanie i zapomnij o nim: [syntax=c]#define KEY_UP(PINB & (1<<3))//PB3 - przycisk UP - do masy. ......
Tego się tak nie robi. Uruchom przerwanie timera. Zapisz wartości strowania portów dla kolejnych kroków w tablicy stałych. W przerwaniu timera testuj przycisk, a co pewną liczbę przerwań wyrzucaj na porty kolejną wartość z tablicy.Przy takim podejściu cały kod zmieści się w kilkunastu liniach, może dwudziestu paru, a jego długość nie będzie zależała...
A AVRach oprócz nowej serii Xmega nie ma priorytetów przerwań. Obsługa przerwania blokuje wszystkie przerwania. Rozwiązaniem jest timer. Nie zwykłem wykorzystywać przerwań zewnętrznych do przycisków. Lepiej wykorzystać timer. Sprawdzając co np 100ms ich stan. 2x wykrycie kolejno mamy akcję. Dodatkowo w ten sposób łatwo zrealizować inna funkcje przycisku...
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ąś...
Uruchom przerwanie od Countera (najlepiej od porównania wartości zliczonej z ustawioną) i zmień stan portu w podprogramie obsługi przerwania lub prościej, ale mało elegancko zmień [syntax=basic4gl]If Counter1 = 100 Then ...[/syntax] na [syntax=basic4gl]If Counter1 >= 100 Then ...[/syntax] Nie tak jest to, że w chwili zliczenia setki nasz if może się...
Ech, ostatnio min. 2 razy w tygodniu piszę tutaj, że przycisków NIE obsługuje się na przerwaniach, a w przerwaniu timera. Tymczasem co chwila ktoś pokazuje kod i zadaje pytania o przyczyny niedziałania urządzenia z przyciskami podpiętymi do wejść przerwań. Uparciuszki... To nie działa, bo nie ma prawa działać. żeby działało - trzeba dopisać z 15 linii...
Masz błąd w samej koncepcji. Przyciski obsługuj w przerwaniu timera, a LCD w pętli głównej. Nie możesz czekać na LCD w przerwaniu, a testowanie przycisków bez bazy czasu to nieporozumienie.
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...
Umieść obsługę przycisków w przerwaniu timera.
Za to tym, co na pewno należy zrobić w przerwaniu timera, jest badanie stanu i eliminacja drgań przycisków. Eliminacja drgań styków w przerwaniu timera i na dodatek na pewno. Kiepska idea. Albert
Po pierwsze pozbądź się waitów, po drugie przerwania. Podam hasła do opracowania: Timery - odmierzanie czasu, przerwania, timing zdarzeń Przyciski - podciąganie, odczyt z rejestru PINn
A ja stawiam na błąd w oprogramowaniu - zła obsługa przycisków bez eliminacji zakłóceń, ktśre - jak widać - w tym środowisku występują. Oprócz tego przyjrzałbym się połączeniom przekaźników i zasilaniu płytki mikrokontrolera. Na początek pokaż procedurę obsługi przerwania timera z obsługą przycisków.
Jak już Ci pisałem Stoper zrobił bym tak: 2 guziki podłączone do przerwań: 1 guzik przerwanie: if(FlagCount) { FlagCount = 0; Wyłącz Timer } else { FlagCount = 1; Załącz Timer } Pochodzące od 2 guzika: FlagCount=0; Wylacz Timer; ss=0; s=0; m=0; h=0; Pochodzące od Timera: ss++; if(!(ss%20))FlagDisplay=... i...
Problemy są dwa: błędna konstrukcja kodu i użycie przerwania od przycisku. Zacznij od zaprogramowania timera tak, żeby zgłaszał przerwania z częstotliwością np. 100 Hz (tryb CTC). Zrób pustą pętlę główną. W przerwaniu timera sprawdzaj programowo stan przycisków i reaguj. Przyda się konwencja automatu: [syntax=c]switch (stan) { case S_START: if (P1)...
Jak powinna wyglądać konfiguracja timera i przerwania wyzwalanego przyciskiem? Kawałek kodu z opisem na pewno by mi bardzo pomógł i sam bym to powklejał :)
Odpowiedź standardowa; zacznij od przerwania timera, zgłaszanego z częstotliwością np, 50 Hz. W przerwaniu sprawdzaj przyciski, odliczaj czas i zaświecaj diody.
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 wszystko to jedna wielka prowizorka. Możesz dołożyć do pętli while () oczekującej na zwolnienie przycisku sprawdzenie naciśnięcia drugiego i odpowiednią reakcję. To powinno być zrobione zupełnie inaczej, w przerwaniu timera, z notowaniem stanu przycisków w oddzielnych zmiennych.
Zacznij od timera - przerwanie z częstotliwścią np. 100 Hz, w nim testowanie przycisków i sterowanie diodami.
W ogóle zabierasz się za to źle - przerwania od przełączników to zły pomysł - poczytaj o drganiach styków i zobacz ile przerwań może wygenerować jedno przełączenie. Stan przycisków sprawdzaj cyklicznie w przerwaniu timera (są biblioteki Timer...).
Zacznij od przerwania timera - w nim sprawdzaj stan przycisku, odliczaj czas, włączaj i wyłączaj odbiornik.
Ten program jest zły, bo nie da się w nim w prosty i poprawny sposób zignorować drgać styków. żeby zignorować drgania musisz użyć przerwania timera, a jeśli użyjesz przerwania timera - nie ma sensu używać przerwania od przycisku.
timer przycisk atmega8 przerwać timer atmega przerwać timer
honda civic temperatura silnik sonda paliwa wyłączenie tranzystor a1266
apple watch wyłączniki dotykowe
FirstChip FC1178BC USB2DISK 32GB Fake Capacity, Micron 1GB NAND, VID FFFF, MPTool Recovery Skoda Fabia 2 1.2 2009 AC STAG 200 GoFast LPG Not Switching to Gas – Three Beeps, Flashing Green LED