Nie będę sie rozpisywał: Dim T1 As Single , T2 As Integer ... T1 = -123.50 T2 = T1 'bez części ułamkowej T2 = Round(T1) 'zaokrągli zgodnie z prawami arytmetyki ... Pozdrawiam Piotrek
Warunek w if nie będzie spełniony bo raczej te kilka instrukcji w przerwaniu nie bedzie się wykonywać 20ms. Czas wykonywania tego ISR nie ma nic wspólnego z wartością _debounce_timer w momencie porównania.
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.
(at)Jakub17 No dobrze. A jaka jest szansa na wykonanie kodu wyłączającego diodę po puszczeniu przycisku? :)
Brutus_gsm : Radził bym Ci przeprojektować trochę ten kod: ustawianie flagi I (sei()) w przerwaniu jest największym błędem (chyba, że wiesz co robisz oraz to kontrolujesz). Przed wyjściem z funkcji przerwania ustawiasz flagę I (jeśli przyjdą kolejne przerwania, pojawią się kolejne wywołania i przepełni się stos - błąd), po czym usypiasz procesor (zakładając...
Moim zdadniem najlepiej jest w przerwaniach ustawiać flagi zezwalające na wykonanie danej czynności, np. odświerzenie ekranu, a samą czynność wykonywać w programie głównym. Jest z tego taki zysk, że przerwania, które jednak blokują wykonywanie się kodu, wykonują się szybko. Program główny, który może być przerywany wykonuje się w chwilach wolnych. Oczywiście,...
ale nie wiem jak podejsc do przerwan zewnetrznych (przyciski). Przyciski mam podlaczone pod: P3.3 (Int1), P3.5(T1), P3.4 (T0), P3.2 (Int0). Jak to jest mozliwe ze sterujac multiplekserowo wyswietlaczami segmentowymi wysylajac aktywny bit na port P3, moge jednoczesnie zglaszac zewnetrzne przerwania (z przyciskow)?? Możesz. Ale dlaczego przyciski mają...
W trakcie obsługi przerwania przychodzi następne i czeka w kolejce. I czekać będzie nie ważne jak bardzo zostanie "przeciągnięte" przerwanie.
Witaj, No to na zachętę przerwania od przycisku: http://www.protostack.com/blog/2010/09/e...
Sama fraza "priorytet przerwań od przycisków" sugeruje błąd koncepcyjny w projekcie, bo przycisków nie obsługuje się an przerwaniach. Z kolei priorytety DMA nie mają nic wspólnego z priorytetami przerwań, więc całość brzmi mocno podejrzanie. Moim zdaniem błąd w koncepcji całości powodujący kolejne błędy w implementacji programowej. Jeżeli używasz DMA...
Witam, w dobrym kierunku idziesz, ale to ci nie zadziała bo jak? skoro na początku programu tylko raz ustawiasz piny klawiszy jako wejścia oraz pin przerwania INT0 też jako wejście. Więc co ma tutaj wymuszać stan niski na wejściu INT0? nic!. Aby ten sposób zadziałał - musisz jeszcze pomyśleć o zmianie kierunków portów wtedy gdy trzeba. Generalnie założenie...
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...
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,...
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...
Ok zrobiłem [syntax=c] #define F_CPU 8000000UL #include <avr/io.h> #include <util/delay.h> #include <stdlib.h> #define red OCR0A #define white OCR0B #define blue OCR1A #define green OCR1B int licz = 0; void PWMinit(void) { DDRD &= ~(1 << PD2);//switch off PORTD |= (1 << PD2);//switch on //DDRD &= ~(1 << PD3);//switch...
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...
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,...
;... start: ;jmp delay rcall delay ;lub call delay ;... haslo2: ;jmp delay rcall delay ;lub call delay ;... ;---------------------- delay: ;... ;clr r31 ldi r31,255 ;... in r17,pina ; cp r17,r31 brne exit_delay ;... exit_delay: pop r23 ;... pop r16 ret ;---------------------- Niestety nie wszystko działa tak jak powinno Powyżej masz...
Próbuje zrobić obsługę przycisku w przerwaniu z funkcją eliminacji drgań. Problem polega na tym,że po odmierzeniu zadanego czasu przerwanie wywołuje się samo po raz drugi mimo że nie naciskam przycisku. Próbuję to zrobić tak, że gdy zmienna naciskany jest przycisk na PB3 to blokuje przerwania od tego wejścia, uruchamiam timer i gdy zmienna "delay" doliczy...
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...
Jeszcze tu: http://www.elektroda.pl/rtvforum/topic18... Ale te zwykłe impulsatory stykowe to są paskudne. Drgania styków trwają dłużej niż czas wygaszania. Zrobiłem też impulsator z silnika krokowego- lepiej ale nie doskonale. Kierunek trzyma- ale co jakiś czas gubił kroki. Trzeba by zastosować jakiś co 7.5 stopnia- a nie mam. Jednak enkoder...
Na pewno musisz zrozumieć jak działają operatory: 1. Na początek ~ i & 2. || w następnej kolejności. Albert no to analiza krok-po-kroku: No niestety milisz się bo owszem jest robiona operacja PIND & 0b11111100 ale da ona 1 gdy któryś z przycisków od PD7 do PD3 nie będzie wciśnięty (więc jego bit w rejestrze PIND będzie ustawiony) żeby to poprawnie...
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...
500ms to trochę za dużo jak na drgania styków. To jest microswitch czy jakiś przycisk przemysłowy? Spróbuj wyzwalać przerwanie stanem niskim a nie zboczem opadającym. Ustawiając inny zegar nie spalisz chipu. Co najwyżej ustawiając niższy zegar niż dotychczas możesz mieć problemy z zaprogramowaniem jeśli nie zmienisz też częstotliwości w programatorze....
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.
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.
W programie musisz sam badać stan przycisku. Przerwanie to coś innego. Chyba że przycisk będzie podłączony do któregoś INTx.
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.
Piszesz, że masz doświadczenie z LCD i Atmega8. Więc mogę Ci pomóc to zrobić.
Cześć, Wpadł mi w ręce zestaw ewaluacyjny EK-RA6M3 od Renesasa. Postanowiłem podjąć się próby nauczenia programowania MCU w tym zestawie. Znalazłem krótki poradnik na youtube jak odpalić pierwszy program typu "Hello World" czyli miganie diodą LED. Udało mi się program uruchomić i mniej więcej opanować jak migać diodami z różną częstotliwością. Kolejnym...
Co do Twojego problemu deklaracji typu układu - typ ten zdefiniowany jest w Makefile (MD, HD, CL, ...) Jeśli używasz przerwań, to ustaw jakąś wielkość stosu dla przerwań w skrypcie linkera (domyślnie jest 0, bo nie ma przerwań w przykładach). 4\/3!!
prosze bardzo http://www.gsmok.pl/pokaz_produkt.php?pr...
Ok, pisanie programu zostawię Tobie, natomiast podam Ci co trzeba zrobić. Mając już ustawione wszystkie piny jak należy (wejścia/wyjścia) chyba najlepiej napisać coś takiego: [syntax=c] int state = 0; //stan przycisku, ustawiasz na jeden za pierwszym wciśnięciem while(state == 1){ //akcja z diodami } [/syntax] I teraz musisz zaprzęgnąć przerwania, dokładniej...
jak już chesz koniecznie marnować wolne piny (bo może masz ich zbyt wiele) to lepiej podłącz sobie te przyciski przez 74HC30 i będziesz miał jeden wspólny sygnał dla przerwania INT jednocześnie wejścia 7430 podłącz pod jakiś port i w przerwaniu odczytasz sobie ich stan. Nie jest to najlepszy sposób bo to samo można zrobić w przerwaniach i uzyć klawiatury...
boohoo -> przecież jeśli masz AVR-GCC to masz taki folder: \WinAVR-20080610\avr\include\avr zajrzyj tam sobie, masz tam definicje wszystkiego czego chcesz i do każdego procka w tym twojego iotn2313.h poza tym ten twój kod ładnie się kompiluje i bez żadnych ostrzeżeń jeśli zrobisz tak: #include <avr\io.h> #include <util\delay.h> //#include...
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;
Nie ma jednej, jedynie słusznej drogi. Każdą funkcjonalność można opracować na wiele sposobów. Jeśli potrzebujesz podłączyć przycisk do przerwań zewnętrznych, możesz to oczywiście zrobić. Po to one są, by z nich korzystać, byle świadomie :) Istotne jest tylko jedno - program ma działać tak jak tego sobie życzysz i spełniać założenia projektowe. Edit:...
Podłączyłeś tylko jeden wiersz i jedną kolumnę, więc możesz odczytać co najwyżej jeden przycisk.
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...
Najłatwiej to zrób tak: Wszystkie przyciski podłacz do pinów procka, daj podciągnięcie za pomocą rezystorów wewnętrznych ,oprócz tego za pomocą diod zsumuj te sygnały ,a nastęnie zsumowane sygnały daj na wejście przerwania np INT0. Musisz to zrobić tak że przyciśnięcie któregokolwiek przycisku spowoduje zmiane (spadek napięcia ) na wejściu przerwania...
1 Przeczytaj notę katalogową ATMegi 2 Podłącz przyciski, najlepiej pod piny z przerwaniami (druga strona przycisku do masy), wyświetlacz pod któryś z portów (np PORTB). Rezystory ograniczające prąd w poszczególnych segmentach (na oko kilkaset omów :)) 3 Podłącz stabilizowane zasilanie 5V do układu 4 Napisz program sterujący (w wybranym języku) 5 Podłącz...
Tak, zwróciłem uwagę profilaktycznie :) W Twoim pseudokodzie brakło tylko gaszenia flag - nie zapomnij o tym.
Ja bym spróbował podpiąć przyciski pod przerwania int0 i int1 i reagować tylko na zbocze falling. Wciśniecie i trzymanie jednego przycisku nic wtedy nie da. Ustawić flagi i zerować je po wykonanej operacji.
A liczenie Ci samo idzie bo umieściłeś kod "liczący" w jakimś przerwaniu: SIGNAL(SIG_OVERFLOW0) { licz++; } Nie wiem co to jest, ale wygląda jak przerwanie od Timera0. Dodano po 2 Już pomijam fakt że obsługa przycisków w przerwaniu (bez żadnego odkłócania, bo samo wykorzystanie przerwania to może jeszcze nie jest tragedia) jest trochę...
PA1 to nie jest nóżka związana z INT1! Pod PA1 siedzi PC INT1 - Pin Change Interrupt. "Zwykłe" przerwanie zewnętrzne INT1 to nóżka PD3 ;)
Witam, Dodaj jeszcze bibliotekę stm32f4xx_syscfg. A to wywołanie: GPIO_EXTILineConfig(GPIO_PortSourceGPIOA... GPIO_PinSource0); to powinno być: SYSCFG_EXTILineConfig(EXTI_PortSourceGPI... EXTI_PinSource0); Pzdr
Może zacznij od przeszukania forum z hasłem "przerwania od przycisku" i poczytaj te 100 wątków, w których tłumaczymy, że nie zgłasza się przerwań przyciskiem, ok?
Na procu jest uruchomiony miernik częstotliwości (stacjonarny). Wykorzystane są dwa 16bitowe timery, uruchomiona jest komunikacja po rs232, zegar czasu na PCF8583 z podtrzymywaniem bateryjnym. Nie bardzo wiem jak to wszystko przełożyć na BASCOM AVR. Na początek spróbuj uruchomić przerwania oraz timer0 w trybie normalnego licznika - tak aby liczył z...
Pokaż cały program. Jeśli masz schemat to także załącz.
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ć...
Próbuję zrozumieć działanie przerwań i coś mi to nie wychodzi, chciałem uzyskać efekt że po naciśnięciu przycisku program który jest w pętli nieskonczonej obsługuje przerywanie ale mi to nie wychodzi, o to fragmenty kodu: #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> ENABLE_INT0_FLAGING; waitms(unsigned...
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...
if((PIND & _BV(PD2)) PORTB |= _BV(PB2); else PORTB &=~_BV(PB2); Jak to ewentualnie zapisać w jednej linii to już sam pomyśl.
Jak się nazywa to zobacz w pliku gdzie masz wektory. Ale nawet jeżeli tak się nazywa to przycisk w takim przerwaniu to zły pomysł. Dlaczego to poszukaj sobie na forum bo temat wraca co kilka dni. Zresztą nie widzę włączenia zegara dla exti. Zresztą wątpię żeby tak się nazywał: np starup z Cube to EXTI0_IRQHandler albo EXTI15_10_IRQHandler
Zerowanie flagi na końcu przerwania - niedopuszczalne
Klawiszy (poza wyjątkowymi sytuacjami typu wybudzanie uC) nie robi się na przerwaniach INT. Delaye w przerwaniu to nieporozumienie. Twoje przerwanie realizuje się tylko po wciśnięciu przycisku, więc trudno by było, aby zwróciło informację o jego zwolnieniu. Zrób przerwanie zegarowe co 25-50ms i cyklicznie sprawdzaj stan klawiatury. Opanujesz w ten sposób...
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. NIe lutować bo spalisz folię i nici z naprawy tylko klej przewodzący do kupienia w każdym elektroniku. Pozdrawiam
Najprościej w zewnętrznym warunku daj Timer1.Enabled:=FALSE;. Spowoduje to zatrzymanie timera.
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ć ;)
Musiałbyś obsługiwać sterowanie przynajmniej jednego silnika w przerwaniu, bo w przeciwnym wypadku procedury te będą się zakłócać. Spróbuj napisać program z wykorzystaniem zewnętrznych linii przerwań, tak, aby przy naciśnięciu przycisku program wykonywał skok do odpowiedniej funkcji obsługi przerwania :]
Możesz dać przyciski w przerwania.
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.
Zacząć od przerwania timera... Cały kod w C to po 2 linie kodu na wykrycie naciśnięcia każdego przycisku przerwania, 2..4 linie do sterowania diodą i z 8 linii inicjowania w main().
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)
Przerwania typu PCINT działają podczas zmiany stanu pinu, obojętnie czy to jest zbocze narastające czy opadające. Poprostu ma być to zmiana stanu, tak więc jeśli naciśniesz przycisk to przerwanie bedzie generowane dwa razy (w momencie naciśniećia i puszczenia). Natomiast inaczej jest w przypadku przerwań INT0 i INT1 gdzie możesz sobie wybrać kiedy ma...
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.
Można też zrobić sobie ładną strukturę do przechowywania danych o przycisku, a potem z tych struktur utworzyć tablicę i dodatkowo tablice wskaźników na funkcje dla każdej akcji każdego przycisku i mamy wszystko rozwiązane w eleganckiej i szybkiej pętli w przerwaniu.
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.
Spróbuj w programie użyć przerwań dla przycisku. Teraz program działa już tak jak powinien, pętla działa bez delaya dlatego co obieg pętli wyświetlacz się odświeża. Żeby pisać na wyświetlaczu po wciśnięciu przycisku musisz tekst dodać w warunkach przycisku a nie w głównej pętli.
atmega32 tyle co sie juz zorientowalem to: ISR(INT0_vect) { } wówczas zmieniam pind2 posiedzialem poczytalem i zadzialalo
Witam, No trochę jaśniej jest. Ram który przeznaczyłeś na stos jest prawie całym obszarem RAMU mikrokontrolera. 0x1FE4 - wielkość twojego stosu (obliczone wierzchołek stosu(0x1FF0) - początek sterty(0xc). Stosu Ci zapewne nie zabraknie. np. wywołujesz w mainie moja_funkcja(int param1, int param2, char tab[20]) to musisz przy wywoływaniu z przekazaniem...
Jeśli w D7 to: [syntax=delphi] procedure TKlasa.Nazwa(); begin //dowolny kod mający się wykonać bezpiecznie end; //w wątku: ... Synchronize(Nazwa); ... [/syntax]
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...
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...
Rozumiem że L na wyzwalaczu powinno się pojawić w momencie wciśnięcia przycisku ppoż ? Normalnie podłączony jest bez napięcia ? Tak. Tak działa wzrostowy (wybijakowy). Gdyby to był zanikowy to działałby po przerwaniu zasilania.
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ż...
Nie każę stosować timera. Tylko takie użycie delay powoduje dość sporą jego niedokładność. Jeżeli mamy stałe skoki czasu to można to zrobić tak: [syntax=c]uint8_t delayTimeInSeconds; void delay() { int i; for (i = 0; i < delayTimeInSeconds; i++) { delay(1000); } }[/syntax] I obsługę przerwania/przycisku zrealizować tak: [syntax=c]#define MAX_DELAY_TIME_IN_SECONDS...
To juz caly program? Masz przyciski na przerwaniach?
Rodzaj przycisku jest bez wiekszego znaczenia . Algorytm : -jesli sygnal "0" nastapi przerwanie-skok do obslugi przerwania -czekaj w procedurze przerwania np. 100 mS -jesli po tym czasie sygnal jest dalej "0" to byl nacisniety przycisk -jesli "1" to byl to sygnal falszywy - zaklocenie -powrot z obslugi przerwania
Linię 2 portu D ustawiłeś jako wyjście i nadal próbujesz używać przerwania od przycisku. Przycisk na przerwaniu Ci nie zadziała, a przy ustawieniu INT0 jako wyjścia możesz upalić bufor wyjściowy zwierając go przyciskiem do masy.
Witam Mój problem wygląda tak: W przerwaniu(1) od przycisku wywołuje funkcję(2) która korzysta z przerwań od przycisków:] Wpisanie w jej kod EXTI_ClearITPendingBit(EXTI_Line5); nie daje wiele, przerwania nie są przyjmowane. Czy jest jakis posob zeby w funkcji(2) korzystac z przerwań od przycisków?
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...
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...
USART na przerwaniu od odbioru, a przycisk na przerwaniu zegarowym co 1/10s.
$regfile = "attiny2313.dat" $crystal = 4000000 Config Pind.2 = Input Config Portd.0 = Output Config Portd.1 = Output Config Portd.3 = Output Set Portd.2 Przycisk Alias Pind.2 Dim Sekwencja As Byte Declare Sub Pierwsza Declare Sub Druga Declare Sub Trzecia Enable Interrupts Enable Int0 On Int0 Przycisk_przerwanie Do Loop End Przycisk_przerwanie:...
Możesz to przecież zrobić "sprzętowo" - każdy przycisk osobno do "dowolnego" portu, a dodatkowo wszystkie razem do portu "z przerwaniem", z tym, że od każdego przycisku do tego specjalnego portu dajesz diodę. Tym sposobem masz tylko jedno przerwanie, ale możesz wykrywać który przycisk został naciśnięty. Ponieważ i tak trzeba kombinować, to możesz zaoszczędzić...
Zanim włączysz konkretne przerwanie włącz przerwania globalne. wpisz tak Enable interrupts Enable int0 Pozdrawiam :)
Podejrzewam, że te Waitms w obsłudze przycisków blokują wyświetlanie. Spróbuj je do testu usunąć. Oczywiście przyciski nie będą wtedy działać poprawnie, ale sprawdzisz wyświetlanie. Obsługa wyświetlania powinna być przeniesiona do obsługi przerwania, ale to już większa przeróbka programu. To przygasanie tak bardzo przeszkadza?
Powtórzę ponownie: Wyrzuć wszystkie delay i zrób animacje na przerwaniach, czyli "Po Bożemu".
No to skoro masz tam przycisk podłączony, a nie masz tam ani INT0 ani INT1 to nie ma możliwości wywołania przerwania sprzętowego. Nie ma tam też komparatora. Jest JTAG, który o ile dobrze wiem nie generuje przerwań. Musisz zrobić obsługę softwareową. Rejestr włączajacy przerwania INT0 i INT1 nazywa się GICR - przepraszam za pomyłkę.
czesc witaj naciskasz przy wl 0 i 5 a potem pod 1 masz ustawienie exp manual a pod 5 automat i zatwierdzasz przyciskiem przerwania kopii.Pozdrawiam
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ć...
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....
To jest pisane pod os`em? W kazdym razie, przerwanie sie wywoluje bo autor pisal to, nawet dobrze dziala dla przycisku wiec mysle ze sprawa samej deklaracji przerwania jest jasna ;) Jesli nie masz oscyloskopu to zastosuj uklad do eliminowania drgan stykow.
Może to zły kierunek podpowiedzi: Tak napisany program powoduje przerwanie na każde drganie przycisku podczas jego naciśnięcia. Może w tym jest przyczyna? Aby to sprawdzić albo zmień program albo dodaj kondensator do przycisku + zmień wywołanie INT1 na wywołanie poziomem nie zboczem.
Można też return wstawić na początku funkcji showStrip() po if od wykryciu wciśnięcia przycisku, w przerwaniu od przycisku to przerwanie wyłączać i włączać z powrotem na początku funkcji case. Jeśli obieg pętli jest za krótki to można tego delay(80) przenieść przed włączenie przerwania od przycisku (pewnie wystarczy mniejszy delay). I tak jak napisał...
Nie miałem na myśli obsługi przycisku w przerwaniu tylko o przycisk, który wykonuje przerwanie w którym jest wysyłanie komendy lub odbieranie (SLAVE). Nie wiem, czy dobrze to rozumiem, ale na wszelki wypadek. Nie wpadnij czasem na rozwiązanie, aby przycisk generował przerwanie. To raczej kiepskie, ale jeśli już, to pamiętaj o debouncingu przycisku...
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.
Jak mówi przedmówca - przyciski + przerwania nadają się tylko do obudzenia procesora lub ewentualnie zasygnalizowania jakiejś krytycznej operacji związanej z klawiaturą (itp.). Drgania styków w takim układzie niestety mogą prowadzić do dosyć nieoczekiwanych i niechcianych efektów.
asembler przycisk przerwania renesas przerwania flagi przerwania
minolta wydruk testowy silnik smart fortwo budowa ogrodzenia
mikrofala samsung elektronika retro
Zielona dioda nie świeci po wymianie baterii Niebieski klawisz ThinkVantage na Lenovo X60