Ok, das mit dem festen Senden von Daten und dem Blinken werd ich mal ausprobieren, damit ich weiß, was funktioniert und was nicht! Alternativ dazu möchte ich auch noch den PC über einen MAX232 anschließen, um die Input-Daten vom ATTINY ausgeben zu lassen. Mal sehen, was dabei rauskommt..
@Richard:
Kannst du mir sagen, wo der Unterschied zwischen Inputbin und Get liegt? Ich habe keinen gefunden, evtl. bin ich momentan etwas zu abgelenkt, ums zu sehen.. Wäre nett von dir.
Gruß
Chris
EDIT:
Habs jetzt endlich erfolgreich geschafft, das meiste so hinzubiegen, wie ich es will![]()
Hier mal die Codes:
ATMEGA8:
ATTINY2313:Code:$regfile = "m8def.dat" $crystal = 16000000 $framesize = 80 $hwstack = 80 $swstack = 80 $baud = 115000 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 Start_byte = 127 Const _maxchannel = 4 Dim Bufferbyte As Byte Dim Kanal(_maxchannel) As Byte Dim Channel As Byte Dim _bl(_maxchannel) As Word Dim I As Byte Dim _crc As Word Enable Interrupts Do For I = 1 To 4 _bl(i) = 63200 Next I _crc = Crc16(_bl(1) , 4) Printbin Start_byte ; _bl(1) ; _bl(2) ; _bl(3) ; _bl(4) ; _crc Waitms 100 Loop End Getreceiver: If Channel > 0 And Channel < 5 Then Kanal(channel) = Timer2 End If Timer2 = 6 Incr Channel Return Detectrxpause: Channel = 0 Return
Der Unterschied liegt wirklich im Servo-Code! Danke für den Tip... Jetzt gehts auf die nächste Hürde zu, das Summensignal auf den Servo-Bereich umzuskalieren. Danach muss noch die WM+ eingebunden werden.Code:$regfile = "attiny2313.dat" $crystal = 16000000 $framesize = 30 $hwstack = 32 $swstack = 30 $baud = 115000 Config Timer1 = Timer , Prescale = 8 Timer1 = 62535 On Timer1 Servoirq Enable Timer1 Config Portd.2 = Output Config Portd.3 = Output Config Portd.4 = Output Config Portd.5 = Output Dim Kanal As Byte Dim Servo(4) As Word Dim _bl(4) As Word Dim I As Word Dim _crc As Word Dim _crcold As Word Dim _start As Byte 'min: 61535, mitte 62535, max 63535 = 2000 schritte Const Start_byte = 127 Const Min_servo = 63800 Const Max_servo = 61535 Const Diff_servo = Max_servo - Min_servo For I = 1 To 4 _bl(i) = Min_servo Servo(i) = _bl(i) Next I Enable Interrupts Wait 3 Do If Ischarwaiting() > 0 Then Inputbin _start If _start = Start_byte Then Inputbin _bl(1) , _bl(2) , _bl(3) , _bl(4) , _crc If _crc = Crc16(_bl(1) , 4) And _crc <> _crcold Then For I = 1 To 4 Servo(i) = _bl(i) Next I _crcold = _crc End If Else For I = 1 To 4 Servo(i) = Min_servo Next I End If End If Loop Servoirq: If Kanal = 0 Then If Portd.2 = 0 Then 'wenn port low Timer1 = Servo(1) 'dann timer auf entsprechende verzögerung Portd.2 = 1 'und port anschalten Else 'das hier passiert erst bei dem darauf folgenden interrupt Portd.2 = 0 'dann port wieder ausschalten Incr Kanal 'und den nächsten kanal bearbeiten End If End If If Kanal = 1 Then If Portd.3 = 0 Then Timer1 = Servo(2) Portd.3 = 1 Else Portd.3 = 0 Incr Kanal End If End If If Kanal = 2 Then If Portd.4 = 0 Then Timer1 = Servo(3) Portd.4 = 1 Else Portd.4 = 0 Incr Kanal End If End If If Kanal = 3 Then If Portd.5 = 0 Then Timer1 = Servo(4) Portd.5 = 1 Else Portd.5 = 0 Incr Kanal End If End If If Kanal = 4 Then Timer1 = 65530 '40000 | eine pause von ca. 12ms bis zum nächsten interrupt. Bei guten Servos oder Brushlessreglern kann man hier bis auf 65530 gehen ==> ansteuerfrequenz von ~ 200Hz Kanal = 0 End If Return End







Zitieren

Lesezeichen