Wojtek Napisano Czerwiec 27, 2011 Udostępnij Napisano Czerwiec 27, 2011 Potrzebuję zbudować sterownik 11 serwomechanizmów na dwóch układach Attiny2313 z kwarcami 16Mhz. Mam wątpliwości dotyczące tego czy jeden uc Attiny 2313 będzie w stanie obsługiwać do 6 serw jednocześnie (bo przecież ma tylko 2 timery)? Do tej pory programowałem ten procesor jedynie w płytce testowej z zestawu AVT Piotra Góreckiego. Teraz z użyciem programatora z tego kursu (AVR Prog2) chciałbym zaprogramować te procki z pominięciem płytki testowej tylko na płytce stykowej. Mam pewne obawy związane z tym ,że coś mogę podłączyć źle (to znaczy nie do tych pinów mikroprocesora co trzeba). Czym mogłoby to skutkować? Czy mógłbym uszkodzić w ten sposób programator? Ponadto na schemacie płytki testowej widziałem, że niektóre piny procka są podciągane do ISP przez rezystory. Czy są one konieczne? A teraz przejdę do swojego największego problemu a mianowicie ustawienia fusebitów tak aby Attiny2313 pracowało na zewnętrznym kwarcu 16Mhz. W woli ścisłości dodam ,że programuję w Bascomie i z programu BASCOM-AVR kompiluję plik *HEX, który następnie ładuję do uC przez AVR-Studio. Rozumiem ,że w kodzie źródłowym nic nie muszę zmieniać (nie używam komendy $crystal). I teraz nie wiem czy muszę konfigurować fusebity z poziomu Bascom-Avr czy Avr Studio? Cytuj Link do komentarza Share on other sites More sharing options...
BlackJack Czerwiec 27, 2011 Udostępnij Czerwiec 27, 2011 Do sterowania serwomechanizmami wystarczy ci nawet 1 Timer. Natomiast nie lepiej zamiast 2 procesorów zastosować 1 np. ATMegę 48 czy jakiś inny w obudowie DIP28 ostatecznie DIP 40. W jednej ramce 20ms, można upchnąć 10 serw(pod warunkiem że max. czas trwania impulsu dla jednego serwa to 2ms), z 11 może być nieco problem, ale to zależy od wymagań czasowych serwomechanizmów. Co do programowania na płytce stykowej, można bez problemu, sam tak często robiłem, jedyne co może źle się skończyć to pomylenie napięć zasilania, zamiana linii portu SPI skutkuje po prostu błędem komunikacji. Co do Fusów to można je konfigurować spokojnie z BASCOMa, tylko nie wyłącz sobie końcówki Reset lub portu SPI, bo wtedy jest już po zawodach. Natomiast do obsługi serw procesor można spokojnie taktować 1MHz, w zupełności wystarczy, a jeszcze między obsługą serw procesorowi będzie się nudzić. W TYM Temacie masz moje oraz kolegi zmagania z tematem obsługi wielu serwomechanizmów na ATTINY2313. Cytuj Link do komentarza Share on other sites More sharing options...
Wojtek Czerwiec 27, 2011 Autor tematu Udostępnij Czerwiec 27, 2011 ➡️ BlackJack Chciałbym użyć komend config servos i w ten sposób obsługiwać 6 serw z jednego procka i 5 serw z drugiego procka. Zdecydowałem się na rozdzielenie tych zadań pomiędzy dwa procki z powodu zbyt małej ilości wejść/wyjść. Korzystam z wersji demonstracyjenej Bascom-avr i nie mogę skompilować większego programu niż 2kb. Dzięki użyciu dwóch procesorów będe mógł wykorzystać w pełni potencjał tych dwóch procków i 4kb pamięci a nie 2kb w przypadku użycia pojedynczego ale droższego. Co z tego ,że użyję np. Atmegi 16 skoro 14kb pamięci flash zostanie mi niewykorzystane? Pomylenie napięć zasilania skończy się źle dla procka , programatora czy komputera? Byłbym bardzo wdzięczny gdyby ktoś podał mi screen okna konfiguracyjnego fusebitów w Bascom- Avr z zaznaczonymi opcjami tak aby procek attiny2313 pracował na zewnętrznym kwarcu 16Mhz. Wiem ,że może być to lekki problem ale dam "pomógł". Cytuj Link do komentarza Share on other sites More sharing options...
Harnas Czerwiec 27, 2011 Udostępnij Czerwiec 27, 2011 Config serwo może obsługiwać do bodajże 12 serw. I nie jestem pewniej ale bascom w wersji demo ma chyba ograniczenie do 4kb, ale nie jestem tego pewien. 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
Wojtek Czerwiec 27, 2011 Autor tematu Udostępnij Czerwiec 27, 2011 Harnas. Jestem pewien ,że jest ograniczeie do 2kb. Proszę o odpowiedź na moje pytania, gdyż jest to dla mnie bardzo ważne. Cytuj Link do komentarza Share on other sites More sharing options...
BlackJack Czerwiec 27, 2011 Udostępnij Czerwiec 27, 2011 W nowszych BASCOMach jest ograniczenie do 4KB kodu. Co do BASCOMowych instrukcji servo, to przy takiej ilości lepiej dać sobie z nimi spokój i stworzyć własną procedurę. Ogólnie w temacie do którego dałem link, dowiesz się dla czego. Pięć serwo i wolny bascom. Chyba nie wiesz czym to grozi. Ma Pan rację. Zweryfikowałem w praktyce. Mikroprocesor AtMega168 taktowany kwarcem 18MHz. Przy zakładanej rozdzielczości 10us w między przerwaniami od przepełnienia Timer0 jest 160 cykli maszynowych. Obsługa jednego serwa "na piechotę" była idealna, okres wynosił 20ms, ale po dodaniu instrukcji warunkowych (w obsłudze przerwania) dla drugiego serwa czas ten się rozjechał do ok 23ms. Przy korzystaniu z dedykowanych poleceń (Config Servo) też nie jest idealnie. Parametr "Reload" wcale nie jest w us, jak napisano to w helpie. Przy wartości "Reload" ustawionej na 10 przy wyżej wymienionym taktowaniu mikroprocesora dla jednego serwa, okres wynosił 25ms. Przy wartości "Reload" ustawionej na 8 przy wyżej wymienionym taktowaniu mikroprocesora dla jednego serwa, okres wynosił 20ms. ale się zwiększał o kilka ms przy zwiększaniu ilości serw. Cytuj Link do komentarza Share on other sites More sharing options...
Wojtek Czerwiec 27, 2011 Autor tematu Udostępnij Czerwiec 27, 2011 BlackJack Ale ja nie potrzebuję wielkiej precyzji a przecież 6 serw to nie jest aż tak strasznie dużo. Powiem szczerze ,że nie interesuje mnie że serwo ustawi się np. 2stopnie za bardzo w lewo czy w prawo bo i tak będe sterował nimi ręcznie i najwyżej skoryguję błąd. Układ ten nie będzie autonomiczny. Apropo Bascoma to ja mam tego z kursu Avt ,więc raczej starszego. Ale zdecydyje się na dwa procki choćby z powodu nadmiaru serw. Cytuj Link do komentarza Share on other sites More sharing options...
BlackJack Czerwiec 27, 2011 Udostępnij Czerwiec 27, 2011 Tamten też nie był autonomiczny, to było ramię manipulatora robota. Jak czasy zaczną ci się rozjeżdźać 2-3ms, to zacznie ci się to trząść jak galareta. Nie dasz rady ręcznie korygować. I nie chodzi o to e ty nie wyrobisz, tylko o to że servo będzie otrzymywało na tyle różne impulsy, że zacznie wibrować. Cytuj Link do komentarza Share on other sites More sharing options...
Wojtek Czerwiec 27, 2011 Autor tematu Udostępnij Czerwiec 27, 2011 BlackJack Nawet przy kwarcu 16Mhz? Czyli ile serw może maksymalnie przypadać na procka z dyrektywą config servos żeby działało to stabilnie? Cytuj Link do komentarza Share on other sites More sharing options...
Harnas Czerwiec 27, 2011 Udostępnij Czerwiec 27, 2011 Zobacz robota Skarabeusz. W nim bascomowa instrukcja config serwo obsługuje bez problemu 12 serw. Cytuj Link do komentarza Share on other sites More sharing options...
Sabre Czerwiec 27, 2011 Udostępnij Czerwiec 27, 2011 Wojtek, wielokrotnie była o tym mowa, że bascomowe polecenie config servo jest mówiąc krótko do dupy. Jedno serwo, dwa góra, z każdym kolejnym jest coraz większy problem, żeby całość w ogóle działała. Mi się ledwo udało 2 serwa ruszyć, ale i tak nie działało to tak jakbym chciał. W końcu użyłem sprzętowego PWMa do sterowania serwami ale musiałem kupić specjalnie dobrany rezonator chyba na 6,53..MHz Cytuj Link do komentarza Share on other sites More sharing options...
BlackJack Czerwiec 27, 2011 Udostępnij Czerwiec 27, 2011 Hm.. musisz sam poeksperymentować, bo ja nie korzystam z gotowych funkcji BASCOMa, Większość piszę sam, ale powodem jest głównie to że BASCOM praktycznie zerowo wspiera moje ATTINY861 i ATTINY85. Zresztą w domu mam co najwyżej 2 serva. Ale poczytaj sobie temat który wskazałem, tam na pewno znajdziesz wiele ciekawych informacji. 1 Cytuj Link do komentarza Share on other sites More sharing options...
Wojtek Czerwiec 27, 2011 Autor tematu Udostępnij Czerwiec 27, 2011 A właśnie jak KD93 udało się sterować 12 serwami w skarabeuszu z użyciem jednego procesora bo przejrzałem opis tego robota i inforamacji na ten temat nie znalazłem? No trudno , jakby coś to dam sobie rade z tymi timerami bo w tym temacie nie jestem taki kompletnie zielony. I czy konieczna w końcu okaże się zmiana kwacu czy uC może działać na wewnętrznym. [ Dodano: 27-06-2011, 22:51 ] No udało mi się. 😃 Zrobiłem własny sterwonik 5 serw na attiny2313 i wewnętrznym kwarcu 1Mhz. Poniżej daję algorytm. Porty od b.0 do b.4 odpowiadają za wysyłanie sygnału do serw a pozostałe zostaną podciągnięte do masy przez przyciski umożliwiające sterowanie serwami. '********************************************************* '********************************************************* '***STEROWNIK 5 SERWOMECHANIZMÓW NA ATiny2313 i 1Mhz *** '********************************************************* '********************************************************* Config Portb = &B11100000 'konfigurujemy wejścia i wyjścia Portb = &B11100000 'stany spoczynkowe Config Portd = &B1111111 'konfigurujemy wejścia i wyjścia Portd = &B1111111 'stany spoczynkowe Dim Serwo1 As Word 'zmienna określająca pozycję 1 serwa Dim Serwo2 As Word 'zmienna określająca pozycję 2 serwa Dim Serwo3 As Word 'zmienna określająca pozycję 3 serwa Dim Serwo4 As Word 'zmienna określająca pozycję 4 serwa Dim Serwo5 As Word 'zmienna określająca pozycję 5 serwa Dim Ktoreserwo As Byte 'zmienna określająca które serwo jest obsługiwane Dim Flafa As Bit 'bit sygnalizujący koniec zliczania Dim Flaga2 As Bit 'bi odpowiedzialny za przerwę między sygnałami Dim Pomoc As Bit 'bit pomocniczy Dim Pomoc2 As Bite 'drugi bit pomocniczy Config Timer1 = Timer ,Prescale = 1 'jedno "tyknięcie" timera to 1us Config Timer0 = Timer ,Prescale = 1024 'jedno "tyknięcie" timera co ok. 1ms Enable Interrupts 'globalne odblokowanie systemu przerwań Enable Timer1 'włączam Timer1 Enable Timer0 'Timer0 też Stop Timer1 'na razie zastopuje ten timer Stop Timer0 'ten też On Timer1 podprogram 'po przepełnieniu przejdź do podprogram On Timer0 podprogram2 'po przepełnieniu przejdź do podprogram2 Serwo1 = 64036 'serwa ustawiam w pozycji neutralnej Serwo2 = 64036 Serwo3 = 64036 Serwo4 = 64036 Serwo5 = 64036 Ktoreserwo = 0 'a inne zmienne zeruję Flaga = 0 Flaga2 = 0 Pomoc = 0 Pomoc2 = 1 Do 'rozpoczynam pętle główną If Ktoreserwo = 0 Then 'odrazu zostanie obsłużone pierwsze serwo Portb.0 = 1 'rozpoczynam podawanie sygnału If Pomoc2 = 1 Then 'jeżeli bit pomoc2 = 1 to : Timer1 = Serwo1 'wczytuję do timera wartość odpowiedniej zmiennej Pomoc2 = 0 'uniemożliwiam ponowne wczytanie zmiennej do timera End If 'koniec dyrektywy warunkowej Start Timer1 'rozpoczynam zliczanie timera If Flaga = 1 Then 'jeżeli timer skończy zliczać to Flaga = 0 'zeruję flagę Portb.0 = 0 'kończę podawanie sygnału na serwo Stop Timer1 'stopuję timer Incr Ktoreserwo 'umożliwiam obsłużenie kolejnego serwa Pomoc2 = 1 'umożliwiam ponowne wczytanie zmiennej do timera End If 'koniec dyrektywy warunkowej End If 'i tu też If Ktoreserwo = 1 Then 'analogicznie osługuję pozostałe serwa Portb.1 = 1 If Pomoc2 = 1 Then Timer1 = Serwo2 Pomoc2 = 0 End If Start Timer1 If Flaga = 1 Then Flaga = 0 Portb.1 = 0 Stop Timer1 Incr Ktoreserwo Pomoc2 = 1 End If End If If Ktoreserwo = 2 Then Portb.2 = 1 If Pomoc2 = 1 Then Timer1 = Serwo3 Pomoc2 = 0 End If Start Timer1 If Flaga = 1 Then Flaga = 0 Portb.2 = 0 Stop Timer1 Incr Ktoreserwo Pomoc2 = 1 End If End If If Ktoreserwo = 3 Then Portb.3 = 1 If Pomoc2 = 1 Then Timer1 = Serwo2 Pomoc2 = 0 End If Start Timer1 If Flaga = 1 Then Flaga = 0 Portb.3 = 0 Stop Timer1 Incr Ktoreserwo Pomoc2 = 1 End If End If If Ktoreserwo = 4 Then Portb.4 = 1 If Pomoc2 = 1 Then Timer1 = Serwo3 Pomoc2 = 0 End If Start Timer1 If Flaga = 1 Then Flaga = 0 Portb.4 = 0 Stop Timer1 Incr Ktoreserwo Pomoc2 = 1 End If End If If Serwo1 < 63536 Then Serwo1 = 63536 'poniższe procedury zatrzymują zmniejszanie lub If Serwo2 < 63536 Then Serwo2 = 63536 'zwiększanie zmiennych gdy serwo znajdzie się w If Serwo3 < 63536 Then Serwo3 = 63536 'pozycji skrajnej If Serwo4 < 63536 Then Serwo4 = 63536 If Serwo5 < 63536 Then Serwo5 = 63536 If Serwo1 > 64536 Then Serwo1 = 64536 If Serwo1 > 64536 Then Serwo1 = 64536 If Serwo1 > 64536 Then Serwo1 = 64536 If Serwo1 > 64536 Then Serwo1 = 64536 If Serwo1 > 64536 Then Serwo1 = 64536 If Ktoreserwo = 5 And Pomoc = 1 Then 'jeżeli wszystkie serwa zostaną obsłużone to Start Timer0 'włącz timer0 który "tyka" co około 1ms Timer0 = 239 '256 - 239 = 17 czyli 17 tyknięć do przepełnienia Pomoc = 0 'wyzeruję pomoc czym uniemożliwie ponowne uruchomienie End If 'tego warunku w czasie krótrzym niż Timer0 nie skończy 'zliczać If Pinb.6 = 0 And Flaga2 = 1 Then Incr Serwo1 'jeżeli trzymam przycisk wciśnięty co 25ms automatycznie If Pinb.7 = 0 And Flaga2 = 1 Then Decr Serwo1 'zwiększa mi się (lub zmniejsza) wartość zmiennej If Pind.0 = 0 And Flaga2 = 1 Then Incr Serwo2 'wynika to z tego że raz na 25ms timer0 przyjmuję If Pind.1 = 0 And Flaga2 = 1 Then Decr Serwo2 'wartość 231 If Pind.2 = 0 And Flaga2 = 1 Then Incr Serwo3 If Pind.3 = 0 And Flaga2 = 1 Then Decr Serwo3 If Pind.4 = 0 And Flaga2 = 1 Then Incr Serwo4 If Pind.5 = 0 And Flaga2 = 1 Then Decr Serwo4 If Pind.6 = 0 And Flaga2 = 1 Then Incr Serwo5 If Pinb.5 = 0 And Flaga2 = 1 Then Decr Serwo5 If Flaga2 = 1 Then 'jeżeli timer0 skończy zliczać to Flaga2 = 0 'wyzeruję flagę Ktoreserwo = 0 'umożliwię obsługe pierwszego serwa Pomoc = 1 'umożliwię ponowne włączenie timera0 End If Loop 'koniec pętli End 'koniec programu głównego Podprogram: 'gdy timer1 się przepełni ustawi się Flaga = 1 'bit flagi na 1 Return 'powrót do programu głównego Podprogram2: 'gdy timer0 się przepełni ustawi się Flaga2 = 1 'flaga2 na 1 Stop Timer0 'stopuję timer0 Return 'powrót do podprogramu Proszę sprawdzić czy to będzie działać. Cytuj Link do komentarza Share on other sites More sharing options...
Luko Czerwiec 28, 2011 Udostępnij Czerwiec 28, 2011 Wojtek, skoro piszesz pierw że: No udało mi się. 😃 Zrobiłem własny sterwonik 5 serw na attiny2313 i wewnętrznym kwarcu 1Mhz to chyba to zdanie Proszę sprawdzić czy to będzie działać.ostatnie zdanie nie ma najmniejszego sensu. W każdym bądź razie w temat serw, z tego co ja pamiętam w bascomie działa to dopiero przy kwarcu 10MHz. Do tego Timer0 i 1 zaprzęgasz do innych zadań, a funkcja config servo korzysta przy użyciu któregoś z nich, więc wyjdzie kasztan. Cytuj Link do komentarza Share on other sites More sharing options...
Wojtek Czerwiec 28, 2011 Autor tematu Udostępnij Czerwiec 28, 2011 Luko Oczywiście ,że ma sens. Przecież może istnieć sterownik serw ,który nie działa. A poza tym gdybyś łaskawie przeczytał mój program to byś widział ,że nie używam w nim poleceń config servos. 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!