Skocz do zawartości

[C] Atmega8 - 2 czynnosci na raz


Laik

Pomocna odpowiedź

Do obsługi przycisków możesz użyć np. przerywań INT0 i INT1.

Chodź bez przerywań też da się to zrobić po prostu w pętli sprawdzasz stan

przycisków i w zależności od ich stanów zmienisz kierunek jazdy lub nie podejmujesz

decyzji i kierunek zostaje taki jak poprzednio czyli np. do przodu, albo gdy żaden przycisk

nie jest wciśnięty to robot - jedź do przodu.

Robisz robota z czułkami ?

Link do komentarza
Share on other sites

W mikrokontrolerach nie ma możliwości wykonywania dwóch rzeczy naraz, jedna następuje po drugie, ale zachodzi to w ułamkach sekund, więc dla człowieka jest niezauważalne. Przerwanie polega na tym, że uC zamiast sprawdzać po kolei stan z przycisku (obrazując: uC pyta się czy przycisk jest wciśnięty, ten odpowiada, że nie i uC leci dalej z programem) ustawia się przycisk jako priorytet (obrazując: uC wykonuje program, a gdy przycisk jest wciśnięty, ten woła, że ma zostawić wszystko i zwrócić uwagę na niego). Takie masło maślane, ale mam nadzieję, że zrozumiesz 😃 .

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Przepraszam, że jeszcze raz się wetnę Le_Cheque ma rację ale...

ale po pierwsze przy fabrycznym kwarcu to częstotliwość wynosi 1MHz czyli jedna

instrukcja trawa 1us co jest bardzo niewielkim czasem tak małym, że dla nas

w ogóle to "nie trwa" gdyż nie jesteśmy w stanie zauważać takich odstępów czasu.

Więc nie ma obaw, że będą jakieś widoczne opóźnienia. Poza tym może być rzeczywiście tak, że

uprocek steruje silnikiem do przodu i w tym samym czasie sprawdza stan przycisku gdyż

jeżeli ustawisz przed pętlą np. Pin PB1 jako wyjście w stanie wysokim a twój sterownik silnika

będzie zbudowany tak ( hipotetycznie ), że taki stan na PB1 powoduje ruch robota do przodu

to będzie on jechał dopóki nie zmienisz stanu na PB1 z racji, że zaraz potem będziesz

w pętli sprawdzał stan przycisków i twój program nie będzie modyfikował stanu na PB1

do czasu, aż jakichś przycisk nie zostanie wciśnięty wówczas sądzę, że można powiedzieć,
że dwie czynności sprawdzanie stanu przycisków oraz ruch do przodu zachodzą w tym

samym czasie. Oczywiście w mikrokontrolerach instrukcje są wykonywane po kolei ale tu

sytuacja jest nieco inna więc nie można twierdzić na podstawie tego, że da się zrobić tak

by wykonać dwie instrukcje, które normalnie są wykonywane po kolei, w tym samym

czasie dlatego Le_Cheque ma rację co do niemożności robienia dwóch instrukcji w tym

samym czasie. Mam nadzieje, że wiadomo o co mi chodzi.

Link do komentarza
Share on other sites

W sumie przy tak postawionym problemie procek może robić 3 rzeczy na raz:

- przerwania timera sterują silnikami (PWM)

- przerwania zewnętrzne INT0 i INT1 zmieniają kierunek działania robota poprzez zmianę wypełnienia sygnału PWM i/lub zmianę konfiguracji bitów sterujących napędami

- w pętli głównej programu może się dziać cokolwiek innego.

Link do komentarza
Share on other sites

Podłączanie przycisków do przerwań ma swoje wady. Zależnie od procka, przerwań może być ograniczona liczba (szczególnie ARM-y mają tę wadę). Jak zabraknie, trzeba skomplikować układ.

Nawet jeśli mamy tyle wejść przerwań co przełączników pozostaje problem drgań styków. Przy drganiach procek zostanie "zasypany" żądaniami przerwań, co więcej trzeba dodać filtrowanie jeśli chcemy wykryć np. kolejne naciśnięcia przycisku.

Moim zdaniem obsługa przycisków na przerwaniach jest dla zaawansowanych. Natomiast po treści posta kolegi Laik-a sądzę, że szuka czegoś prostego.

Najłatwiej jest w pętli głównej programu kolejno odczytywać stany przycisków, następnie wywoływać procedury sterowania robotem.

Link do komentarza
Share on other sites

W mikrokontrolerach nie ma możliwości wykonywania dwóch rzeczy naraz, jedna następuje po drugie, ale zachodzi to w ułamkach sekund, więc dla człowieka jest niezauważalne.

Wybaczcie, że się wtrącam, ale jest taka możliwość i nazywa się wielowątkowość 😉

Wielowątkowość może także odnosić się do samych procesorów. W takim wypadku oznacza możliwość jednoczesnego wykonywania wielu wątków sprzętowych na pojedynczej jednostce wykonawczej – rdzeniu (ang. core). Wielowątkowość w procesorach możliwa jest dzięki temu że nie wszystkie części jednostki wykonawczej są w jednakowym stopniu wykorzystywane przez pojedynczy wątek (ciąg instrukcji). Nieaktywne części jednostki wykonawczej mogą w tym czasie wykonywać inny wątek zwiększając efektywność wykorzystania całego procesora. W zależności od rodzaju technik zastosowanych do obsługi dodatkowych wątków sprzętowych spotyka się od 2 (najczęściej) do nawet 8 wątków sprzętowych na pojedynczy rdzeń procesora (core).

źródło Wikipedia

I już siedzę cicho 😉

Link do komentarza
Share on other sites

W sumie przy tak postawionym problemie procek może robić 3 rzeczy na raz:

- przerwania timera sterują silnikami (PWM)

- przerwania zewnętrzne INT0 i INT1 zmieniają kierunek działania robota poprzez zmianę wypełnienia sygnału PWM i/lub zmianę konfiguracji bitów sterujących napędami

- w pętli głównej programu może się dziać cokolwiek innego.

Nie do końca. To coś jak z odrabianiem lekcji wieczorem (znowu trochę łopatologiczne podejście 😃), wchodząc do pokoju zapalasz lampę i ona się świeci (żarówka, nie lampa 😃 ), nie musisz co chwilę wstawać i ją ponownie zapalać, więc gdy już się świeci siadasz do biurka i odrabiasz lekcje np. najpierw zadanie z fizyki, a później z matematyki i robisz to po kolei, chyba, że umiesz pisać lewą i prawą ręką na raz i masz podzielność uwagi.

To, że w "main" dasz PWM to nie znaczy, że mikrokontroler robi coś naraz z tym co jest później w pętli. On po prostu zaczynając program uruchamia te silniki (czy co tam dasz innego) i już sobie tym głowy nie zawraca, przechodzi do pętli i wykonuje czynności po kolei.

EDIT:

Rozumiem nawyk, że jest taka możliwość, ale sądząc po pytaniu użytkownika Laik nie będzie on programował jakichś "wypasionych" procków tylko nasze poczciwe AVRy 🙂 .

Link do komentarza
Share on other sites

Dawno mnie tu nie było.

Dopiszę pewne sprostowanie.

A że przechodzimy do obrazowego przedstawiania sprawy i odrabiania lekcji to:

Wchodzisz do pokoju, włączasz światło i wyciągasz zeszyty/książki z których będziesz korzystał to jest przygotowanie środowiska pracy.

Dodatkowo włanczasz sobie radio/CD, żeby w tle coś grało.

W tym momencie zabierasz się do odrabiania lekcji.

Ale co jakiś czas mama albo ktoś inny prosi cię o coś np. "wyrzuć śmieci" itd.

Lub co jakiś czas zmieniasz płytę lub stację radiową.

Analogia do działania uC AVR:

zanim wejdziesz do głównej pętli konfigurujesz środowisko pracy, ustawiasz rejestry, deklarujesz i zadajesz wartości początkowe zmiennym itd.

Następnie wchodzisz do głównej pętli programowej,
z której co jakiś czas wyrywa cię przerwanie zewnętrzne (INT - głos mamy),
mało tego timer w AVR da się tak skonfigurować aby generował sygnał PWM bez wykorzystania z przerwań, ale jak chcesz zmienić wypełnienie musisz zmienić wartość w odpowiednim rejestrze. W tym przypadku zewnętrze urządzenie którym jest w procku timer to jest radio z przykładu, w którym co jakiś czas zmieniasz stację, samo radio działa niezależnie od tego co akurat robisz ale jak coś jest nie tak to przerywasz pracę, i zmieniasz stację.

Mimo iż w jednej chwili procesor robi tylko jedną rzecz tak na prawdę dzieją się dwie, bo sygnał PWM jest "niezależny" od procesora, procesor albo wykonuje program z pętli głównej lub reaguje na przerwanie.

Co do wielowątkowości to jest to pojęcie bardzo rozległe ale dopiero w procesorach wielordzeniowych zadania mogą dziać się równolegle.

W procesorach 8bitowych raczej nie stosuje się tego typu rozwiązań bo wymaga to działania programu nadrzędnego, który przełącza wątki, to zadanie realizuje w komputerach system operacyjny.

Spotkałem się już z OSem mogącym pracować pod AVRkami

nazywa się on FreeRTOS czy jakoś tak, ale nie miałem okazji się nim pobawić.

Takie rozumowanie jest odpowiedzią dla użytkownika Laik:

Skonfigurować procek tak aby generował sygnał PWM do jazdy robota w przód.

A następnie w pętli programowej czekał na naciśnięcie przycisku.

Ale myślę, ze po takim czasie już to zadanie zostało rozwiązane.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.