<?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=Grubana</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=Grubana"/>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=Spezial:Beitr%C3%A4ge/Grubana"/>
		<updated>2026-04-11T14:58:44Z</updated>
		<subtitle>Benutzerbeiträge</subtitle>
		<generator>MediaWiki 1.25.1</generator>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RC-Empf%C3%A4nger_auswerten&amp;diff=21502</id>
		<title>RC-Empfänger auswerten</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RC-Empf%C3%A4nger_auswerten&amp;diff=21502"/>
				<updated>2012-12-29T01:49:00Z</updated>
		
		<summary type="html">&lt;p&gt;Grubana: /* Auslesen mit Timer1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ausbauwunsch|Mehr Grundlagen/ Erklärungen, und Code Beispiele in C}}&lt;br /&gt;
&lt;br /&gt;
==Vorwort==&lt;br /&gt;
Um einen RC-Empfänger mit einem ATmega auszuwerten, bedient man sich am besten des Summensignals. Im [http://www.mikrokopter.de/ucwiki/RC-Empf%C3%A4nger Wiki von Mikrokopter.de] findet sich eine Liste mit getesteten Empfängern und kurzen Anleitungen, wie man an das Signal kommt.&lt;br /&gt;
Die Quellcode Beispiele in diesem Artikel funktionieren mit einen Atmel ATmega32 der mit einem 16Mhz Quarz betrieben wird. Werden andere µC's oder andere Quarze verwendet ändern sich natürlich einige Zeilen. Besonders bei Verwendung eines anderen Quarzes müssen die Zeilen &amp;quot;preload für 4ms&amp;quot; auf den entsprechend richtigen Preload geändert werden! Evtl. muss auch der Prescaler angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Für BASCOM kann man mit folgendem Code die Kanäle 1-6 auslesen (atmega32, 16Mhz Quarz - bei Bedarf anpassen):&lt;br /&gt;
==Auslesen mit Timer0==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$baud = 9600&lt;br /&gt;
$crystal = 16000000&lt;br /&gt;
$regfile &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 64&lt;br /&gt;
Config Timer0 = Timer , Prescale = 256&lt;br /&gt;
Enable Timer0&lt;br /&gt;
On Timer0 Pausedetected&lt;br /&gt;
Config Int1 = Falling                             'Summensignal an int1 (am Mega32: Port D3), Reaktion auf fallende Flanke&lt;br /&gt;
Enable Interrupts&lt;br /&gt;
Enable Int1                                       'einschalten Int1&lt;br /&gt;
On Int1 Measure                                   'springe zum Interrupt von Timer0&lt;br /&gt;
Dim Empf(6) As Word&lt;br /&gt;
Dim Channel As Byte&lt;br /&gt;
&lt;br /&gt;
Do                                'Main Loop gibt Signale per UART aus&lt;br /&gt;
    Print Empf(1) ; &amp;quot; CH1&amp;quot;&lt;br /&gt;
    Print Empf(2) ; &amp;quot; CH2&amp;quot;&lt;br /&gt;
    Print Empf(3) ; &amp;quot; CH3&amp;quot;&lt;br /&gt;
    Print Empf(4) ; &amp;quot; CH4&amp;quot;&lt;br /&gt;
    Print Empf(5) ; &amp;quot; CH5&amp;quot;&lt;br /&gt;
    Print Empf(6) ; &amp;quot; CH6&amp;quot;&lt;br /&gt;
    Print &amp;quot; &amp;quot;&lt;br /&gt;
    Waitms 500&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
Measure:                               'Reaktion auf fallende Flanke&lt;br /&gt;
&lt;br /&gt;
If Channel &amp;gt; 0 And Channel &amp;lt; 7 Then&lt;br /&gt;
  Empf(channel) = Timer0 - 6&lt;br /&gt;
End If&lt;br /&gt;
&lt;br /&gt;
Timer0 = 6                                        'preload für 4ms&lt;br /&gt;
Incr Channel&lt;br /&gt;
Return&lt;br /&gt;
&lt;br /&gt;
Pausedetected:&lt;br /&gt;
Channel = 0&lt;br /&gt;
Return&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Auslesen mit Timer1==&lt;br /&gt;
Alternativ kann man den Empfänger natürlich auch mit Timer1 auslesen. Hier ist die Auflösung höher:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$baud = 9600&lt;br /&gt;
$crystal = 16000000&lt;br /&gt;
$regfile &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 64&lt;br /&gt;
Config Timer1 = Timer , Prescale = 8 , Capture Edge = Falling , Noise Cancel = 1&lt;br /&gt;
Enable Timer1&lt;br /&gt;
On Timer1 PauseDetect&lt;br /&gt;
Config Int1 = Falling&lt;br /&gt;
Enable Interrupts&lt;br /&gt;
Enable Int1    &lt;br /&gt;
On Int1 Measure&lt;br /&gt;
Dim Empf(6) As Word&lt;br /&gt;
Dim Channel As Byte&lt;br /&gt;
Do&lt;br /&gt;
    Print Empf(1) ; &amp;quot; CH1&amp;quot;&lt;br /&gt;
    Print Empf(2) ; &amp;quot; CH2&amp;quot;&lt;br /&gt;
    Print Empf(3) ; &amp;quot; CH3&amp;quot;&lt;br /&gt;
    Print Empf(4) ; &amp;quot; CH4&amp;quot;&lt;br /&gt;
    Print Empf(5) ; &amp;quot; CH5&amp;quot;&lt;br /&gt;
    Print Empf(6) ; &amp;quot; CH6&amp;quot;&lt;br /&gt;
    Print &amp;quot; &amp;quot;&lt;br /&gt;
    Waitms 500&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
Measure:&lt;br /&gt;
If Channel &amp;gt; 0 And Channel &amp;lt; 7 Then&lt;br /&gt;
  Empf(channel) = Timer1 - 57536 &lt;br /&gt;
End If&lt;br /&gt;
Timer1 = 57536                                    'preload für 4ms&lt;br /&gt;
Incr Channel&lt;br /&gt;
Return&lt;br /&gt;
&lt;br /&gt;
PauseDetect:&lt;br /&gt;
Channel = 0&lt;br /&gt;
Return&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== C-Programmbeispiel (Auslesen mit Timer0) ==&lt;br /&gt;
Dieses Beispiel ist für einen ATMega128 mit 14,745600MHz und funktioniert für alle 8 möglichen Kanäle.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist es den Overflow des Counters zwischen 2ms und 4ms zu setzen, damit der Controller den Anfang des Signals erkennen kann.&lt;br /&gt;
Die einzelnen Servosignale sind dann in cSumSig[] zu finden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifndef RC_SUM_H&lt;br /&gt;
#define RC_SUM_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;inttypes.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
volatile unsigned char cSumSig[8];&lt;br /&gt;
volatile uint8_t iCounter=0,iValid=0;&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER0_OVF_vect) {&lt;br /&gt;
  iCounter=0;					// Bei Overflow den Channel Counter zurücksetzen&lt;br /&gt;
  iValid=0;					// Messung bis zum ersten Puls blockieren&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(INT0_vect) {&lt;br /&gt;
  if(iValid==1) {				// Nicht vor dem ersten Puls das zählen beginnen&lt;br /&gt;
    cSumSig[iCounter] = TCNT0;			// Pulslänge im Array speichern&lt;br /&gt;
	iCounter++;				// Counter für nächsten Puls erhöhen&lt;br /&gt;
  } else {&lt;br /&gt;
    iValid = 1;					// Messung bei erstem Puls freigeben&lt;br /&gt;
  }&lt;br /&gt;
  TCNT0 = 0;					// Counter zurücksetzen&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void RC_SUM_init(void) {		&lt;br /&gt;
  TIMSK |= (1&amp;lt;&amp;lt;TOIE0);				// Overflow Interrupt einschalten&lt;br /&gt;
  TCCR0 |= ((1&amp;lt;&amp;lt;CS00) | (1&amp;lt;&amp;lt;CS02));		// Prescaler 128&lt;br /&gt;
  TCNT0 = 0;					// Overflow zwischen 2,2ms &amp;amp; 3,8ms&lt;br /&gt;
  EIMSK |= (1&amp;lt;&amp;lt;INT0);				// INT0 enable&lt;br /&gt;
  EICRA |= ((1&amp;lt;&amp;lt;ISC01) | (1&amp;lt;&amp;lt;ISC00));	        // Externer Interrupt bei steigender Flanke an Pin INT0&lt;br /&gt;
  sei();					// Globale Interrupts erlauben&lt;br /&gt;
}&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Autoren ==&lt;br /&gt;
* Bascom: [[Benutzer:Willa|Willa]]&lt;br /&gt;
* C: [[Benutzer:Maddis|Maddis]]&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;
*[[Servos]]&lt;br /&gt;
*[[Servoansteuerung]]&lt;/div&gt;</summary>
		<author><name>Grubana</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RC-Empf%C3%A4nger_auswerten&amp;diff=21501</id>
		<title>RC-Empfänger auswerten</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RC-Empf%C3%A4nger_auswerten&amp;diff=21501"/>
				<updated>2012-12-29T01:48:37Z</updated>
		
		<summary type="html">&lt;p&gt;Grubana: /* Auslesen mit Timer0 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ausbauwunsch|Mehr Grundlagen/ Erklärungen, und Code Beispiele in C}}&lt;br /&gt;
&lt;br /&gt;
==Vorwort==&lt;br /&gt;
Um einen RC-Empfänger mit einem ATmega auszuwerten, bedient man sich am besten des Summensignals. Im [http://www.mikrokopter.de/ucwiki/RC-Empf%C3%A4nger Wiki von Mikrokopter.de] findet sich eine Liste mit getesteten Empfängern und kurzen Anleitungen, wie man an das Signal kommt.&lt;br /&gt;
Die Quellcode Beispiele in diesem Artikel funktionieren mit einen Atmel ATmega32 der mit einem 16Mhz Quarz betrieben wird. Werden andere µC's oder andere Quarze verwendet ändern sich natürlich einige Zeilen. Besonders bei Verwendung eines anderen Quarzes müssen die Zeilen &amp;quot;preload für 4ms&amp;quot; auf den entsprechend richtigen Preload geändert werden! Evtl. muss auch der Prescaler angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Für BASCOM kann man mit folgendem Code die Kanäle 1-6 auslesen (atmega32, 16Mhz Quarz - bei Bedarf anpassen):&lt;br /&gt;
==Auslesen mit Timer0==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$baud = 9600&lt;br /&gt;
$crystal = 16000000&lt;br /&gt;
$regfile &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 64&lt;br /&gt;
Config Timer0 = Timer , Prescale = 256&lt;br /&gt;
Enable Timer0&lt;br /&gt;
On Timer0 Pausedetected&lt;br /&gt;
Config Int1 = Falling                             'Summensignal an int1 (am Mega32: Port D3), Reaktion auf fallende Flanke&lt;br /&gt;
Enable Interrupts&lt;br /&gt;
Enable Int1                                       'einschalten Int1&lt;br /&gt;
On Int1 Measure                                   'springe zum Interrupt von Timer0&lt;br /&gt;
Dim Empf(6) As Word&lt;br /&gt;
Dim Channel As Byte&lt;br /&gt;
&lt;br /&gt;
Do                                'Main Loop gibt Signale per UART aus&lt;br /&gt;
    Print Empf(1) ; &amp;quot; CH1&amp;quot;&lt;br /&gt;
    Print Empf(2) ; &amp;quot; CH2&amp;quot;&lt;br /&gt;
    Print Empf(3) ; &amp;quot; CH3&amp;quot;&lt;br /&gt;
    Print Empf(4) ; &amp;quot; CH4&amp;quot;&lt;br /&gt;
    Print Empf(5) ; &amp;quot; CH5&amp;quot;&lt;br /&gt;
    Print Empf(6) ; &amp;quot; CH6&amp;quot;&lt;br /&gt;
    Print &amp;quot; &amp;quot;&lt;br /&gt;
    Waitms 500&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
Measure:                               'Reaktion auf fallende Flanke&lt;br /&gt;
&lt;br /&gt;
If Channel &amp;gt; 0 And Channel &amp;lt; 7 Then&lt;br /&gt;
  Empf(channel) = Timer0 - 6&lt;br /&gt;
End If&lt;br /&gt;
&lt;br /&gt;
Timer0 = 6                                        'preload für 4ms&lt;br /&gt;
Incr Channel&lt;br /&gt;
Return&lt;br /&gt;
&lt;br /&gt;
Pausedetected:&lt;br /&gt;
Channel = 0&lt;br /&gt;
Return&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Auslesen mit Timer1==&lt;br /&gt;
Alternativ kann man den Empfänger natürlich auch mit Timer1 auslesen. Hier ist die Auflösung höher:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$baud = 9600&lt;br /&gt;
$crystal = 16000000&lt;br /&gt;
$regfile &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 64&lt;br /&gt;
Config Timer1 = Timer , Prescale = 8 , Capture Edge = Falling , Noise Cancel = 1&lt;br /&gt;
Enable Timer1&lt;br /&gt;
On Timer1 PauseDetect&lt;br /&gt;
Config Int1 = Falling&lt;br /&gt;
Enable Interrupts&lt;br /&gt;
Enable Int1    &lt;br /&gt;
On Int1 Measure&lt;br /&gt;
Dim Empf(6) As Word&lt;br /&gt;
Dim Channel As Byte&lt;br /&gt;
Do&lt;br /&gt;
    Print Empf(1) ; &amp;quot; CH1&amp;quot;&lt;br /&gt;
    Print Empf(2) ; &amp;quot; CH2&amp;quot;&lt;br /&gt;
    Print Empf(3) ; &amp;quot; CH3&amp;quot;&lt;br /&gt;
    Print Empf(4) ; &amp;quot; CH4&amp;quot;&lt;br /&gt;
    Print Empf(5) ; &amp;quot; CH5&amp;quot;&lt;br /&gt;
    Print Empf(6) ; &amp;quot; CH6&amp;quot;&lt;br /&gt;
    Print &amp;quot; &amp;quot;&lt;br /&gt;
    Waitms 500&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
Measure:&lt;br /&gt;
If Channel &amp;gt; 0 And Channel &amp;lt; 6 Then&lt;br /&gt;
  Empf(channel) = Timer1&lt;br /&gt;
End If&lt;br /&gt;
Timer1 = 57536                                    'preload für 4ms&lt;br /&gt;
Incr Channel&lt;br /&gt;
Return&lt;br /&gt;
&lt;br /&gt;
PauseDetect:&lt;br /&gt;
Channel = 0&lt;br /&gt;
Return&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== C-Programmbeispiel (Auslesen mit Timer0) ==&lt;br /&gt;
Dieses Beispiel ist für einen ATMega128 mit 14,745600MHz und funktioniert für alle 8 möglichen Kanäle.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist es den Overflow des Counters zwischen 2ms und 4ms zu setzen, damit der Controller den Anfang des Signals erkennen kann.&lt;br /&gt;
Die einzelnen Servosignale sind dann in cSumSig[] zu finden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifndef RC_SUM_H&lt;br /&gt;
#define RC_SUM_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;inttypes.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
volatile unsigned char cSumSig[8];&lt;br /&gt;
volatile uint8_t iCounter=0,iValid=0;&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER0_OVF_vect) {&lt;br /&gt;
  iCounter=0;					// Bei Overflow den Channel Counter zurücksetzen&lt;br /&gt;
  iValid=0;					// Messung bis zum ersten Puls blockieren&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(INT0_vect) {&lt;br /&gt;
  if(iValid==1) {				// Nicht vor dem ersten Puls das zählen beginnen&lt;br /&gt;
    cSumSig[iCounter] = TCNT0;			// Pulslänge im Array speichern&lt;br /&gt;
	iCounter++;				// Counter für nächsten Puls erhöhen&lt;br /&gt;
  } else {&lt;br /&gt;
    iValid = 1;					// Messung bei erstem Puls freigeben&lt;br /&gt;
  }&lt;br /&gt;
  TCNT0 = 0;					// Counter zurücksetzen&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void RC_SUM_init(void) {		&lt;br /&gt;
  TIMSK |= (1&amp;lt;&amp;lt;TOIE0);				// Overflow Interrupt einschalten&lt;br /&gt;
  TCCR0 |= ((1&amp;lt;&amp;lt;CS00) | (1&amp;lt;&amp;lt;CS02));		// Prescaler 128&lt;br /&gt;
  TCNT0 = 0;					// Overflow zwischen 2,2ms &amp;amp; 3,8ms&lt;br /&gt;
  EIMSK |= (1&amp;lt;&amp;lt;INT0);				// INT0 enable&lt;br /&gt;
  EICRA |= ((1&amp;lt;&amp;lt;ISC01) | (1&amp;lt;&amp;lt;ISC00));	        // Externer Interrupt bei steigender Flanke an Pin INT0&lt;br /&gt;
  sei();					// Globale Interrupts erlauben&lt;br /&gt;
}&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Autoren ==&lt;br /&gt;
* Bascom: [[Benutzer:Willa|Willa]]&lt;br /&gt;
* C: [[Benutzer:Maddis|Maddis]]&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;
*[[Servos]]&lt;br /&gt;
*[[Servoansteuerung]]&lt;/div&gt;</summary>
		<author><name>Grubana</name></author>	</entry>

	<entry>
		<id>https://rn-wissen.de/wiki/index.php?title=RC-Empf%C3%A4nger_auswerten&amp;diff=21500</id>
		<title>RC-Empfänger auswerten</title>
		<link rel="alternate" type="text/html" href="https://rn-wissen.de/wiki/index.php?title=RC-Empf%C3%A4nger_auswerten&amp;diff=21500"/>
				<updated>2012-12-29T01:47:16Z</updated>
		
		<summary type="html">&lt;p&gt;Grubana: /* Auslesen mit Timer0 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ausbauwunsch|Mehr Grundlagen/ Erklärungen, und Code Beispiele in C}}&lt;br /&gt;
&lt;br /&gt;
==Vorwort==&lt;br /&gt;
Um einen RC-Empfänger mit einem ATmega auszuwerten, bedient man sich am besten des Summensignals. Im [http://www.mikrokopter.de/ucwiki/RC-Empf%C3%A4nger Wiki von Mikrokopter.de] findet sich eine Liste mit getesteten Empfängern und kurzen Anleitungen, wie man an das Signal kommt.&lt;br /&gt;
Die Quellcode Beispiele in diesem Artikel funktionieren mit einen Atmel ATmega32 der mit einem 16Mhz Quarz betrieben wird. Werden andere µC's oder andere Quarze verwendet ändern sich natürlich einige Zeilen. Besonders bei Verwendung eines anderen Quarzes müssen die Zeilen &amp;quot;preload für 4ms&amp;quot; auf den entsprechend richtigen Preload geändert werden! Evtl. muss auch der Prescaler angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Für BASCOM kann man mit folgendem Code die Kanäle 1-6 auslesen (atmega32, 16Mhz Quarz - bei Bedarf anpassen):&lt;br /&gt;
==Auslesen mit Timer0==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$baud = 9600&lt;br /&gt;
$crystal = 16000000&lt;br /&gt;
$regfile &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 64&lt;br /&gt;
Config Timer0 = Timer , Prescale = 256&lt;br /&gt;
Enable Timer0&lt;br /&gt;
On Timer0 Pausedetected&lt;br /&gt;
Config Int1 = Falling                             'Summensignal an int1 (am Mega32: Port D3), Reaktion auf fallende Flanke&lt;br /&gt;
Enable Interrupts&lt;br /&gt;
Enable Int1                                       'einschalten Int1&lt;br /&gt;
On Int1 Measure                                   'springe zum Interrupt von Timer0&lt;br /&gt;
Dim Empf(6) As Word&lt;br /&gt;
Dim Channel As Byte&lt;br /&gt;
&lt;br /&gt;
Do                                'Main Loop gibt Signale per UART aus&lt;br /&gt;
    Print Empf(1) ; &amp;quot; CH1&amp;quot;&lt;br /&gt;
    Print Empf(2) ; &amp;quot; CH2&amp;quot;&lt;br /&gt;
    Print Empf(3) ; &amp;quot; CH3&amp;quot;&lt;br /&gt;
    Print Empf(4) ; &amp;quot; CH4&amp;quot;&lt;br /&gt;
    Print Empf(5) ; &amp;quot; CH5&amp;quot;&lt;br /&gt;
    Print Empf(6) ; &amp;quot; CH6&amp;quot;&lt;br /&gt;
    Print &amp;quot; &amp;quot;&lt;br /&gt;
    Waitms 500&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
Measure:                               'Reaktion auf fallende Flanke&lt;br /&gt;
&lt;br /&gt;
If Channel &amp;gt; 0 And Channel &amp;lt; 6 Then&lt;br /&gt;
  Empf(channel) = Timer0&lt;br /&gt;
End If&lt;br /&gt;
&lt;br /&gt;
Timer0 = 6                                        'preload für 4ms&lt;br /&gt;
Incr Channel&lt;br /&gt;
Return&lt;br /&gt;
&lt;br /&gt;
Pausedetected:&lt;br /&gt;
Channel = 0&lt;br /&gt;
Return&lt;br /&gt;
&lt;br /&gt;
End&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Auslesen mit Timer1==&lt;br /&gt;
Alternativ kann man den Empfänger natürlich auch mit Timer1 auslesen. Hier ist die Auflösung höher:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$baud = 9600&lt;br /&gt;
$crystal = 16000000&lt;br /&gt;
$regfile &amp;quot;m32def.dat&amp;quot;&lt;br /&gt;
$framesize = 32&lt;br /&gt;
$swstack = 32&lt;br /&gt;
$hwstack = 64&lt;br /&gt;
Config Timer1 = Timer , Prescale = 8 , Capture Edge = Falling , Noise Cancel = 1&lt;br /&gt;
Enable Timer1&lt;br /&gt;
On Timer1 PauseDetect&lt;br /&gt;
Config Int1 = Falling&lt;br /&gt;
Enable Interrupts&lt;br /&gt;
Enable Int1    &lt;br /&gt;
On Int1 Measure&lt;br /&gt;
Dim Empf(6) As Word&lt;br /&gt;
Dim Channel As Byte&lt;br /&gt;
Do&lt;br /&gt;
    Print Empf(1) ; &amp;quot; CH1&amp;quot;&lt;br /&gt;
    Print Empf(2) ; &amp;quot; CH2&amp;quot;&lt;br /&gt;
    Print Empf(3) ; &amp;quot; CH3&amp;quot;&lt;br /&gt;
    Print Empf(4) ; &amp;quot; CH4&amp;quot;&lt;br /&gt;
    Print Empf(5) ; &amp;quot; CH5&amp;quot;&lt;br /&gt;
    Print Empf(6) ; &amp;quot; CH6&amp;quot;&lt;br /&gt;
    Print &amp;quot; &amp;quot;&lt;br /&gt;
    Waitms 500&lt;br /&gt;
Loop&lt;br /&gt;
&lt;br /&gt;
Measure:&lt;br /&gt;
If Channel &amp;gt; 0 And Channel &amp;lt; 6 Then&lt;br /&gt;
  Empf(channel) = Timer1&lt;br /&gt;
End If&lt;br /&gt;
Timer1 = 57536                                    'preload für 4ms&lt;br /&gt;
Incr Channel&lt;br /&gt;
Return&lt;br /&gt;
&lt;br /&gt;
PauseDetect:&lt;br /&gt;
Channel = 0&lt;br /&gt;
Return&lt;br /&gt;
End&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== C-Programmbeispiel (Auslesen mit Timer0) ==&lt;br /&gt;
Dieses Beispiel ist für einen ATMega128 mit 14,745600MHz und funktioniert für alle 8 möglichen Kanäle.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist es den Overflow des Counters zwischen 2ms und 4ms zu setzen, damit der Controller den Anfang des Signals erkennen kann.&lt;br /&gt;
Die einzelnen Servosignale sind dann in cSumSig[] zu finden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifndef RC_SUM_H&lt;br /&gt;
#define RC_SUM_H&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;inttypes.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
volatile unsigned char cSumSig[8];&lt;br /&gt;
volatile uint8_t iCounter=0,iValid=0;&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER0_OVF_vect) {&lt;br /&gt;
  iCounter=0;					// Bei Overflow den Channel Counter zurücksetzen&lt;br /&gt;
  iValid=0;					// Messung bis zum ersten Puls blockieren&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(INT0_vect) {&lt;br /&gt;
  if(iValid==1) {				// Nicht vor dem ersten Puls das zählen beginnen&lt;br /&gt;
    cSumSig[iCounter] = TCNT0;			// Pulslänge im Array speichern&lt;br /&gt;
	iCounter++;				// Counter für nächsten Puls erhöhen&lt;br /&gt;
  } else {&lt;br /&gt;
    iValid = 1;					// Messung bei erstem Puls freigeben&lt;br /&gt;
  }&lt;br /&gt;
  TCNT0 = 0;					// Counter zurücksetzen&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void RC_SUM_init(void) {		&lt;br /&gt;
  TIMSK |= (1&amp;lt;&amp;lt;TOIE0);				// Overflow Interrupt einschalten&lt;br /&gt;
  TCCR0 |= ((1&amp;lt;&amp;lt;CS00) | (1&amp;lt;&amp;lt;CS02));		// Prescaler 128&lt;br /&gt;
  TCNT0 = 0;					// Overflow zwischen 2,2ms &amp;amp; 3,8ms&lt;br /&gt;
  EIMSK |= (1&amp;lt;&amp;lt;INT0);				// INT0 enable&lt;br /&gt;
  EICRA |= ((1&amp;lt;&amp;lt;ISC01) | (1&amp;lt;&amp;lt;ISC00));	        // Externer Interrupt bei steigender Flanke an Pin INT0&lt;br /&gt;
  sei();					// Globale Interrupts erlauben&lt;br /&gt;
}&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Autoren ==&lt;br /&gt;
* Bascom: [[Benutzer:Willa|Willa]]&lt;br /&gt;
* C: [[Benutzer:Maddis|Maddis]]&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;
*[[Servos]]&lt;br /&gt;
*[[Servoansteuerung]]&lt;/div&gt;</summary>
		<author><name>Grubana</name></author>	</entry>

	</feed>