Tymczasowo rozwiązałem problem, choć wartości napiecia na przyciskach nie sa prawidłowo wyswietlane. W kodzie ustawiłem wartość PORTU A na '255' na stan wysoki. I to pomogło mi choć trochę uzyskać widoczność działania przycisku po nacisnieciu. W kodzie w linice przerwania sprawdzania klawiatury sa podane wyniki w mV takie jakie mierzy przetwornik na...
Obsługa przycisków w ten sposób jest trochę nie wskazana, zwłaszcza gdy chcemy zrobić sprzętowy "debouncing" . Polecam lekturę: Nie jest zalecane, aby wprowadzać opóźnienie w przerwaniach. Przerwanie powinno być bardzo zwięzłe i szybkie. Jeżeli chcesz zrobić softwarową obsługę "debouncingu" lepszym sposobem jest wywoływanie przerwania np. co 20ms i...
Twoje przerwanie PCINT2 uaktywnia się, gdy zmienisz stan odpowiedniego pinu. Po naciśnięciu przycisku, program zmienia ci bit LEDbottom w PORTB na przeciwny, a następnie wychodzi z przerwania. Następna zmiana w tym porcie nastąpi dopiero, gdy puścisz przycisk. Jeżeli chcesz, aby migała gdy przycisk jest wciśnięty, powinieneś sprawdzić w przerwaniu,...
Faktycznie, z tymi nawiasami idzie się zaplątać, lecz niestety Twój kod również nie działa. Fakt, występuje inny objaw niż wcześniej, buzzer nawet po naciśnięciu nie chcę zamilczeć po ponownym przekroczeniu temperatury. Aktualny kod: [syntax=c]/* * main.c * * Created on: 2011-08-20 * Autor: Bartekk * ->Uproszczony sterownik pieca CO<- */ #include...
Ok to ja Ci może dopisze komenty do Twojego kodu i zobaczysz co masz nie tak :) [syntax=c]#define READ_KEY_PIN PIND #define SHIFT_KEY_PIN PORTD0 #define DEC_NUM_KEY_PIN PORTD2 #define SHIFT_KEY_PRESSED (READ_KEY_PIN & ~0b00000001)// sprawdzasz czy ktorys z przyciskow poza PD0 nie jest wcisniety #define SHIFT_AND_INC_KEYS_PRESSED (READ_KEY_PIN &...
Każdy z przycisków wywołuje przerwanie INT0. W obsłudze przerwania sprawdza się, który z nich został naciśnięty. Diody są po to, aby przyciski wywoływały przerwanie, ale nie zakłócały się nawzajem.
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...
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 mogło by być tak, że to przycisk generował by przerwanie? ... i pewnie do tego kolejny "delay" w przerwaniu od przycisku w celu eliminacji drgań styku? Nie brnij dalej w te delay'e, bo jeśli będziesz chciał dodać kolejną funkcjonalność to może okazać się to niemożliwe. Zrób sobie timer np. co 10ms i wywołuj nim przerwanie, ale uwaga: nie umieszczaj...
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 dlaczego miał by startować od początku? Niech wraca tam gdzie skończył. Nie widzę też konieczności stosowania przerwania do przycisków. Moja propozycja: Przerwanie timera wywoływane co sekundę. W przerwaniu tym zwiększany jest licznik czasu, ewentualnie ustawiana odpowiednia flaga, a potem w pętli głównej jeżeli flaga ta była ustawiona, to odczytywany...
Póki co jeden przycisk uruchamia pętle zmieniających się jpg ( animacja) a drugi miałby ją przerwać. Choć docelowo miałby ją przerywać odpowiedni sygnał z USB. Męczę się z tym backgrandworkerem, ale nie bardzo wychodzi. Jak wstawiam w Cross-thread operation not valid: Control 'pictureBox1' accessed from a thread other than the thread it was created...
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.
Witam! Staram się rozgryźć dlaczego coś co nie ma prawa działać działa :) obsługa klawisza na przerwaniach Klawisz podłączony do portu PCINT przerwania: [syntax=c] #define _TICK_TIME (1000/((F_CPU / 64) / 256)) #define _DEBOUNCE 20 #define _DEBOUNCE_TICKS (_DEBOUNCE / _TICK_TIME) ISR(TIMER0_OVF_vect) { //przerwanie overflow timera dzielnik 64 (jak widać...
Najlepiej podac przyklad z zycia wziety. Zalozmy ze wykonujesz czynnosc zwana prasowaniem. Nagle rozlega sie szwonek do drzwi. Co robisz?? PRZERYWASZ prasowanie i idziesz zobaczyc kto dzwoni, gdy sie okaze ze to listonosz przyniosl list polecony to go odbierzesz i wrocisz do prasowania. Tak samo jest w procesorze. Wykonuje on program glowny ktory np....
Witam! Temat być może poruszany nie raz jeżeli chodzi o sprawę odczytywania stanu przycisków. U mnie jednak stanowią one niejako tło. Program ma za zadanie badać prawidłowe działanie kontaktronów, które są wyzwalane poprzez magnes umieszczony na wałku silnika krokowego. W załączonym kodzie przedstawia się to w ten sposób, że po włączeniu zasilania silnik...
Pewnie że mamy ;). Użyj przerwań. Najprościej jest zrobić całość 'głównej' części pracy na przerwaniach w następujący sposób: a) Pomiary na timerze 0, wywoływane cyklicznie b) Obsługa przycisków na przerwaniu int0, wystarczy że podepniesz odpowiednio przyciski do pinu int0 i AtMega automagicznie wywoła przerwanie gdy tylko wykryta zostanie zmiana stanu...
Czyli jeśli masz zewnętrzny przycisk to nie ma problemu - konfigurujesz go tak, aby generował przerwanie i już. Nie musisz wybudzać procesor, nic nie musisz sprawdzać. Ktoś wciśnie przycisk -> procesor się wybudza i robi co chcesz. Jeśli energia jest problemem to M88 zużywa jej na dzień dobry 2xmniej przy normalnej pracy.
W programie jest : MCUCR=(1<<ISC01)|(1<<ISC00); Czyli zbocze narastające wyzwala przerwanie. Jest to zabieg celowy czy błąd ? Urządzenie ma reagować na naciśnięcie przycisku czy jego puszczenie? Właśnie miało reagować na puszczenie przycisku. Z tym jest OK. Chociaż tak na prawdę, tu nie miało to zbytniego znaczenia, ponieważ na razie sprawdzam...
W takim razie postaram się jak najdokładniej opisać działanie sterownika. Programu nie napisałem z prostej przyczyny - wolę najpierw się dowiedzieć, czy moja wizja ma sens, zamiast tracić czas na coś co nie ma prawa zadziałać. Sterownik dostaje z portu LTP sygnał STEP/DIR. Mikrokontroler ma za zadanie przetworzyć ten sygnał na sygnał sterujący mostkiem...
Czy ja wiem, czy mi tak strasznie ciężko idzie..... Po prostu nie zrozumieliście czego tak naprawdę nie rozumiem :D Przez cały temat patrzyłem pod kątem funkcji opóźniającej, a wam chodziło, abym napisał zupełnie inny kod niż tu - [url=]Tu przez co długo "rozmawialiśmy" :P. Rzeczywiście ten kod który podałem nie za dobrze działa(ale działa :D). Podaję...
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.
Rozumiem, że rozjaśnianie lub ściemnianie ma następować tylko przy wciśniętym przycisku. Wyrzuć podwójne sprawdzanie czy przycisk wciśnięty. Zamień miejscami inkrementację i dekrementację zmiennej I.
Skonfiguruj port do którego podpięte masz SW1 i SW2 jako wejście z podciągnięciem (jeśli przycisk ściąga do masy). Zamiast wartości AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE użyj AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, w obsłudze przerwania sprawdzaj faktyczny stan przycisku. Na końcu zamień w kolejność 2 ostanie linijki, najpierw zerowanie ew. przerwań, następnie...
Co do odświeżania masz gotowy kawałek w moim drugim poście. Po co sprawdzanie stanu przycisku co 4 ms? Jak chcesz pomiar temperatury co 1s, to dorzucasz odpowiednio skonfigurowane przerwanie z timer1. Zczytywanie co 100ms masz przecież zrobione flagą chyba że nie działa. co do przyciska masz w moim pierwszym poście. Jeżeli coś jest nie zrozumiałe to...
Przerwać delay możesz tylko przerwaniem. Jeśli chcesz mieć możliwość normalnie przerwania delay to rozbij je na sekwencje kilku mniejszych opóźnień pomiędzy którymi sprawdzaj stan przycisków. A najlepiej zrobić to przy pomocy timerów i przerwań.
witam wszystkich. chcialem zrobic uklad w ktorym nacisniecie ktoregokolwiek z klawiszy bedzie powodowalo obsluzenie go wewnatrz procedury obslugi przerwania. szukalem czegos podobnego na forum ale znalazlem tylko opisy ze mozna to zrobic uzywajac diod ale bez zadnych schematow. wiec robie to tak jak na przedstawionym rysunku ale niestety nigdy na wejsciu...
Ja klawiaturkę taką 4x4 zrobiłem odrobinę inaczej, tj. a program obsługi działa na zasadzie wykrycia naciśnięcia jakiegoś klawisza a następnie na tej podstawie sprawdzenia który to klawisz został wciśnięty: void sprawdz(volatile int x) //sprawdza ktory przycisk zostal nacisniety { volatile int wsk=0; volatile int i=0; for(i=0;i<1;i++) //pętla FOR...
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...
Wymyśliłem sobie, że będę obsługiwał klawiaturę matrycową 4x4 na płytce ZL3AVR w przerwaniu generowanym podczas naciśnięcia któregokolwiek klawisza (wyprowadzenie JP13 połączone mam z INT0), siedzę nad tym bardzo długo i nie mogę doszukać się swego myślowego błędu. Pierwszy wiersz (kolumna) działa poprawnie natomiast wszystkie pozostałe działają tak,...
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...
Witam ! Zwracam sie z prosba o rade w sprawie obslugi przerwań. Jestem na ukonczeniu projektu termometru na AT89S52 w ktorym mają działac dwa przerwania - wewnetrzne od timera ktory zapisuje wyniki 10 kolejnych pomiarow do pamieci wewnetrzej u-kontrolera oraz zewnetrzne od przycisku - microswitcha ktory powoduje wypisanie zapisanych wynikow z pamieci...
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...
"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...
Witam Utknąłem z moim kodem i plątam sie w koło ciągle, dlatego proszę o pomoc. W podprogramie "przyciski" przerwania od timer0 mam zrealizowany odczyt przycisków i zrobiłem sobie "flagi czasowe" przyciski: 'przerwanie co 26ms . kod sprawdzania przycisków . incr licz if licz=19 then ' flaga co ok 0,5 s flaga_500ms=0 ' w warunkach początkowych flaga_500ms...
Witam Własciwie to mam na początku dwa pytania , pierwsze to : Konfiguruje port d jako wejscie z podciąganiem do plusa i potem w programie sprawdzam czy przycisk jest wciśnięty Sbis pind,6 Rcall podprogram i tu pytanie w AVR studnio podczas symulacji symulator zachowuje się tak jakby przycisk byl wciśnięty tzn panowal stan niski czyli skacze do podprogramu....
Witam, Jestem w trakcie realizacji lampki RGB jednak napotkałem na pewien problem a mianowicie mam 3 przyciski: 1. zmienia tryb wyświetlania 2. zwiększa szybkość lub kolor (w zależności od trybu) 3. zmniejsza szybkość lub kolor (w zależności od trybu) Pierwszy przycisk obsługiwany jest w przerwaniu pozostałe dwa niestety nie. Po przełączeniu się w tryb...
Witam mam bardzo nietypowy jak dla mnie problem z układem który ostatnio wykonałem. Mianowicie jest to centralka alarmowa oparta o uC ATmega16. Działa na tej zasadzie że pod wejście PB2(INT2) podpięty jest kontrakton (zwiera do masy) do którego przykładam magnes i albo rozbrajam albo uzbrajam centralkę. Z grubsza to wygląda tak: PB2(INT2) skonfigurowane...
Zagląda ktoś do tego tematu?? Może ktoś zagląda, ale Ty na pewno nie zastosowałeś wiedzy którą dostałeś. Z tego powodu zostaną tylko rady w stylu Zaquadnik , którego pomysł jest idiotyczny. BlueDraco powiedział Ci co zrobić, aby obsłużyć przełączanie/wybór programów. Ty zrobiłeś obsługę przycisku w funkcji obsługi przerwania generowanego przez drgające...
Witam. Niestety program który chcę napisać nie działa już w początkowej fazie. Nie wiem dlaczego, dlatego proszę aby ktoś na to zerknął i powiedział co jest nie tak. Generalnie program ma działać tak, że po wciśnięciu przycisku program leci do przerwania, w przerwaniu sprawdza czy przyciśnięcie było krótkie lub długie, po czym ustawia odpowiednią zmienną...
Aby wejść do drugiego warunku i musi przyjąć wartość co najmniej 256, co jest nie możliwe, bo przy i == 255 program nie wejdzie do pierwszego warunku w którym jest inkrementacja. W drugim warunku z kolei nie osiągnie wartości potrzebnej do wyzerowania i. Czemu nie nie zastosujesz if()...else? Faktycznie, niedopatrzenie. Poprawiłem błędy ale i tak działa...
Może powinieneś (na przykład) jednak synchronizować ten timer. Dzięki za sugestię bo nie pomyślałem o tym wcześniej, jednak i to nie pomogło. A może powinieneś (na przykład) w ISR, wyłączyć timer na czas ładowania a następnie włączyć z powrotem. To rozwiązanie pomogło, choć nie bezpośrednio. Bowiem rzeczywiście chwilowe wyłączenie timera i włączenie...
Witam serdecznie doświadczonych w temacie użytkowników forum. Proszę o pomoc w nakierowaniu na właściwe tory, gdyż nie wiem już co robię źle. Znalazłem podobny temat na elektrodzie, aczkolwiek zaproponowane tam rozwiązanie ("przenieś semafor przed włączeniem przerwań") niezbyt mi pomógł. Używam płyteczki niskodolarowej z STM32F103C8T6. Chcę zaprząc...
Atmega 32, program obsługujący klawiaturę - 4 przyciski, odczytywane co 20 ms ( co któreś przerwanie timera 1), przyciski podpięte pod PC), PC0,PC1,PC2,PC3. jeżeli w programie wykorzystuję PC0 i PC1 to jest ok , ale jeśli w pętli obsługi przerwania odczytującego klawiaturę sprawdzam stan przycisków PC2 i PC3 to zgłoszenia przerwania są w każdym odczycie...
Tak wiec plik glowny wyglada to nastepujaco #include <at89c5131.h> #include "zmienne.h" #include "funkcje_lib.h" extern GET_KEY(); BYTE Tablica[10]; //Tablica[0] sekundy //Tablica[1] minuty //Tablica[2] godziny //Tablica[3] dni void RTC_INIT() { RCAP2H =(0-10000)>>8; // licznik zlicza impulsy RCAP2L = (0-10000); // opoznienie 10ms - sprawdzone...
Witam ;) Może w pętli która sprawdza stan przycisku (do..loop programu głównego, albo np w etykiecie obsługi przerwania od licznika) zastosować warunek i inkrementację zmiennej pomocniczej, która podczas gdy przycisk będzie przytrzymany będzie zwiekszać swoja wartość. Można zastosować póniej warunek sprawdzający jej wartość, jeżeli jest taka jaką zadamy...
To tzw. "iskrzenie" zwane profesjonalnie drganiami zestyków likwiduje się na drodze programowej (kolega ma zestaw rozwojowy i pewno nie będzie tam dolutowywał kondensatora). Wprowadza się tak jak moi poprzednicy pisali opóźnienie i sprawdza czy rzeczywiście przycisk został wciśnięty. Ja w przypadku większych klawiatur obsługiwanych matrycowo obsługuje...
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...
szelus przeczytaj dokładnie o co chodzi układ działa ale czasy się nie zgadzają :/ opisałem dokładnie wadliwe czasy pracy optymalizacja jest wyłączona a ta pętla wytłumia drgania związane z przyciskiem, w przerwaniach nie mogę stosować makra _delay_ms(), a po za tym jedna iteracja wykonuje się w 4us jak dobrze pamiętam wiec spokojnie tak szybko nie...
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.
Nie programuje w arduino, ale pisałem program w C, w którym używam 3 przycisków, przy czym za pomocą każdego z nich mogę wykonać 3 różne akcje. Ustaw przerwanie od wybranego timera np.co 10[ms], następnie sprawdzaj stan przycisku, jeżeli wykryjesz naciśniecie przycisku to zwiększaj jakąś zmienną będącą licznikiem. Gdy przycisk zostanie zwolniony, to...
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. Dzięki z podpowiedzi. Jestem w fazie modyfikacji programu. Na chwilę obecną, jak tylko przeczytałem i złapałem się za...
Witam, Mam takie pytanie odnośnie przerwań w mikro kontrolerze STM8s. Czy jest możliwość jakiegoś resetu stanu przerwania (flagi)? Chodzi mi o coś takiego, aby stm sprawdzał w sposób ciągły, czy na konkretnym pinie wejściowym (dajmy na to PB7) jest podany sygnał masy (w tym przypadku wciśnięty przycisk). Chciałbym, aby był to warunek do wykonywania...
Zacznę od tego, że program podzieliłem sobie na części. Zaczynałem od skonfigurowania lcd, potem zająłem się odczytem wartości ADC poprzez czujnik wilgotności, następnie ośmieliłem się :lol: poprosić o wskazówkę w stworzeniu prostego menu do projektu i wykonałem to. Dodając kilka udogodnień, zacząłem się bawić z ustawianiem wartości z klawiatury, żeby...
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. Nie wspomniałem o jeszcze jednej rzeczy. Gdy wciśnięty zostanie przycisk i włączy się wyświetlacz,...
gdyby zatrudnić przerwanie do sprawdzania stanu przycisku to odpadłby problem sprawdzania przycisku w każdym obrocie pętli :-)
hmmm jeżeli chodzi o klawisze proponowałbym zrobić tak: linie z PCINTX podciągnąć rezystorem 1M do stanu wysokiego a następnie dać na przycisk który byłby zwierany do masy(linie jako wyjście) PCINT reaguje na każda zmianę stanu na pinach (wybranych) także zwierając linię do masy wywołujesz przerwanie w którym sprawdzasz stan portu
... i na wyjściu portb.1 ma się pojawić stan wysoki który ma trwać tak długo jak długo jest wciśnięty przycisk podłączony do linii portb.6,... A która to część programu sprawdza , czy przycisk jest wciśnięty , czy już nie jest :?: Jeśli myślisz że to ten fragment ... Loop Until Portb.6 = 0 ... , to zaprawdę powiadam Ci - jesteś w błędzie ;) Proszę...
masz tutaj moj kod, ktory robi dokladnie to co chcesz... ogolnie sprawa jest prostsza niz sie moze wydawac /* +—————R...
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
Jednka pojawil sie nastepny problem ktorego nie moge rozwiazac, jak badalem ten kod ktory mowilem, ze dziala; to duszac pare razy na przycisk program sie zawieszal. Wie ktos moze dlaczego? Może kolega rozwiązał ten problem? Szukałem podobnego rozwiązania i ten wątek okazał się bardzo pomocny, ale mam identyczny problem. Jeśli będe dusił przycisk co...
Ja bym stawiał na brak debounce. Skoro sprawdzany jest stan przycisku to pewnie on do czegoś służy. Może do wyświetlenia informacji na wyświetlaczu. Jeżeli brak debounce to przerwanie to wywoła się pewnie z kilkanaście razy. Może być tez tak ze przepełnia się stos, kilkanaście razy 32 bajty.... i koniec RAM, procek sie resetuje. Ale to tylko zgadywanie...
Robię wielofunkcyjne urządzenie, które ma rezlizować kilka programów, przełączanych przy pomocy przerwani INT0. Tzn, program pierwszy wykonuje się w pętli while(1) tak długo, aż nie pojawi się przerwanie, które zakończy program pierwszy i rozpocznie drugi. Mój pomysł wygląda tak: uint8_t numerprogramu = 1; void program1(void) { while(1)...
2. W trakcie obsługi przerwania przychodzi następne i czeka w kolejce, mógłbyś bardziej to objaśnić? Ja się postaram. Wciskasz przycisk więc wchodzisz w przerwanie i zerujesz jego flagę. Ale przycisk zadrżał, więc znów zostało ono wywołane tylko, że flaga I jest na czas obsługi wyzerowana. Więc nie przerywasz tego przerwania, ale jak kończysz je obsługiwać...
Witam! Napisałem sobie obsługę klawiatury matrycowej 3x4 w bascomie. Nie używam umieszczonej tam funkcji getkb(), ponieważ podłączona jest do różnych portów. Sprawdzanie wciśniętych przycisków chcę przeprowadzić w przerwaniu od wewnętrznego zegara TIMER0. Na ATmega32 wszystko bez problemu działa. Płytka, pod którą to robię działa niestety na ATmega8515....
Zrób sprawdzanie godziny na jakimś przerwaniu z timera. Uważam że niepotrzebnie robi się to cały czas w głównej pętli. Ustaw timer żeby sprawdzał czas co 0,5 sek i to na pewno wystarczy. A w pętli głównej zrób tylko obsługę menu czy co tam jeszcze będziesz robił.
Ustawiaj sobie flagę po naciśnięciu przycisku (np. w przerwaniu najlepiej) czy pętla ma się wykonywać, a w ciele pętli najpierw sprawdzaj tą flagę i albo wykonuj dalsze instrukcje albo wyskakuj z pętli poleceniem Exit For.
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...
Witajcie ! Wracam po latach do elektroniki - kiedyś zrobiłem wykrywacz metali Stuart2 na PICu, teraz chciałbym zrobić sobie ten projekt całkowicie po swojemu, od nowa i na AVR. Czytam o programowaniu AVRa i o przerwaniach - że w przerwaniu nie powinno się umieszczać opóźnień. PRogram musi działać w dużym reżimie czasowym - jest to wykrywacz PI. Wymyśliłem...
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...).
W takim razie masz dwie drogi sprawdzanie stanu poprzedniego: w każdym cyklu zapamiętujesz stan poprzedni a działa tylko wtedy kiedy stan poprzedni jest rożny od stanu aktualnego. [syntax=c] if (digitalRead(switchPin) != last_button_state) { tutaj twoj kod; } last_button_state = digitalRead(switchPin); [/syntax] badz podczepienie przycisku pod zewnetrzne...
Da się zrobić. Użyj przerwania timera do sprawdzania stanu przycisku i modyfikacji wypełnienia PWM dla serwa.
Jak byś włożył minimum wysiłku i przeszukał elektrodę (temat wraca 5x na tydzień) to byś się dowiedział że tak się nie robi klawiszy, A mogę wiedzieć z czym jest problem odnośnie klawiszy? Ja w programie nie wyzwalam nic przyciskami tylko sprawdzam czy przycisk jest sprawny, szukając informacji jak to zrobić oraz przeglądając kursy arduino nie znalazłem...
Na obsługę przycisków jest mnóstwo sposobów, mi najlepiej sprawdza się próbkowanie w przerwaniach, nie jest to specjalnie trudne, w internecie jest mnóstwo poradników jak to zrobić i działa :) Dodatkowo w prosty sposób detekcje się różne stany (wciśnięcie, przytrzymanie, puszczenie).
Witam. Jak przy każdej usterce przeszukałem forum ale podobnego przypadku nie znalazłem, więc zdecydowałem się opisać problem być może będzie ktoś chętny podpowiedzieć kilka wskazówek. Awarii uległ piekarnik jak w tytule, odkleił się panel i spadł na otwarte drzwiczki. Mechanicznie nic nie uszkodziło się ale przy wypadaniu wyszarpnęły się dwie taśmy...
Witam wszystkich W ramach nauki FreeRTOSa napisałem program, w którym jeden task miga diodą, drugi natomiast współpracuje z przyciskiem. Gdy naciśnięty zostaje przycisk, następuje przerwanie EXTI0, które "daje" semafor xButtonSemaphore. Natomiast zadanie vButtonTask czeka na ten semafor, "bierze" go gdy staje się dostępny, po czym albo usypia, albo...
robisz sobie strukturę danych z obszarem aktywnym i wskaźnikami na funkje, które mają być wołane w zależności od potrzeb - jak rysujesz, jak klikniesz, jak zabierzesz nacisk, jak wjedziesz, jak wyjedziesz i dowolne inne jakie są potrzebne. Następnie definiujesz wszytkie kontrolki (czy to statycznie czy to dynamicznie). Piszesz funkcję, która sprawdza...
Witam Posiadam plytke testowa fimry Kamami ZL11 i modul dip z procesorem AT91SAM7S256. Zaczynam nauke programowania w CrossStudio tego procesora i mam problem z odczytem stanu przyciskow w petli (ale nie uzywajac przerwania). Program aktywuje port GPIO (ustawia linie wejsciowe i wyjsciowe), ale nie moze odczytac stanu przyciskow. Gdzies wyczytalem ze...
Albo zrobić to flagami. Rozwiązań jest wiele. Sam proponowałeś rozwiązanie z flagami? robiw Mozna z flagami. Usypiamy procka ale, gdy przycisk naciiśnięty zstanie wybudzony. Sprawdzamy flagę, stan przycisui i usypiamy, Sprawdzanie flagi jest potrzebne aby stwierdzić czy przed uspieniem przycisk był zwolniony czy nie, jak nie to uspienie, jak był zwolniony,...
Projektuje układzik wykorzystujący prostą klawiaturę 3 przyciskową. Przyciski podłączone są do końcówek PD5, PD6 i PD7. Używam rezystorów podciągających z atmegi. Program piszę w bascomie i mam teraz problem. Mam ustawione cykliczne przerwanie (co 100ms) od Timera1, w którym sprawdzam stan tych 3ch końcówek. No i wszystko działa, sczytuje stany końcówek...
Najprostszym rozwiązaniem wydaje mi się wygenerowanie sygnału wspólnego (tutaj mającego 3 stany: oba_puszczone, mieszany, oba_nacisniete) oraz operowanie na jednej pomocniczej zmiennej "gotowosc" - cykl zacznie się tylko wtedy, kiedy sygnał wspólny jest w stanie oba_nacisniete a układ jest gotowy - wtedy nastąpi rozpoczęcie procesu oraz skasowanie gotowości....
Witam, Piszę kod programu jest on dość spory i chcę wykorzystać kilka przerwać. z Tego co pamiętam to w prockach AVR każde przerwanie ma swoją nazwę. Przy kompilatorze HI-TECH było chyba podobnie (chyba była konkretna nazwa do konkretnego przerwania ale mogę się mylić krótko z niego korzystałem :P) Czytam noty katalogowe i się pogubiłem bo z tego co...
Witajcie moi drodzy W tym temacie poznamy podstawy przerwań i timerów w PIC18F2550 . Na początek będzie krótki wstęp teoretyczny, a potem wszystko przerobimy dokładnie na praktycznych przykładach. Do lektury tematu przyda się ogólna wiedza na temat przerwań i programowania w C, choćby taka z Arduino. Temat oczywiście nie zastąpi w pełni czytania noty...
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?
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...
ustawiasz licznik tak by generował przerwanie co 50ms w tym przerwaniu sprawdzasz swoje sygnały (przyjmijmy ze wyzwalanie jest zerem) w przerwaniu sprawdzasz czy sygnał jest = 0 jeśli tak ustawiasz sobie jakaś zmienna bitową flagę (znak ze sygnał jest). w następnym przerwaniu (flaga ustawiona) sprawdzasz znów sygnał jeśli jest 0 np włącz silnik. dodatkowym...
Sprawdzam czy przycisk zostal puszczony i dopiero wtedy kończę przerwanie. Czy tak trzeba robić ?? niekoniecznie, oczekiwanie na puszczenie klawisza można zrobić w progu glównym, lub spróbuj wogóle to pominąć, teoretycznie powinno dzialać bezblędnie z opóźnieniem na drgania styków. Nie skasujesz INTF oraz RBIF, bez odczytania stanu portu, a bez tego...
W oparciu o Wasze rady oraz [url=]Newbie's Guide to AVR Timers i przydatną stronę [url=]ATmega Timer/Counter/Prescaler Calculator w wolnym czasie sklepałem taki kawałek kodu: [syntax=c]#include <avr/io.h> #include <avr/interrupt.h> volatile unsigned char nacisnieto=0; kontrola=0; volatile int flaga= 0; //flaga włączenia LED void led(void)...
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.
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...
Jak pewnie wiecie od jakiś kilku generacji ipody nano mają usterkę związaną z przyciskami. Ten, który posiadam - 6 generacji nawet po kilku miesiącach odmawia posłuszeństwa. Zazwyczaj "wbija" się przycisk od uśpienia. Naprawa wydaje się prosta - wystarczy go rozebrać i podkleić aluminiową płytkę. Tyle w teorii;) Podczas odklejania izolacji z taśmy flex...
Panowie, dlaczego nie zrobić sterowania diodami porządnie, tylko bawicie się w jakieś opóźnienia..? Macie w mikrokontrolerze timer z trybem porównania. 1. Robimy przerwanie od przepełnienia timera co czas wysłania na szyne danych diod pojedynczego bitu (ok 1,2 ms) 2. Ustawiamy wartość rejestru porównania na wartość "większą" lub "mniejszą" (trzeba policzyć...
przeciez juz ci powiedzieli... uzyc przerwan! sprawdzaj w przerwaniu od timera (np co 20ms) stan przyciskow i ewentualnie cos rob jesli masz taki plan. niemniej jednak byloby lepiej wrzucic obsluge tego termometru do przerwan (rowniez od timera) 4\/3!!
Jeśli styczniki włączają się na dłużej to lepiej probkować stan portu w przerwaniu timera kilkanaście(dziesiąt) razy na sekundę i sprawdzać czy jest stabilny stan. Jeśli jest stabilny przez np 100ms to ustawić flagę. Tak jak próbkowanie przycisków.
Zrobiłem taki programik: 'Program do sterowania małych silników krokowych za pomocą ATMega8 i układu L6219 lub LB1845 'sterowanie ćwierćrokowe, zasilanie 30V 'set i reset zastosowałem w celach poglądowych- można- a nawet należy zastąpić to np.PortB=&B00001100 itp. $regfile "m8def.dat" $crystal = 4915200 Config Lcd = 16 * 2 Config Lcdpin =...
Może przerwania wcale nie są generowane co 1s i inkrementacja zmiennej czas_przyciskania_plus odbywa się tak szybko, że szybko jest ona większa od 2? Twój warunek może być maksymalnie spełniony przez 1s w przypadku ciągłego wciśnięcia przycisku. Nie zamieściłeś całego kodu ale może zastąp warunek czas_przyciskania_plus==2 warunkiem czas_przyciskania_plus>=2....
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...
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...
Tak więc przerobiłem kod tak jak mówiliście i wygląda teraz tak: [syntax=c] #define F_CPU 1000000L #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> struct keyboard { int lastKey; int isPressingNow; int numberOfKey; } k; volatile int interrupt; void init() { DDRA = 0xFF; // set Port A as output DDRB = 0xF0; //...
Witaj Adamie. ... i niestety nie wychodzi. Na jakiej podstawie tak uważasz? Dodam, że pracuję na Atmel Studio 6, które bardzo nie lubi funkcji SIGNAL(SIG_INTERRUPT0) Ponieważ SIGNAL jest przestarzałe: Atrybut NOBLOCK dodałem na końcu, więc można się nim nie sugerować. W jakim celu? Czy jesteś świadomy skutków NOBLOCK, a propos drgań styków i ich wpływu...