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.

 

Vyhledávání

Kontakt

Jiří Ježerský

Anketa

Bascom AVR

používám (94)
52%

nepoužívám (47)
26%

je to pro mě novinka (41)
23%

Celkový počet hlasů: 182