Skocz do zawartości

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


Pomocna odpowiedź

Napisano

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.

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.

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).

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.

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.

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 🙂

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...