<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
		<id>https://rn-wissen.de/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Phyro</id>
		<title>RN-Wissen.de - Benutzerbeiträge [de]</title>
		<link rel="self" type="application/atom+xml" href="https://rn-wissen.de/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Phyro"/>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Spezial:Beitr%C3%A4ge/Phyro"/>
		<updated>2026-04-12T04:46:06Z</updated>
		<subtitle>Benutzerbeiträge</subtitle>
		<generator>MediaWiki 1.25.1</generator>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Servoansteuerung&amp;diff=15266</id>
		<title>Servoansteuerung</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Servoansteuerung&amp;diff=15266"/>
				<updated>2009-08-20T08:59:36Z</updated>
		
		<summary type="html">&lt;p&gt;Phyro: /* Quellcode */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Einleitung==&lt;br /&gt;
Die Ansteuerung von Servos mit z.B. mit einem Atmel Mega32 kann auf viele verschiedene Weisen erfolgen. Im folgenden findet ihr eine gut funktionierende Variante. Der Quellcode bezieht sich zwar auf einen Mega32 und BASCOM, aber gerade BASCOM-Code ist leicht verständlich und für andere Programmiersprachen übersetzbar. Es wird absichtlich nicht der BASCOM interne &amp;quot;SERVO&amp;quot; Befehl genutzt, da dieser nur sehr eingeschränkt und unbefriedigend (z.B. für fliegende Anwendungen) funktioniert.&lt;br /&gt;
Hier eine kurze Zusammenfassung der vorgeschlagenen Servoansteuerung:&lt;br /&gt;
# Der 16bit Timer wird mit einem Prescale von 8 genutzt (==&amp;gt; Interruptfrequenz ohne Preload von ~ 30Hz)&lt;br /&gt;
# Interrupt-Aktionen: Nacheinander werden die Servos mit ihrem PWM Signal versorgt:&lt;br /&gt;
# Port für das erste Servo auf High schalten&lt;br /&gt;
# 1 - 2 ms warten&lt;br /&gt;
# Port wieder auf Low schalten&lt;br /&gt;
# Nächstes Servo bearbeiten.&lt;br /&gt;
# Da viele billige Servos am besten funktionieren wenn die Zeit zwischen ihren Signalen ~ 20 ms (= 50Hz) beträgt, sollte nach dem Stellen des letzten Servos noch eine Pause eingelegt werden (ca. 12ms Pause). In einigen Anwendungen kann es aber erforderlich sein auf diese Pause zu verzichten (z.B. bei der Regelung von Brushless Motoren. Hier ist eine besonders hohe Stellfrequenz oftmals wünschenswert). Bei Verzicht auf diese Pause kann eine Refreshrate von 333Hz bis 166 Hz (bei 3 Brushlessreglern) erreicht werden.&lt;br /&gt;
&lt;br /&gt;
''Werden andere Quarzfrequenzen benutzt, kann man mit dem Tool rnAVR komfortabel die richtigen Preload und Prescale Werte errechnen:''&lt;br /&gt;
[http://www.roboternetz.de/phpBB2/dload.php?action=file&amp;amp;file_id=169 rnAVR im Roboternetz]&lt;br /&gt;
&lt;br /&gt;
==Quellcode==&lt;br /&gt;
Der Bascom Quellcode für eine Auflösung von 2000 Schritten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$regfile &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$baud = 19200&lt;br /&gt;
$crystal = 16000000&lt;br /&gt;
$framesize = 64&lt;br /&gt;
$swstack = 64&lt;br /&gt;
$hwstack = 64&lt;br /&gt;
Config Timer1 = Timer , Prescale = 8              'timer für servos&lt;br /&gt;
Enable Timer1&lt;br /&gt;
Timer1 = 62535&lt;br /&gt;
Config Portb = Output&lt;br /&gt;
Portb.0 = 0                                       'hier hängt servo1&lt;br /&gt;
Portb.1 = 0                                       'hier hängt servo2&lt;br /&gt;
Portb.2 = 0                                       'hier hängt servo3&lt;br /&gt;
Portb.3 = 0                                       'hier hängt servo4&lt;br /&gt;
&lt;br /&gt;
On Timer1 Servoirq                                'servo&lt;br /&gt;
&lt;br /&gt;
Enable Interrupts&lt;br /&gt;
&lt;br /&gt;
Dim Kanal As Byte&lt;br /&gt;
Dim Servo(4) As Word                              'min: 61535, mitte 62535, max 63535 = 2000 schritte&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
Servo(1) = 62535 'Mitte&lt;br /&gt;
Servo(2) = 62535 'Mitte&lt;br /&gt;
Servo(3) = 62535 'Mitte&lt;br /&gt;
Servo(4) = 62535 'Mitte&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
Servoirq:&lt;br /&gt;
If Kanal = 0 Then&lt;br /&gt;
   If Portb.0 = 0 Then                            'wenn port low&lt;br /&gt;
      Timer1 = Servo(1)                           'dann timer auf entsprechende verzögerung&lt;br /&gt;
      Portb.0 = 1                                 'und port anschalten&lt;br /&gt;
   Else                                           'das hier passiert erst bei dem darauf folgenden interrupt&lt;br /&gt;
      Portb.0 = 0                                 'dann port wieder ausschalten&lt;br /&gt;
      Incr Kanal                                  'und den nächsten kanal bearbeiten&lt;br /&gt;
   End If&lt;br /&gt;
End If&lt;br /&gt;
If Kanal = 1 Then&lt;br /&gt;
   If Portb.1 = 0 Then&lt;br /&gt;
      Timer1 = Servo(2)&lt;br /&gt;
      Portb.1 = 1&lt;br /&gt;
   Else&lt;br /&gt;
      Portb.1 = 0&lt;br /&gt;
      Incr Kanal&lt;br /&gt;
   End If&lt;br /&gt;
End If&lt;br /&gt;
If Kanal = 2 Then&lt;br /&gt;
   If Portb.2 = 0 Then&lt;br /&gt;
      Timer1 = Servo(3)&lt;br /&gt;
      Portb.2 = 1&lt;br /&gt;
   Else&lt;br /&gt;
      Portb.2 = 0&lt;br /&gt;
      Incr Kanal&lt;br /&gt;
   End If&lt;br /&gt;
End If&lt;br /&gt;
If Kanal = 3 Then&lt;br /&gt;
   If Portb.3 = 0 Then&lt;br /&gt;
      Timer1 = Servo(4)&lt;br /&gt;
      Portb.3 = 1&lt;br /&gt;
   Else&lt;br /&gt;
      Portb.3 = 0&lt;br /&gt;
      Incr Kanal&lt;br /&gt;
   End If&lt;br /&gt;
End If&lt;br /&gt;
&lt;br /&gt;
If Kanal = 4 Then&lt;br /&gt;
  Timer1 = 40000                                  'eine pause von ca. 12ms bis zum nächsten interrupt. Bei guten Servos oder Brushlessreglern kann man hier bis auf 65530 gehen ==&amp;gt; ansteuerfrequenz von ~ 200Hz&lt;br /&gt;
  Kanal = 0&lt;br /&gt;
End If&lt;br /&gt;
Return&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Empfängersignal durch µC durchschleifen==&lt;br /&gt;
Oftmals ist auch gewünscht das Signal eines RC-Empfängers einzulesen, die Daten zu bearbeiten/ mischen und dann wieder an Servos auszugeben. Den Code dafür findet ihr im folgenden (das gleiche wie oben aber erweitert mit der Empfängerauswertung). Hier werden die Servos weiterhin mit einer Auflösung von 2000 Schritten angesteuert, die Auflösung der Empfängerauswertung beträgt aber &amp;quot;nur&amp;quot; 72 Schritte. Meiner bescheidenen Meinung nach ist das für eine präzise Steuerung ausreichend. Oftmals werden die Empfängersignale nicht einfach durchgeschleift sondern untereinander bzw. mit Gyrosignalen gemischt. In diesen Fällen fällt die geringere Auflösung der Empfängerauswertung nicht mehr ins Gewicht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'RC-Signal durch Empfänger durchschleifen:&lt;br /&gt;
'Der Empfänger wird mit einer Auflösung von 74 Schritten abgefragt,&lt;br /&gt;
'die Servos werden mit einer Auflösung von 2000 Schritten angesteuert.&lt;br /&gt;
'Dabei ist die Wiederholfrequenz des Servosignals frei wählbar (35 bis zu 200 Hz).&lt;br /&gt;
$regfile &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$baud = 19200&lt;br /&gt;
$crystal = 16000000&lt;br /&gt;
$framesize = 64&lt;br /&gt;
$swstack = 64&lt;br /&gt;
$hwstack = 64&lt;br /&gt;
&lt;br /&gt;
Config Timer0 = Timer , Prescale = 256 , Capture Edge = Falling , Noise Cancel = 1       'empfänger&lt;br /&gt;
Config Timer1 = Timer , Prescale = 8              'servo&lt;br /&gt;
Enable Timer0&lt;br /&gt;
Enable Timer1&lt;br /&gt;
Timer1 = 62535&lt;br /&gt;
Config Portb = Output&lt;br /&gt;
Portb.0 = 0                                       'hier hängt motor1&lt;br /&gt;
Portb.1 = 0                                       'hier hängt motor2&lt;br /&gt;
Portb.2 = 0                                       'hier hängt motor3&lt;br /&gt;
Portb.3 = 0                                       'hier hängt gierservo4&lt;br /&gt;
&lt;br /&gt;
On Timer0 Pausenerkennung                         'empfänger&lt;br /&gt;
On Timer1 Servoirq                                'servo&lt;br /&gt;
&lt;br /&gt;
Config Int1 = Falling                             'empfängersignal angeschlossen an INT1&lt;br /&gt;
Enable Int1                                       'empfänger&lt;br /&gt;
On Int1 Summensignalmessung                       'empfänger&lt;br /&gt;
Enable Interrupts&lt;br /&gt;
&lt;br /&gt;
Dim Empf(5) As Word                               'original daten ausm empfänger gehen von min = 63, mitte = 100, max = 137&lt;br /&gt;
Dim Sempf(5) As Integer                           '&amp;quot;nachbearbeitete&amp;quot; empfängerdaten gehen von -999 bis +999 (mit 0 als mitte)&lt;br /&gt;
Dim Channel As Byte&lt;br /&gt;
Dim Kanal As Byte&lt;br /&gt;
Dim Servo(4) As Word                              'min: 61535, mitte 62535, max 63535 = 2000 schritte&lt;br /&gt;
Dim I As Byte&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
For I = 1 To 5&lt;br /&gt;
  Sempf(i) = Empf(i)&lt;br /&gt;
  Sempf(i) = Sempf(i) - 100                       'empfängerwerte mitte auf null verschieben&lt;br /&gt;
  Sempf(i) = Sempf(i) * 27                        'und hochskalieren&lt;br /&gt;
Next&lt;br /&gt;
Servo(1) = 62535 + Sempf(1)&lt;br /&gt;
Servo(2) = 62535 + Sempf(2)&lt;br /&gt;
Servo(3) = 62535 + Sempf(3)&lt;br /&gt;
Servo(4) = 62535 + Sempf(4)&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
Summensignalmessung:                              'bei fallender flanke&lt;br /&gt;
Select Case Channel&lt;br /&gt;
    Case 1 :&lt;br /&gt;
    Empf(1) = Timer0&lt;br /&gt;
    Case 2 :&lt;br /&gt;
    Empf(2) = Timer0&lt;br /&gt;
    Case 3 :&lt;br /&gt;
    Empf(3) = Timer0&lt;br /&gt;
    Case 4:&lt;br /&gt;
    Empf(4) = Timer0&lt;br /&gt;
    Case 5:&lt;br /&gt;
    Empf(5) = Timer0&lt;br /&gt;
End Select&lt;br /&gt;
Timer0 = 6                                        'preload für 4ms&lt;br /&gt;
Incr Channel&lt;br /&gt;
Return&lt;br /&gt;
&lt;br /&gt;
Pausenerkennung:&lt;br /&gt;
Channel = 0&lt;br /&gt;
Return&lt;br /&gt;
&lt;br /&gt;
Servoirq:&lt;br /&gt;
If Kanal = 0 Then&lt;br /&gt;
   If Portb.0 = 0 Then                            'wenn port low&lt;br /&gt;
      Timer1 = Servo(1)                           'dann timer auf entsprechende verzögerung&lt;br /&gt;
      Portb.0 = 1                                 'und port anschalten&lt;br /&gt;
   Else                                           'das hier passiert erst bei dem darauf folgenden interrupt&lt;br /&gt;
      Portb.0 = 0                                 'dann port wieder ausschalten&lt;br /&gt;
      Incr Kanal                                  'und den nächsten kanal bearbeiten&lt;br /&gt;
   End If&lt;br /&gt;
End If&lt;br /&gt;
If Kanal = 1 Then&lt;br /&gt;
   If Portb.1 = 0 Then&lt;br /&gt;
      Timer1 = Servo(2)&lt;br /&gt;
      Portb.1 = 1&lt;br /&gt;
   Else&lt;br /&gt;
      Portb.1 = 0&lt;br /&gt;
      Incr Kanal&lt;br /&gt;
   End If&lt;br /&gt;
End If&lt;br /&gt;
If Kanal = 2 Then&lt;br /&gt;
   If Portb.2 = 0 Then&lt;br /&gt;
      Timer1 = Servo(3)&lt;br /&gt;
      Portb.2 = 1&lt;br /&gt;
   Else&lt;br /&gt;
      Portb.2 = 0&lt;br /&gt;
      Incr Kanal&lt;br /&gt;
   End If&lt;br /&gt;
End If&lt;br /&gt;
If Kanal = 3 Then&lt;br /&gt;
   If Portb.3 = 0 Then&lt;br /&gt;
      Timer1 = Servo(4)&lt;br /&gt;
      Portb.3 = 1&lt;br /&gt;
   Else&lt;br /&gt;
      Portb.3 = 0&lt;br /&gt;
      Incr Kanal&lt;br /&gt;
   End If&lt;br /&gt;
End If&lt;br /&gt;
&lt;br /&gt;
If Kanal = 4 Then&lt;br /&gt;
  Timer1 = 40000                                  'eine pause von ca. 12ms bis zum nächsten interrupt. Bei guten Servos oder Brushlessreglern kann man hier bis auf 65530 gehen ==&amp;gt; ansteuerfrequenz von ~ 200Hz&lt;br /&gt;
  Kanal = 0&lt;br /&gt;
End If&lt;br /&gt;
Return&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Autoren ==&lt;br /&gt;
* [[Benutzer:Willa|Willa]]&lt;br /&gt;
&lt;br /&gt;
 [[Kategorie:Microcontroller]]&lt;br /&gt;
 [[Kategorie:Software]]&lt;br /&gt;
 [[Kategorie:Grundlagen]]&lt;br /&gt;
 [[Kategorie:Robotikeinstieg]] &lt;br /&gt;
 [[Kategorie:Praxis]] &lt;br /&gt;
 [[Kategorie:Quellcode Bascom]]&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
*[[RC-Empfänger_auswerten]]&lt;/div&gt;</summary>
		<author><name>Phyro</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=Servoansteuerung&amp;diff=15265</id>
		<title>Servoansteuerung</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Servoansteuerung&amp;diff=15265"/>
				<updated>2009-08-20T08:59:10Z</updated>
		
		<summary type="html">&lt;p&gt;Phyro: /* Einleitung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Einleitung==&lt;br /&gt;
Die Ansteuerung von Servos mit z.B. mit einem Atmel Mega32 kann auf viele verschiedene Weisen erfolgen. Im folgenden findet ihr eine gut funktionierende Variante. Der Quellcode bezieht sich zwar auf einen Mega32 und BASCOM, aber gerade BASCOM-Code ist leicht verständlich und für andere Programmiersprachen übersetzbar. Es wird absichtlich nicht der BASCOM interne &amp;quot;SERVO&amp;quot; Befehl genutzt, da dieser nur sehr eingeschränkt und unbefriedigend (z.B. für fliegende Anwendungen) funktioniert.&lt;br /&gt;
Hier eine kurze Zusammenfassung der vorgeschlagenen Servoansteuerung:&lt;br /&gt;
# Der 16bit Timer wird mit einem Prescale von 8 genutzt (==&amp;gt; Interruptfrequenz ohne Preload von ~ 30Hz)&lt;br /&gt;
# Interrupt-Aktionen: Nacheinander werden die Servos mit ihrem PWM Signal versorgt:&lt;br /&gt;
# Port für das erste Servo auf High schalten&lt;br /&gt;
# 1 - 2 ms warten&lt;br /&gt;
# Port wieder auf Low schalten&lt;br /&gt;
# Nächstes Servo bearbeiten.&lt;br /&gt;
# Da viele billige Servos am besten funktionieren wenn die Zeit zwischen ihren Signalen ~ 20 ms (= 50Hz) beträgt, sollte nach dem Stellen des letzten Servos noch eine Pause eingelegt werden (ca. 12ms Pause). In einigen Anwendungen kann es aber erforderlich sein auf diese Pause zu verzichten (z.B. bei der Regelung von Brushless Motoren. Hier ist eine besonders hohe Stellfrequenz oftmals wünschenswert). Bei Verzicht auf diese Pause kann eine Refreshrate von 333Hz bis 166 Hz (bei 3 Brushlessreglern) erreicht werden.&lt;br /&gt;
&lt;br /&gt;
''Werden andere Quarzfrequenzen benutzt, kann man mit dem Tool rnAVR komfortabel die richtigen Preload und Prescale Werte errechnen:''&lt;br /&gt;
[http://www.roboternetz.de/phpBB2/dload.php?action=file&amp;amp;file_id=169 rnAVR im Roboternetz]&lt;br /&gt;
&lt;br /&gt;
==Quellcode==&lt;br /&gt;
Der Quellcode für eine Auflösung von 2000 Schritten:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$regfile &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$baud = 19200&lt;br /&gt;
$crystal = 16000000&lt;br /&gt;
$framesize = 64&lt;br /&gt;
$swstack = 64&lt;br /&gt;
$hwstack = 64&lt;br /&gt;
Config Timer1 = Timer , Prescale = 8              'timer für servos&lt;br /&gt;
Enable Timer1&lt;br /&gt;
Timer1 = 62535&lt;br /&gt;
Config Portb = Output&lt;br /&gt;
Portb.0 = 0                                       'hier hängt servo1&lt;br /&gt;
Portb.1 = 0                                       'hier hängt servo2&lt;br /&gt;
Portb.2 = 0                                       'hier hängt servo3&lt;br /&gt;
Portb.3 = 0                                       'hier hängt servo4&lt;br /&gt;
&lt;br /&gt;
On Timer1 Servoirq                                'servo&lt;br /&gt;
&lt;br /&gt;
Enable Interrupts&lt;br /&gt;
&lt;br /&gt;
Dim Kanal As Byte&lt;br /&gt;
Dim Servo(4) As Word                              'min: 61535, mitte 62535, max 63535 = 2000 schritte&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
Servo(1) = 62535 'Mitte&lt;br /&gt;
Servo(2) = 62535 'Mitte&lt;br /&gt;
Servo(3) = 62535 'Mitte&lt;br /&gt;
Servo(4) = 62535 'Mitte&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
Servoirq:&lt;br /&gt;
If Kanal = 0 Then&lt;br /&gt;
   If Portb.0 = 0 Then                            'wenn port low&lt;br /&gt;
      Timer1 = Servo(1)                           'dann timer auf entsprechende verzögerung&lt;br /&gt;
      Portb.0 = 1                                 'und port anschalten&lt;br /&gt;
   Else                                           'das hier passiert erst bei dem darauf folgenden interrupt&lt;br /&gt;
      Portb.0 = 0                                 'dann port wieder ausschalten&lt;br /&gt;
      Incr Kanal                                  'und den nächsten kanal bearbeiten&lt;br /&gt;
   End If&lt;br /&gt;
End If&lt;br /&gt;
If Kanal = 1 Then&lt;br /&gt;
   If Portb.1 = 0 Then&lt;br /&gt;
      Timer1 = Servo(2)&lt;br /&gt;
      Portb.1 = 1&lt;br /&gt;
   Else&lt;br /&gt;
      Portb.1 = 0&lt;br /&gt;
      Incr Kanal&lt;br /&gt;
   End If&lt;br /&gt;
End If&lt;br /&gt;
If Kanal = 2 Then&lt;br /&gt;
   If Portb.2 = 0 Then&lt;br /&gt;
      Timer1 = Servo(3)&lt;br /&gt;
      Portb.2 = 1&lt;br /&gt;
   Else&lt;br /&gt;
      Portb.2 = 0&lt;br /&gt;
      Incr Kanal&lt;br /&gt;
   End If&lt;br /&gt;
End If&lt;br /&gt;
If Kanal = 3 Then&lt;br /&gt;
   If Portb.3 = 0 Then&lt;br /&gt;
      Timer1 = Servo(4)&lt;br /&gt;
      Portb.3 = 1&lt;br /&gt;
   Else&lt;br /&gt;
      Portb.3 = 0&lt;br /&gt;
      Incr Kanal&lt;br /&gt;
   End If&lt;br /&gt;
End If&lt;br /&gt;
&lt;br /&gt;
If Kanal = 4 Then&lt;br /&gt;
  Timer1 = 40000                                  'eine pause von ca. 12ms bis zum nächsten interrupt. Bei guten Servos oder Brushlessreglern kann man hier bis auf 65530 gehen ==&amp;gt; ansteuerfrequenz von ~ 200Hz&lt;br /&gt;
  Kanal = 0&lt;br /&gt;
End If&lt;br /&gt;
Return&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Empfängersignal durch µC durchschleifen==&lt;br /&gt;
Oftmals ist auch gewünscht das Signal eines RC-Empfängers einzulesen, die Daten zu bearbeiten/ mischen und dann wieder an Servos auszugeben. Den Code dafür findet ihr im folgenden (das gleiche wie oben aber erweitert mit der Empfängerauswertung). Hier werden die Servos weiterhin mit einer Auflösung von 2000 Schritten angesteuert, die Auflösung der Empfängerauswertung beträgt aber &amp;quot;nur&amp;quot; 72 Schritte. Meiner bescheidenen Meinung nach ist das für eine präzise Steuerung ausreichend. Oftmals werden die Empfängersignale nicht einfach durchgeschleift sondern untereinander bzw. mit Gyrosignalen gemischt. In diesen Fällen fällt die geringere Auflösung der Empfängerauswertung nicht mehr ins Gewicht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'RC-Signal durch Empfänger durchschleifen:&lt;br /&gt;
'Der Empfänger wird mit einer Auflösung von 74 Schritten abgefragt,&lt;br /&gt;
'die Servos werden mit einer Auflösung von 2000 Schritten angesteuert.&lt;br /&gt;
'Dabei ist die Wiederholfrequenz des Servosignals frei wählbar (35 bis zu 200 Hz).&lt;br /&gt;
$regfile &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$baud = 19200&lt;br /&gt;
$crystal = 16000000&lt;br /&gt;
$framesize = 64&lt;br /&gt;
$swstack = 64&lt;br /&gt;
$hwstack = 64&lt;br /&gt;
&lt;br /&gt;
Config Timer0 = Timer , Prescale = 256 , Capture Edge = Falling , Noise Cancel = 1       'empfänger&lt;br /&gt;
Config Timer1 = Timer , Prescale = 8              'servo&lt;br /&gt;
Enable Timer0&lt;br /&gt;
Enable Timer1&lt;br /&gt;
Timer1 = 62535&lt;br /&gt;
Config Portb = Output&lt;br /&gt;
Portb.0 = 0                                       'hier hängt motor1&lt;br /&gt;
Portb.1 = 0                                       'hier hängt motor2&lt;br /&gt;
Portb.2 = 0                                       'hier hängt motor3&lt;br /&gt;
Portb.3 = 0                                       'hier hängt gierservo4&lt;br /&gt;
&lt;br /&gt;
On Timer0 Pausenerkennung                         'empfänger&lt;br /&gt;
On Timer1 Servoirq                                'servo&lt;br /&gt;
&lt;br /&gt;
Config Int1 = Falling                             'empfängersignal angeschlossen an INT1&lt;br /&gt;
Enable Int1                                       'empfänger&lt;br /&gt;
On Int1 Summensignalmessung                       'empfänger&lt;br /&gt;
Enable Interrupts&lt;br /&gt;
&lt;br /&gt;
Dim Empf(5) As Word                               'original daten ausm empfänger gehen von min = 63, mitte = 100, max = 137&lt;br /&gt;
Dim Sempf(5) As Integer                           '&amp;quot;nachbearbeitete&amp;quot; empfängerdaten gehen von -999 bis +999 (mit 0 als mitte)&lt;br /&gt;
Dim Channel As Byte&lt;br /&gt;
Dim Kanal As Byte&lt;br /&gt;
Dim Servo(4) As Word                              'min: 61535, mitte 62535, max 63535 = 2000 schritte&lt;br /&gt;
Dim I As Byte&lt;br /&gt;
&lt;br /&gt;
Do&lt;br /&gt;
For I = 1 To 5&lt;br /&gt;
  Sempf(i) = Empf(i)&lt;br /&gt;
  Sempf(i) = Sempf(i) - 100                       'empfängerwerte mitte auf null verschieben&lt;br /&gt;
  Sempf(i) = Sempf(i) * 27                        'und hochskalieren&lt;br /&gt;
Next&lt;br /&gt;
Servo(1) = 62535 + Sempf(1)&lt;br /&gt;
Servo(2) = 62535 + Sempf(2)&lt;br /&gt;
Servo(3) = 62535 + Sempf(3)&lt;br /&gt;
Servo(4) = 62535 + Sempf(4)&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
Summensignalmessung:                              'bei fallender flanke&lt;br /&gt;
Select Case Channel&lt;br /&gt;
    Case 1 :&lt;br /&gt;
    Empf(1) = Timer0&lt;br /&gt;
    Case 2 :&lt;br /&gt;
    Empf(2) = Timer0&lt;br /&gt;
    Case 3 :&lt;br /&gt;
    Empf(3) = Timer0&lt;br /&gt;
    Case 4:&lt;br /&gt;
    Empf(4) = Timer0&lt;br /&gt;
    Case 5:&lt;br /&gt;
    Empf(5) = Timer0&lt;br /&gt;
End Select&lt;br /&gt;
Timer0 = 6                                        'preload für 4ms&lt;br /&gt;
Incr Channel&lt;br /&gt;
Return&lt;br /&gt;
&lt;br /&gt;
Pausenerkennung:&lt;br /&gt;
Channel = 0&lt;br /&gt;
Return&lt;br /&gt;
&lt;br /&gt;
Servoirq:&lt;br /&gt;
If Kanal = 0 Then&lt;br /&gt;
   If Portb.0 = 0 Then                            'wenn port low&lt;br /&gt;
      Timer1 = Servo(1)                           'dann timer auf entsprechende verzögerung&lt;br /&gt;
      Portb.0 = 1                                 'und port anschalten&lt;br /&gt;
   Else                                           'das hier passiert erst bei dem darauf folgenden interrupt&lt;br /&gt;
      Portb.0 = 0                                 'dann port wieder ausschalten&lt;br /&gt;
      Incr Kanal                                  'und den nächsten kanal bearbeiten&lt;br /&gt;
   End If&lt;br /&gt;
End If&lt;br /&gt;
If Kanal = 1 Then&lt;br /&gt;
   If Portb.1 = 0 Then&lt;br /&gt;
      Timer1 = Servo(2)&lt;br /&gt;
      Portb.1 = 1&lt;br /&gt;
   Else&lt;br /&gt;
      Portb.1 = 0&lt;br /&gt;
      Incr Kanal&lt;br /&gt;
   End If&lt;br /&gt;
End If&lt;br /&gt;
If Kanal = 2 Then&lt;br /&gt;
   If Portb.2 = 0 Then&lt;br /&gt;
      Timer1 = Servo(3)&lt;br /&gt;
      Portb.2 = 1&lt;br /&gt;
   Else&lt;br /&gt;
      Portb.2 = 0&lt;br /&gt;
      Incr Kanal&lt;br /&gt;
   End If&lt;br /&gt;
End If&lt;br /&gt;
If Kanal = 3 Then&lt;br /&gt;
   If Portb.3 = 0 Then&lt;br /&gt;
      Timer1 = Servo(4)&lt;br /&gt;
      Portb.3 = 1&lt;br /&gt;
   Else&lt;br /&gt;
      Portb.3 = 0&lt;br /&gt;
      Incr Kanal&lt;br /&gt;
   End If&lt;br /&gt;
End If&lt;br /&gt;
&lt;br /&gt;
If Kanal = 4 Then&lt;br /&gt;
  Timer1 = 40000                                  'eine pause von ca. 12ms bis zum nächsten interrupt. Bei guten Servos oder Brushlessreglern kann man hier bis auf 65530 gehen ==&amp;gt; ansteuerfrequenz von ~ 200Hz&lt;br /&gt;
  Kanal = 0&lt;br /&gt;
End If&lt;br /&gt;
Return&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Autoren ==&lt;br /&gt;
* [[Benutzer:Willa|Willa]]&lt;br /&gt;
&lt;br /&gt;
 [[Kategorie:Microcontroller]]&lt;br /&gt;
 [[Kategorie:Software]]&lt;br /&gt;
 [[Kategorie:Grundlagen]]&lt;br /&gt;
 [[Kategorie:Robotikeinstieg]] &lt;br /&gt;
 [[Kategorie:Praxis]] &lt;br /&gt;
 [[Kategorie:Quellcode Bascom]]&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
*[[RC-Empfänger_auswerten]]&lt;/div&gt;</summary>
		<author><name>Phyro</name></author>	</entry>

	</feed>