[bascom] program do ramienia robota
Zgadzam się z pomysłem obsługi klawiatury w przerwaniu od przepełnienia licznika (zwykle tak to robię, efektywna programowa eliminacja drgań styków, nie wstrzymuje działania programu).
Pamiętać jednak należy że przy wykorzystaniu predefiniowanych poleceń do obsługi serw nie można używać Timera0 do obsługi multipleksowanej klawiatury, gdyż polecenia te korzystają z tego timera. Można wykorzystać drugi timer, ale co się będzie działo gdy przerwanie jednego timera nie zostanie obsłużone (wystąpi w trakcie obsługi przerwania drugiego timera)?
Pamiętać jednak należy że przy wykorzystaniu predefiniowanych poleceń do obsługi serw nie można używać Timera0 do obsługi multipleksowanej klawiatury, gdyż polecenia te korzystają z tego timera. Można wykorzystać drugi timer, ale co się będzie działo gdy przerwanie jednego timera nie zostanie obsłużone (wystąpi w trakcie obsługi przerwania drugiego timera)?
-
keruseykaryu
Poczeka jak każde inne i właduje się za powrotem z innego. Chyba, że sobie ustalisz priorytety - ale tylko programowo, i wtedy lepiej pisać je jako gołe bo sterta lawinowo zarośnie. A jak się pojawią dwa to wygra te co ma mniejszy adres.c4v2 pisze:Można wykorzystać drugi timer, ale co się będzie działo gdy przerwanie jednego timera nie zostanie obsłużone (wystąpi w trakcie obsługi przerwania drugiego timera)?
Sterowania jednym Timerem wywołaniem, kolejno serw i odczytem klawiatury w międzyczasie.
PS.
Widzę mój rysunek tak was załamam że temat zamarł, jak nie wiecie o co w nim biega powiedzcie to wam kod napiszę. Czas jednego cyklu czyli 22,5ms jest umowny można go spokojnie skrócić do 20ms.
PS.
- Załączniki
-
- klaw_serwa.JPG (4.86 KiB) Przejrzano 15853 razy
Temat nie zamarł
odmierzanie impulsów rzędu 2ms jest bardzo łatwe. Ale chodzi o realizację położenia wałków serw z jak największa precyzją (na tyle na ile pozwalają parametry serwa serwa). I najprawdopodobniej bez rozbudowania części sprzętowej, na samym mikroprocesorze (dla większej ilości serw) nie da się uzyskać takiej precyzji na jaką pozwalają parametry serwa.
Według normy RC impulsy mają być powtarzane co 20ms. Tak zwane "serwa cyfrowe" mogą być gęściej "taktowane".
Parametry przykładowego serwa:
Czy jest to zakres zmiany szerokości dodatniego impulsu na który serwo nie reaguje (rodzaj histerezy)?
Jeżeli tak to wyznacza to precyzje z jaka można sterować serwem.
Według normy RC impulsy mają być powtarzane co 20ms. Tak zwane "serwa cyfrowe" mogą być gęściej "taktowane".
Parametry przykładowego serwa:
Nie wiem tylko jak mam rozumieć parametr "szerokość martwej strefy?System sterowania: dodatni impuls z sygnałem sterującym 1500 µs dla neutrum
Wymagany impuls: napięcie międzyszczytowe 3 ÷ 5 V
Kąt działania: 40° w obie strony, przy czasie impulsu 400 µs
Kierunek obrotu: zgodny z ruchem wskazówek zegara
czas trwania impulsu 1500 ÷ 1900 µs
Szerokość martwej strefy: 5 µs"
Czy jest to zakres zmiany szerokości dodatniego impulsu na który serwo nie reaguje (rodzaj histerezy)?
Jeżeli tak to wyznacza to precyzje z jaka można sterować serwem.
Żaden problem, jeżeli timer 1 będzie ci odmierzał ten czas. A te 5us to pewnie histereza, aby serwo nie wpadało w drgania. Inaczej musiał byś mieć niesamowitą precyzję impulsów sterujących.Ale chodzi o realizację położenia wałków serw z jak największa precyzją (na tyle na ile pozwalają parametry serwa serwa).
______________________________________________________________________________
PS. Ja na razie nabroiłem 5% pamięci kodu, a mam jakieś 40-50% programu gotowe. Właściwie to zostało mi jeszcze zaimplementować klawiaturę i wszystko. Nie wiem tylko czemu BASCOM twierdzi że M168 nie ma Timera 1
c4v2 - potem porównamy nasze programy. Mnie wystarczy 1MHz taktowania CPU.
-
konrad1115
- -
- Posty: 17
- Rejestracja: 06 sty 2011, 9:13
- Lokalizacja: Rajbrot
- Kontakt:
Program załączony w załączniku jest gęsto "okometowany" więc opis działania tutaj jest zbędny, a idea działania jest zobrazowana na rysunku. Aby można było korzystać z zalet "multinaciskanej" klawiatury ("jednoczesny" ruch serwomechanizmów) należy zmodyfikować klawiaturę według poniższego rysunku:
- Załączniki
-
- Modyfikacja klawiatury.
- Kbd_3x4.png (4.6 KiB) Przejrzano 15597 razy
-
- Serwo_x8_0v5.zip
- Program:
- (3.83 KiB) Pobrany 673 razy
Kurna przyszpiliły mnie inne prace, wstawię tutaj kod bez obsługi klawiatury. Nie testowałem go w praktyce, ale w symulacji działało. Jak znajdę czas to dopisze brakujący fragment obsługi klawiatury. Ale ogólna moja idea, jest tu widoczna.
Kod: Zaznacz cały
'*****************************************************************************
'* HTSC -HyperThreading Servomotor Controler *
'* CPU - ATMEGA 168 *
'* FCPU - 1MHz internal RC *
'*****************************************************************************
$sim
$regfile = "m168def.dat"
$crystal = 1000000
Config Portc.0 = Output
Config Portc.1 = Output
Config Portc.2 = Input
Config Portc.3 = Input
Config Portc.4 = Input
Config Portc.5 = Input
Config Portb.0 = Output
Config Portd.3 = Output
Config Portd.4 = Output
Config Portd.5 = Output
Config Portd.6 = Output
Config Portd.7 = Output
Config Timer0 = Timer , Prescale = 64
Stop Timer0
Config Timer1 = Timer , Prescale = 1 'bo cykl uC trwa dokładnie 1us
Stop Timer1
Enable Interrupts
Enable Timer0
Enable Timer1
'declare
On Timer0 Sterowanie
On Timer1 Off_serwo
'const , dim
Dim S_time(5) As Word
Dim Pomocnicza As Word
Dim Wsk_serwa As Byte
Dim I As Byte
Dim S As Bit
Const 2_5ms = 40 '2560us
Const 1_5ms = 23 '1472us
'razem daje to pełen cykl dla 5 serw co 20160us (20,16ms)
Const Neutral = 1500
Portd = &H0
'Inicjacja pozycji wyjściowej serw.
For I = 1 To 5
S_time(i) = Neutral
Next
Wsk_serwa = 1
Reset S ' status na zero, czyli najpierw odczyt klawiatury
Load Timer0 , 1_5ms ' ładujemy pierwszy między czas
Enable Timer0 ' odblokowujemy przerwania od T0
Start Timer0 ' startujemy timer 0
Do
' i spokojnie czekamy na przerwania
Loop
End
Sterowanie:
Stop Timer0
If S = 0 Then
Load Timer0 , 1_5ms
Start Timer0
'obsługa klawiatury, mamy na to 1,5ms czyli 1472 cykle zegara
'zanim nadejdzie kolejne przerwanie od T0
Set S
Else
Load Timer0 , 2_5ms
Start Timer0
Pomocnicza = S_time(wsk_serwa)
Load Timer1 , Pomocnicza
Select Case Wsk_serwa
Case 1 : Set Portd.3
Case 2 : Set Portd.4
Case 3 : Set Portd.5
Case 4 : Set Portd.6
Case 5 : Set Portd.7
End Select
Start Timer1
'generowanie czasu dla serwa
Reset S
End If
Return
Off_serwo:
Stop Timer1
Select Case Wsk_serwa
Case 1 : Reset Portd.3
Case 2 : Reset Portd.4
Case 3 : Reset Portd.5
Case 4 : Reset Portd.6
Case 5 : Reset Portd.7
End Select
Incr Wsk_serwa
If Wsk_serwa > 5 Then
Wsk_serwa = 1
End If
Return
Dwie osoby i dwa różne podejścia (rozwiązana) problemu.
Oto oscylogramy z obu programów:
1. Pogram Pana Kyrona (1 i 2 serwo). Czas wysokiego impulsu równy 1.5ms dla każdego z serw. Dwa przerwania od przepełnień liczników, częstotliwość taktowania 1MHz.
2. Mój program (1 i sumaryczny przebieg dla wszystkich ośmiu serw (PB.1)). Czas wysokiego impulsu ustawiony na 1 ms dla każdego z serw. Jedno przerwanie od porównania Compare1a, częstotliwość taktowania 8MHz.
Na oscylogramach przebiegi są odwrócone (wzmacniacz odwracający w konstrukcji karty dźwiękowej).
Oto oscylogramy z obu programów:
1. Pogram Pana Kyrona (1 i 2 serwo). Czas wysokiego impulsu równy 1.5ms dla każdego z serw. Dwa przerwania od przepełnień liczników, częstotliwość taktowania 1MHz.
2. Mój program (1 i sumaryczny przebieg dla wszystkich ośmiu serw (PB.1)). Czas wysokiego impulsu ustawiony na 1 ms dla każdego z serw. Jedno przerwanie od porównania Compare1a, częstotliwość taktowania 8MHz.
Na oscylogramach przebiegi są odwrócone (wzmacniacz odwracający w konstrukcji karty dźwiękowej).
Szkoda że mój program nie jest dokończony w 100%, i nie ma tej klawiatury, ale ogólnie widzę nie pomyliłem się w obliczeniach i szacunkach, bo nie programowałem w BASCOM już sporo czasu.
Jak widać każdy problem można rozwiązać na wiele sposobów.
Że tak nazwa w nagłówku mojego programu jeszcze nikogo nie zaintygowała
Jak widać każdy problem można rozwiązać na wiele sposobów.
Że tak nazwa w nagłówku mojego programu jeszcze nikogo nie zaintygowała
-
konrad1115
- -
- Posty: 17
- Rejestracja: 06 sty 2011, 9:13
- Lokalizacja: Rajbrot
- Kontakt: