[bascom] program do ramienia robota

Jeśli jesteś modelarzem lub interesujesz się robotami i chcesz się podzielić swoim doświadczeniem to weź udział w dyskusjach na tym forum.
Awatar użytkownika
mr_x
Użytkownik
Posty: 385
Rejestracja: 12 gru 2010, 19:05
Lokalizacja: /bin/bash
Kontakt:

Post autor: mr_x » 09 sty 2011, 17:58

Obsługę klawiatury multipleksowanej również warto wykonać o przerwania z timera.

Awatar użytkownika
c4v2
Użytkownik
Posty: 426
Rejestracja: 22 lis 2005, 15:14
Lokalizacja: z przed monitora

Post autor: c4v2 » 09 sty 2011, 18:35

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)?

keruseykaryu

Post autor: keruseykaryu » 09 sty 2011, 19:31

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

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 10 sty 2011, 15:26

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.
Załączniki
klaw_serwa.JPG
klaw_serwa.JPG (4.86 KiB) Przejrzano 15851 razy

Awatar użytkownika
c4v2
Użytkownik
Posty: 426
Rejestracja: 22 lis 2005, 15:14
Lokalizacja: z przed monitora

Post autor: c4v2 » 11 sty 2011, 1:40

Temat nie zamarł :wink: 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:
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"
Nie wiem tylko jak mam rozumieć parametr "szerokość martwej strefy?
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.

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 11 sty 2011, 6:33

Ale chodzi o realizację położenia wałków serw z jak największa precyzją (na tyle na ile pozwalają parametry serwa serwa).
Ż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.
______________________________________________________________________________
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 :?: Ale w symulacji wszystko działa :o :?:
c4v2 - potem porównamy nasze programy. Mnie wystarczy 1MHz taktowania CPU.

Awatar użytkownika
c4v2
Użytkownik
Posty: 426
Rejestracja: 22 lis 2005, 15:14
Lokalizacja: z przed monitora

Post autor: c4v2 » 12 sty 2011, 3:25

Zatem mam już napisany "wstępnie" :wink: program. Przebiegi czasowe mnie satysfakcjonują (z zaimplementowaną obsługą klawiatury matrycowej). Obsługi klawiatury ale jeszcze jej nie sprawdziłem.

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 12 sty 2011, 17:30

Może któryś z kolegów wrzucić tu schemat (screnshot) w JPEG. bo nie chce mi się specjalnie instalować EAGLE. Albo podać do czego i jak podłączone jest ta klawiatura matrycowa.

konrad1115
-
Posty: 17
Rejestracja: 06 sty 2011, 9:13
Lokalizacja: Rajbrot
Kontakt:

Post autor: konrad1115 » 12 sty 2011, 20:57

moze byc????
Załączniki
schemat.png

Awatar użytkownika
c4v2
Użytkownik
Posty: 426
Rejestracja: 22 lis 2005, 15:14
Lokalizacja: z przed monitora

Post autor: c4v2 » 14 sty 2011, 8:03

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
Servo_Time_Idea.png
Idea działania programu:
Kbd_3x4.png
Modyfikacja klawiatury.
Kbd_3x4.png (4.6 KiB) Przejrzano 15595 razy
Serwo_x8_0v5.zip
Program:
(3.83 KiB) Pobrany 673 razy

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 18 sty 2011, 15:43

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

Awatar użytkownika
c4v2
Użytkownik
Posty: 426
Rejestracja: 22 lis 2005, 15:14
Lokalizacja: z przed monitora

Post autor: c4v2 » 18 sty 2011, 19:14

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).
Załączniki
1_Kyron_servo_scope.png
2_c4v2_servo_scope.png

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 18 sty 2011, 19:28

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 :wink:

konrad1115
-
Posty: 17
Rejestracja: 06 sty 2011, 9:13
Lokalizacja: Rajbrot
Kontakt:

Post autor: konrad1115 » 22 sty 2011, 9:01

na rysunku klawiatury matrycowej są do kazdego przycisku dołączone diody led zgadza się????

Awatar użytkownika
mr_x
Użytkownik
Posty: 385
Rejestracja: 12 gru 2010, 19:05
Lokalizacja: /bin/bash
Kontakt:

Post autor: mr_x » 22 sty 2011, 14:27

To nie są diody LED, a zwykłe diody małej mocy. W sumie nie są niezbędne, ale dzięki nim, przy naciskaniu kilku przycisków na raz, nie są zwierane niepotrzebnie sąsiednie piny mikrokontrolera.

ODPOWIEDZ