Hallo,
hab mir jetzt ein neues Board gemacht, mit einem ATMEGA8 (@16MHz) und einem ATTINY2313 (@16MHz). Den Servo-Befehl hab ich mir jetzt selbst geschrieben, funktioniert sehr gut. Allerdings habe ich jetzt ein neues Problem, welches vorher schon angesprochen wurde (glaube ich); und zwar kann es passieren, dass die Synchronisation verloren geht, d.h. der Wert vom 1. Motor (ATMEGA
wird beim ATTINY2313 plötzlich zum Wert für den 2. / 3. / 4. Motor... Jetzt brauche ich eine Art Check, ob die Daten auch richtig zugeordnet werden, z.b. mittels einem Anfangs- und einem End-Byte?! Wäre das sinnvoll, oder denkt ihr, es gäbe eine einfachere / bessere / schnellere Lösung?
Hier mal die Codes:
ATTINY2313:
Code:
$regfile = "attiny2313.dat"
$crystal = 16000000
$framesize = 30
$hwstack = 30
$swstack = 30
$baud = 115000
Config Timer0 = Timer , Prescale = 1 '100kHz
Timer0 = 96
On Timer0 Servo_irq
Enable Timer0
Config Portd.2 = Output
Config Portd.3 = Output
Config Portd.4 = Output
Config Portd.5 = Output
Dim Servo(4) As Byte
Dim _ist As Byte
Dim _bl(4) As Byte
Dim I As Byte
Const Min_servo = 65
Const Max_servo = 160
For I = 1 To 4
_bl(i) = Min_servo
Servo(i) = _bl(i)
Next I
Enable Interrupts
Do
Inputbin _bl(1) , 4
For I = 1 To 4
If _bl(i) < Min_servo Then _bl(i) = Min_servo
If _bl(i) > Max_servo Then _bl(i) = Max_servo
Servo(i) = _bl(i)
Next I
Loop
End
Servo_irq:
Timer0 = 96
Incr _ist
If _ist >= 200 Then _ist = 0
If Servo(1) > _ist Then
Portd.2 = 1
Else
Portd.2 = 0
End If
If Servo(2) > _ist Then
Portd.3 = 1
Else
Portd.3 = 0
End If
If Servo(3) > _ist Then
Portd.4 = 1
Else
Portd.4 = 0
End If
If Servo(4) > _ist Then
Portd.5 = 1
Else
Portd.5 = 0
End If
Return
ATMEGA8:
Code:
$regfile = "m8def.dat"
$crystal = 16000000
$framesize = 80
$hwstack = 80
$swstack = 80
$baud = 115000
Config Serialout = Buffered , Size = 20
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
Const _maxchannel = 4
Dim Bufferbyte As Byte
Dim Kanal(_maxchannel) As Byte
Dim Channel As Byte
Dim _bl(4) As Byte
Dim I As Byte
For I = 1 To 4
_bl(i) = 0
Next I
Enable Interrupts
Wait 1
Do
For I = 1 To 4
_bl(i) = 200 - Kanal(i)
Next I
Printbin _bl(1) ; 4
Loop
End
Getreceiver:
If Channel > 0 And Channel < 5 Then
Kanal(channel) = Timer2
End If
Timer2 = 6
Incr Channel
Return
Detectrxpause:
Channel = 0
Return
Beim ATMEGA8 hab ich schon die Summensignal-Auswertung mit drinen! Das WM+ (welches noch an den ATMEGA8 kommt), wird erst später hinzugefügt, wenn das jetzt mal funktioniert.
Zur Hardware:
RxD vom ATTINY2313 ist mit TxD vom ATMEGA8 verbunden, DITO für die anderen beiden.
Ansonsten gibts IMHO keine wichtigen Infos über die Hardware (bzw. der Rest ist Standart), falls doch, einfach fragen 
Vielen Dank
Gruß
Chris
Lesezeichen