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 (ATMEGAwird 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:
ATMEGA8: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
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.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
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







Zitieren

Lesezeichen