Mini8x - free
je kód volně k použití ve vašich projektch pro ovládání osmi modelářský serv. V případě, že použijete vývojové prostředí Bascom AVR, můžete dál upravovat a vylepšovat a nebo použít hotovou binárku z archivu. V ATTiny2313 musí být nastaveny fuses pro 16Mhz krystal, rychlost komunikačního portu je 38400. Pro komunikaci s PC nebo jiným kontrolérem se používá SSC protokol. Adresa serv je 0-7, délka kroku v 0.5us je v registru 9, registry 66 až 70 ovládají výstupní piny. Jak jsou signály rozmístněné na pinech IO najdete na stránce Mini8x (dokumentace je identická - schéma ,DPS).
$regfile = "attiny2313.dat"
$crystal = 16000000
$baud = 38400 ' use baud rate
$prog &HFF , &HCE , &HDF , &H00 ' generated. Take care that the chip supports all fuse bytes. To 8
$hwstack = 16 ' default use 32 for the hardware stack
$swstack = 8 ' default use 10 for the SW stack
$framesize = 8
Config Portb = Output
Config Portd.2 = Output
Config Portd.3 = Output ' svetlo ' serva
Config Portd.4 = Output ' svetlo
Config Portd.5 = Output ' svetlo
Config Portd.6 = Output ' svetlo
Dim Packethere As Bit
Dim A As Byte
Dim I As Byte
Dim I1 As Byte
Dim Ix As Byte
Dim H1 As Word ' index servos for timer
Dim S(8) As Word ' delky pulsu pro serva 1-8
Dim Q As Byte
Dim Krok As Byte
Dim X8(4) As Byte
Dim Ix8 As Byte
Dim H2 As Word
Dim Puls As Word
Dim Minpuls(8) As Word
Dim Maxpuls(8) As Word
Config Serialin = Buffered , Size = 20
Enable Interrupts
Ix8 = 1 ' nastavi indexy
Ix = 1
Krok = 10 ' krok v 0.5us = 5us
For I = 1
S(i) = 3000
Minpuls(i) = 1200 ' minimalni delka pulsu v 0.5us
Maxpuls(i) = 4800 ' maximalni delka pulsu v 0.5us
Next I
Capture1 = 4999 ' 2.5ms frame
Tccr1a = &B00000010
Tccr1b = &B00011010
On Oc1a Endpuls Nosave 'konfigurace irq timeru1
On Ovf1 Startpuls Nosave
Set Timsk.7
Set Timsk.6
Do ' hlavni smycka 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(1) adresa, x8(2) hodnota
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
Select Case X8(1)
Case 0 To 7 : H1 = Krok * 127 ' vypocet delky pulsu podle nastaveneho kroku
H2 = 3000 - H1
H1 = X8(2) * Krok
Puls = H2 + H1
I1 = X8(1) + 1
If Puls >= Minpuls(i1) And Puls <= Maxpuls(i1) Then S(i1) = Puls
Case 9 : Krok = X8(2)
Case 66 : If X8(2) = 0 Then Reset Portd.2 Else Set Portd.2
Case 67 : If X8(2) = 0 Then Reset Portd.3 Else Set Portd.3
Case 68 : If X8(2) = 0 Then Reset Portd.4 Else Set Portd.4
Case 69 : If X8(2) = 0 Then Reset Portd.5 Else Set Portd.5
Case 70 : If X8(2) = 0 Then Reset Portd.6 Else Set Portd.6
End Select
Reset Packethere
End If
Idle
Loop
Endpuls:
push r24
in r24,sreg
push r27
push r26
push r25
push r24
push r16
push r11
push r10
Portb = 0
Incr Ix
If Ix = 9 Then Ix = 1
Compare1a = S(ix)
pop r10
pop r11
pop r16
pop r24
pop r25
pop r26
pop r27
!out sreg,r24
pop r24
Return
Startpuls:
push r24
in r24,sreg
push r26
push r25
push r24
push r20
push r16
Q = Ix - 1
Set Portb.q
pop r16
pop r20
pop r24
pop r25
pop r26
!out sreg,r24
pop r24
Return