Dvoukanál SSC
Je téměř stejný kód jako předcházející „Dvoukanál“, jen pro příjem používá protokol SSC (Serial Servo Controler) a je tam drobné „vylepšení“, které se týká citlivosti pohybu serva. To znamená , že si můžete volit krok v 0.5us o který servo polohuje při změně hodnoty kterou posíláte. V programu je default krok = 6 tedy 3us. Krok můžete libovolně měnit, adresa registru je 7 (jelikož používáme pouze dvě serva a také si jí můžete změnit). Pokud pošlete krok 0 servo se samozřejmě nepohne, pokud krok bude vysoká hodnota, bude celý přejezd rozsahu pouze pár poloh (to se může také někdy hodit). Neutrál nebo jinak střed je standardních 1500us.
$regfile = "attiny2313.dat" ' typ MCU
$crystal = 16000000 ' kmitočet krystalu
$baud = 38400 ' rychlost seriového portu
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 ' default use 10 for the SW stack
$framesize = 16
Config Portb.3 = Output ' servo "0"
Config Portb.4 = Output ' servo "1"
Dim Packethere As Bit
Dim A As Byte ' pomocné proměnné
Dim H As Word
Dim X8(4) As Byte ' v X8(1) je registr kam zapisovat
Dim Ix8 As Byte ' index přijatého byte
Dim Krok As Byte ' citlivost serva 1-14
Dim Minpuls As Word
Dim Puls As Word
Config Serialin = Buffered , Size = 20 ' bufer pro příjem byte po seriové lince
Enable Interrupts ' pro funkci bufferu je nutné mít zapnuté globální IRQ
Ix8 = 1
Compare1a = 3000 ' nastavení šířky pulzu pro servo "0" v 0,5us
Compare1b = 3000 ' nastavení šířky pulzu pro servo "1" v 0,5us
Capture1 = 40000 ' TOP TIMER1u 40000 = 20ms
Tccr1a = &B10100010 ' konfigurace TIMER1 viz datasheet strana 82
Tccr1b = &B00011010 ' konfigurace TIMER1 viz datasheet strana 82
Krok = 6 ' 6 je 0.5us *6 tedy krok 3us
Do ' Hlavní smyčka programu
While Ischarwaiting() = 1 ' Dokud čekají nějaké znaky ve vstupním buferu seriového portu
' tak prováděj jeho čtení
A = Inkey()
If A <> 255 Then ' neni &ff zapisujeme byte
X8(ix8) = A ' x8 - prijaty byte
Incr Ix8 ' index +1
If Ix8 = 3 Then ' prijaty dva byte, nastavuji, ze paket prijat
Set Packethere
Ix8 = 1
End If
' je &ff tedy reset indexu
Else
Ix8 = 1
End If
If Ix8 > 3 Then
Ix8 = 1 ' zabrani preteceni
End If
Wend
If Packethere = 1 Then ' Pokud se přijal platný paket, vyhodnocujeme
Select Case X8(1)
Case 0 To 1 : H = Krok * 127
Minpuls = 3000 - H
H = X8(2) * Krok
Puls = Minpuls + H
If X8(1) = 0 And Puls >= 1800 And Puls =< 4200 Then Compare1a = Puls ' pokud je hodnota v povoleném rozsahu (900us - 2100us)
If X8(1) = 1 And Puls >= 1800 And Puls =< 4200 Then Compare1b = Puls ' zapisujeme puls do Compare1x
Case 7 : Krok = X8(2)
End Select
Reset Packethere ' smažeme příznak nově přijatého paketu
End If
Idle ' pokud nepřichází nové instrukce , odpočinek
Loop ' konec smyčky
Schéma zapojení je stejné jako v konstrukci "Dvoukanál" rozdíl je pouze v ovládacím protokolu.