Skocz do zawartości
dominos96

Kilka pętli w bascomie - robot z efektem knight rider

Pomocna odpowiedź

Chciałem robotowi dorobić efekt Knight Rider (jak ktoś nie wie to taki wędrujący punkt zapalonych diod 😕 )

i mam pytanie jak w bascomie zrobić aby podczas jazdy robota, w tym samym czasie działał ten efekt.

Tak aby w tym samym czasie działały dwie pętle.

Udostępnij ten post


Link to post
Share on other sites
Tak aby w tym samym czasie działały dwie pętle.

Mówiąc w skrócie, w żadnym języku programowania tego nie zrobisz. Mikrokontroler może w danym czasie wykonywać tylko jedno polecenie.

Dałoby się to zrobić łącząc dwie pętle w jedną, ale wtedy czasy działania tych pętli muszą być ze sobą powiązane, np. główną pętlą jest pętla efektu, bo ona wykonuje się długo, a raczej zmiany są co kilkaset ms, a w trakcie tej "bezczynności" mikrokontrolera, podczas tych kilkuset ms wykonujesz pozostałe polecenia typu sprawdzanie czujników, zmiana obrotów silników itp.

Udostępnij ten post


Link to post
Share on other sites

Wydaje mi się, że to dobry moment, żeby zainteresować się przerwaniami, dominos96 😉 Zaprzągłbyś do tego wewnętrzny timer, jeśli przerwanie by było wywoływane wystarczająco rzadko to wystarczyłoby, żebyś w obsłudze przerwania przesuwał tylko zapalony punkt w którąś stronę, ze sprawdzeniem czy to już nie ostatnie, wtedy zmiana kierunku. Jeśli przerwanie byłoby wykonywane stosunkowo często, to byś musiał jeszcze dorobić coś, żeby obsługa przerwania przesuwała ten punkt co kilka wywołań (najprościej imo zmienna+warunek+inkrementacja zmiennej).

Udostępnij ten post


Link to post
Share on other sites

Wątek, to mechanizm, który wymusza system operacyjny, a nie język. Wiec nie, w bascomi nie ma wątków. Chyba, że napiszesz sobie wielowątkowy system operacyjny na avra.

dominos96, możesz jeszcze zrobić warunek, że co ileś tam wykonań pętli głównej nastąpi przesunięcie, ale dużo lepszym rozwiązaniem jest zastosowanie przerwań, tak jak pisze Bobby.

Udostępnij ten post


Link to post
Share on other sites

Zależy co chcesz w całym programie umieścić? W sumie to nie jest trudne. Trzeba wziąć pod uwagę co będzie ważniejsze, czy program wykonujący knight rider'a czy to drugie co chcesz umieścić.

Dalej polecam lekturę na temat przerwań i do tego komendę select case. Do całości dorzuć sprzętowy lub programowy PWM i będziesz miał efekt knight rider z powolnym wygaszaniem diod.

Udostępnij ten post


Link to post
Share on other sites

Tutaj znajdziesz parę zasad które powinieneś przestrzegać, by to zrobić na przerwaniach.

Niestety kod jest w C, ale idea jest taka sama. Ciebie dotyczą punkty 3 i 4.

zobacz: Błędy popełniane w przerwaniach

Jeżeli dobrze to wykonasz to procesor i tak będzie się jeszcze nudził.

Udostępnij ten post


Link to post
Share on other sites

siema,
tutaj mam dwa efekty kitta napisane własnoręcznie, zobacz jak są zbudowane. Wsad jest dla atmega48

'KITT EFFECT
'feriar(c)
'2011


$regfile = "m48def.dat"
$crystal = 8000000

Config Pind.0 = Output
Config Pind.1 = Output
Config Pind.2 = Output
Config Pind.3 = Output
Config Pind.4 = Output
Config Pind.5 = Output
Config Pind.6 = Output
Config Pind.7 = Output



D1 Alias Pind.0
D2 Alias Pind.1
D3 Alias Pind.2
D4 Alias Pind.3
D5 Alias Pind.4
D6 Alias Pind.5
D7 Alias Pind.6
D8 Alias Pind.7



Do

Set D1
Waitms 30
Reset D1
Waitms 30

Set D2
Waitms 30
Reset D2
Waitms 30

Set D3
Waitms 30
Reset D3
Waitms 30

Set D4
Waitms 30
Reset D4
Waitms 30

Set D5
Waitms 30
Reset D5
Waitms 30

Set D6
Waitms 30
Reset D6
Waitms 30

Set D7
Waitms 30
Reset D7
Waitms 30

Set D8
Waitms 30
Reset D8
Waitms 30

Set D8
Waitms 30
Reset D8
Waitms 30

Set D7
Waitms 30
Reset D7
Waitms 30

Set D6
Waitms 30
Reset D6
Waitms 30

Set D5
Waitms 30
Reset D5
Waitms 30

Set D4
Waitms 30
Reset D4
Waitms 30

Set D3
Waitms 30
Reset D3
Waitms 30

Set D2
Waitms 30
Reset D2
Waitms 30

Set D1
Waitms 30
Reset D1
Waitms 30

Loop
End
'KITT EFFECT 1
'feriar(c)
'2011


$regfile = "m48def.dat"
$crystal = 8000000

Config Pind.0 = Output
Config Pind.1 = Output
Config Pind.2 = Output
Config Pind.3 = Output
Config Pind.4 = Output
Config Pind.5 = Output
Config Pind.6 = Output
Config Pind.7 = Output



D1 Alias Pind.0
D2 Alias Pind.1
D3 Alias Pind.2
D4 Alias Pind.3
D5 Alias Pind.4
D6 Alias Pind.5
D7 Alias Pind.6
D8 Alias Pind.7



Do

Set D4
Waitms 30
Reset D4
Waitms 30

Set D5
Waitms 30
Reset D5
Waitms 30

Set D3
Waitms 30
Reset D3
Waitms 30

Set D6
Waitms 30
Reset D6
Waitms 30

Set D2
Waitms 30
Reset D2
Waitms 30

Set D7
Waitms 30
Reset D7
Waitms 30

Set D1
Waitms 30
Reset D1
Waitms 30

Set D8
Waitms 30
Reset D8
Waitms 30

Set D8
Waitms 30
Reset D8
Waitms 30

Set D1
Waitms 30
Reset D1
Waitms 30

Set D7
Waitms 30
Reset D7
Waitms 30

Set D2
Waitms 30
Reset D2
Waitms 30

Set D6
Waitms 30
Reset D6
Waitms 30

Set D3
Waitms 30
Reset D3
Waitms 30

Set D5
Waitms 30
Reset D5
Waitms 30

Set D4
Waitms 30
Reset D4
Waitms 30

Loop
End

znając niektóre osoby to napiszą że ten kod można było napisać w paru linijkach ale działa,
powodzenia 🙂

Udostępnij ten post


Link to post
Share on other sites

Ja bym sugerował zainteresowanie się poleceniem rotate w bascomie 😉

Udostępnij ten post


Link to post
Share on other sites

dopiero się uczę Bobby, ale będe miał to na względzie także dzięki 😃

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...