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