bletz Napisano Styczeń 8, 2011 Udostępnij Napisano Styczeń 8, 2011 Witajcie,mam spory problem z zadaniem które wyznaczył mi prowadzący lab: wysterować ramię robota (7 serw) przy użyciu procesora sygnałowego + układu FPGA (po prostu taki zestaw jest dostępny w tym laboratorium). Z układem FPGA nie było większych problemów bo za dużo w nim zmieniać nie musieliśmy. Serwa nieprzerobione, o czym pewnie wiecie lepiej ode mnie są sterowane wypełnieniem sygnału (dla tego konkretnego serwa 0,3 ms do 2,7 ms) z częstotliwością 50Hz. To, znając taktowanie procesora, udało mi się zrealizować. Dla jednego konkretnego serwa sterowanie jest realizowane poprawnie, dla większej ich ilości już nie. Sygnał sterujący wysyłany jest w postaci 1 logicznej na konkretnym bicie przyporządkowany do danego serwa. Gdy przykładowo sterujemy serwem pierwszym na wyjście wystawiamy 1 gdy drugim 2 trzecim 4 i dla dalszych analogicznie. Natomiast problem jest być może banalny ale ja nie umiem sobie z nim poradzić: gdy steruję serwem np trzecim (wyjscie na 4, binarne [..]100) to reszta serw jest niesterowalna. Z tego co przeglądnąłem w sieci to rozwiązaniem problemu byłaby maska OR. Sama idea jest dla mnie mniej więcej zrozumiała jednak jej implementacja w C już nie. W celu poglądowym zamieszczam część kodu w C jaką napisałem. /***********************KOD WLASNY*************************/ zm_licznik++ ; if(zm_licznik>zm_serwo_1) JP1=1 ; else JP1=0; if(zm_licznik>zm_serwo_2) JP1=2 ; else JP1=0; if(zm_licznik>zm_serwo_3) JP1=4 ; else JP1=0; if(zm_licznik>zm_serwo_4) JP1=8 ; else JP1=0; if(zm_licznik>zm_serwo_5) JP1=16 ; else JP1=0; if(zm_licznik>zm_serwo_6) JP1=32 ; else JP1=0; if(zm_licznik>zm_serwo_7) JP1=64 ; else JP1=0; if(zm_licznik>133) zm_licznik=0; OUTPUT0=(int)JP1; /***********************KOD WLASNY*************************/ I tu moje pytanie jak wyfiltrować (zamaskować) wartości JP1 tak aby móc zmieniać bity niezależnie. Tak aby ustawienie <> na którymś z bitów nie zerował pozostałych. Zamieszczam zdjęcie. Byłbym niezmiernie rad gdyby ktoś pomógł mi z tym maskowanie. Ja niestety z C nie miałem za dużo wspólnego wiec poprosiłbym o łopatologiczne wytłumaczenie. Cytuj Link do komentarza Share on other sites More sharing options...
MirekCz Styczeń 8, 2011 Udostępnij Styczeń 8, 2011 1. OR to | , drugi przydatny może byc dla ciebie AND & W każdej książce do C to znajdziesz, więc nie wiem gdzie szukałeś 2.Możesz też sterować każdym serwem oddzielnie. Sygnał dla poszczególnych serw wysyłasz co 20ms, a maksymalna długość sygnału to generalnie ~2ms. Czyli teoretycznie możesz generować 10 sygnałów oddzielnie i to zapętlić, co da 20ms. Optymalnie zostawić sobie trochę więcej miejsca i generować maksymalnie sygnał ok 2,5ms, bo każde serwo działa w trochę innym zakresie. 3.DSP+FPGA to jak strzelanie z atomówki do muchy 🙂 Cytuj Link do komentarza Share on other sites More sharing options...
OldSkull Styczeń 8, 2011 Udostępnij Styczeń 8, 2011 7*2,7 = 18,9ms, więc możesz kolejno do poszczególnych serw bez problemu wysyłać informację. Sprawdź może jakie masz opcje w tym procesorze sygnałowym, być może mógłbyś wygenerować sprzętowo na odpowiednich nóżkach sygnały PWM o okresie 20ms. Operacje | i & to podstawa, więc masz pewne braki w edukacji jeśli chodzi o programowanie mikroprocesorów. Cytuj Link do komentarza Share on other sites More sharing options...
bletz Styczeń 8, 2011 Autor tematu Udostępnij Styczeń 8, 2011 Operacje | i & to podstawa, więc masz pewne braki w edukacji jeśli chodzi o programowanie mikroprocesorów. Dlatego napisałem w dziale dla początkujących. Czy to zadziała poprawnie? if(zm_licznik>zm_serwo_1) JP1=JP1 | 1 ; else JP1=0; if(zm_licznik>zm_serwo_2) JP1=JP1 | 2 ; else JP1=0; if(zm_licznik>zm_serwo_3) JP1=JP1 | 4 ; else JP1=0; if(zm_licznik>zm_serwo_4) JP1=JP1 | 8 ; else JP1=0; if(zm_licznik>zm_serwo_5) JP1=JP1 | 16 ; else JP1=0; if(zm_licznik>zm_serwo_6) JP1=JP1 | 32 ; else JP1=0; if(zm_licznik>zm_serwo_7) JP1=JP1 | 64 ; else JP1=0; Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
MirekCz Styczeń 8, 2011 Udostępnij Styczeń 8, 2011 dla ustawiania poszczegolnych bitow, tak, tylko potem nie kasujesz poszczegolnych bitow w else tylko cala zmienna i tutaj sie wszystko rozjedzie 🙂 Podalem po cos funkcje AND... Cytuj Link do komentarza Share on other sites More sharing options...
bletz Styczeń 8, 2011 Autor tematu Udostępnij Styczeń 8, 2011 Faktycznie, o tym nie pomyślałem. Dzięki. if(zm_licznik>zm_serwo_1) JP1=JP1 | 1 ; else JP1=JP1 & 126; if(zm_licznik>zm_serwo_2) JP1=JP1 | 2 ; else JP1=JP1 & 125; if(zm_licznik>zm_serwo_3) JP1=JP1 | 4 ; else JP1=JP1 & 123; if(zm_licznik>zm_serwo_4) JP1=JP1 | 8 ; else JP1=JP1 & 119; if(zm_licznik>zm_serwo_5) JP1=JP1 | 16 ; else JP1=JP1 & 111; if(zm_licznik>zm_serwo_6) JP1=JP1 | 32 ; else JP1=JP1 & 95; if(zm_licznik>zm_serwo_7) JP1=JP1 | 64 ; else JP1=JP1 & 63; Mam nadzieję że to już jest dobrze. Cytuj Link do komentarza Share on other sites More sharing options...
MirekCz Styczeń 8, 2011 Udostępnij Styczeń 8, 2011 Tak, wyglada ok. Tylko jeżeli zmienna JP1 jest zmienna lokalna, którą na koniec przesyłasz na port to łatwiej zrobić: JP1=0; i potem same if... a wszystkie else są zupełnie zbędne i tylko zwalniają program 🙂 Cytuj Link do komentarza Share on other sites More sharing options...
Marooned Styczeń 13, 2011 Udostępnij Styczeń 13, 2011 Polecam stosowanie skrótów 🙂 JP1 = JP1 | 16; to to samo co JP1 |= 16; działa to z każdym operatorem (+-/*|&^) X = X op Y X op= Y Co się kryje pod zmiennymi zm_serwo_x ? Zdecydowanie tak jak proponuje Mirek: int JP1 = 0; if () JP1 |= 1; if () JP1 |= 2; ... Cytuj Link do komentarza Share on other sites More sharing options...
bletz Styczeń 13, 2011 Autor tematu Udostępnij Styczeń 13, 2011 Już zrealizowałem tą radę aby zerować je jednocześnie. zm_serwo_x służy do zadawania położenia serwa. Przykładowo (bo nie pamiętam już dokładnych wartości liczbowych) ustawiając 5 masz położenie max w jedną ze stron 15 środek 25 max w drugą. Odpowiada to konkretnym wartością w milisekundach. Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!