Skocz do zawartości

Konfiguracja fusebitów i podłączenie do ISP


Wojtek

Pomocna odpowiedź

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?

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

➡️ 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ł".

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

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

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.

  • Lubię! 1
Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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.

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.