Jetzt habe ich 2 Probleme:
1. Der Wertebereich zur Servoansteuerung (bei mir 8 bis 19) ist zu klein. Eigtl. soll das eine Tricopter-Steuerung werden, da brauch ich auch PID-Regler usw.. Ich denke, dass damit zu ungenau geregelt wird?!
2. Der neue Wert, der per UART reinkommt, wird erst nach einer geschätzten Minute auf die Servo-Ausgänge gegeben.
Hier mal die Codes:
ATMEGA8:
Code:
$regfile = "m8def.dat"
$crystal = 16000000
$framesize = 100
$hwstack = 100
$swstack = 100
Open "COMD.4:38400,8,N,1" For Output As #1
Dim _bl(4) As Byte
Dim Channel As Byte
Dim Kanal(4) As Byte
Dim I As Byte
For I = 1 To 4
_bl(4) = 80
Next I
Config Timer2 = Timer , Prescale = 256
On Timer2 Detectrxpause
Enable Timer2
Config Int1 = Rising
On Int1 Getreceiver
Enable Int1
Config Pind.3 = Input
Portd.3 = 0
Enable Interrupts
Do
For I = 1 To 4
_bl(i) = 8
Next I
Printbin #1 , _bl(1) , _bl(2) , _bl(3) , _bl(4)
Wait 3
For I = 1 To 4
_bl(i) = 10
Next I
Printbin #1 , _bl(1) , _bl(2) , _bl(3) , _bl(4)
Wait 3
Loop
End
Getreceiver:
If Channel > 0 And Channel < 5 Then
Kanal(channel) = Timer2
End If
Timer2 = 6
Incr Channel
Return
Detectrxpause:
Channel = 0
Return
ATTINY45:
Code:
$regfile = "attiny45.dat"
$crystal = 8000000
$framesize = 40
$hwstack = 40
$swstack = 40
Open "COMB.0:38400,8,N,1" For Input As #1
Config Pinb.0 = Input
Config Servos = 4 , Servo1 = Portb.3 , Servo2 = Portb.2 , Servo3 = Portb.4 , Servo4 = Portb.1 , Reload = 100 , Interval = 100
Config Portb.1 = Output
Config Portb.2 = Output
Config Portb.3 = Output
Config Portb.4 = Output
Dim _bl(4) As Byte
Dim _blold(4) As Byte
Dim I As Byte
Const Min_servo = 8 '900µs
Const Max_servo = 19 '2000µs
For I = 1 To 4
_bl(i) = Min_servo
_blold(i) = _bl(i)
Servo(i) = _bl(i)
Next I
Enable Interrupts
Wait 2
Do
Inputbin #1 , _bl(1) , 4
For I = 1 To 4
If _bl(i) <> 0 And _bl(i) <> 255 Then
If _bl(i) >= Min_servo And _bl(i) <= Max_servo Then
Servo(i) = _bl(i)
End If
End If
Next I
Loop
End
Wo liegt mein Fehler?
Gruß
Chris
Lesezeichen