Dvoukanál
je ovládání pouze dvou modelářských serv pro jednoduché konstrukce. Signál pro řízení serv je generován pomocí 16bitového TIMER1, vše ostatní slouží pro příjem řídícího paketu (4 byte) a nastavení ATTiny2313. Zapojení je s krystalem 16Mhz, dál budeme potřebovat zdroj 5V pro MCU a serva, nějaký ten kondenzátor a to je vše. Datasheet ATTiny je zde.
Ovládací paket je popsán na stránce komunikační protokol a samozřejmě můžete k ovládání použít software který byl již uveřejněn. Bude fungovat pouze servo "0" a "1".
Zde je zdrojový kód v BASCOM AVR, kompilovat můžete ve verzi volně ke stažení, zde je celý balík souborů z kompilace.
$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" pin nastaven
Config Portb.4 = Output ' servo "1" pin nastaven
Dim Packethere As Bit
Dim A As Byte ' pomocné proměnné
Dim H1 As Word ' pomocné proměnné
Dim X8(4) As Byte ' v X8(1) je registr kam zapisovat
Dim Ix8 As Byte ' index přijatého byte
Dim Param As Word ' zde se uloží hodnota z paketu
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 ' index přijatého byte
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
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 <> 13 Then ' 13tkou končí paket
If A > 31 Then ' vsechny datove byte jsou vetsi nez 31
X8(ix8) = A - 32
Incr Ix8
Else
Ix8 = 1
End If
Else
If Ix8 = 4 Then ' ctvrty je enter, příznak konce paketu
H1 = 224 * X8(2) ' podle algoritmu spočteme hodnotu, která se uloží do param
Param = H1 + X8(3)
Param = Param * 2 ' TIMER1 pracuje s 0,5us, do MCU posíláme šířku pulsu v 1us
Set Packethere ' nastaví že byl uspěšně přijat paket
End If
Ix8 = 1
End If
If Ix8 > 4 Then
Ix8 = 1 ' zabrani preteceni
End If
Wend
If Packethere = 1 Then ' Pokud se přijal platný paket, vyhodnocujeme
If X8(1) = 0 And Param >= 1800 And Param =< 4200 Then Compare1a = Param ' pokud je hodnota v povoleném rozsahu (900us - 2100us)
If X8(1) = 1 And Param >= 1800 And Param =< 4200 Then Compare1b = Param ' zapisujeme param do Compare1x
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
Nesmíme zapomenout na schéma, kam serva připojit. Servo "0" bude na pinu 15 (PORTB.3) a servo "1" na pinu 16 (PORTB.4).
Můžete samozřejmě použít i krystal 8Mhz , zjednoduší se tím kód, budete přímo pracovat s 1us , pak bude nutné upravit všechny řádky, kde je uváděna délka pulsu v 0.5us. Jsou to řádky označené červeně, hodnoty budete muset dělit dvěma. Řádek, kde se proměnná "param" násobí dvěma úplně vynechte.