Skocz do zawartości

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


dominos96

Pomocna odpowiedź

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.

Link do komentarza
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).

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

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.

Link do komentarza
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.

Link do komentarza
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 🙂

Link do komentarza
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...

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.