Hallo blenderkid

Mit einfachen Bordmitteln des RP6:
Code:
// Auswerten eines 2-Kanal RC-Empfängers an PortC0 und PortC1     31.12.2007 mic

// Mit der RP6-Library, blockierend ähnlich wie sleep(), noch ohne timeout!!!
// Durch die Verwendung von SCL/SDA kann das Programm nicht angehalten werden,
// Nach einem Reset startet der ATMega32 sofort erneut.
// Besser ist ein Anschluß an ADC0/ADC1 (PortA0 und PortA1)

#include "RP6RobotBaseLib.h"        // Library einbinden
#include "RP6uart.h"        			// Zum Debuggen, wir wollen ja was sehen,
#include "RP6uart.c"        			// auch wenn wir kein LCD besitzen

uint8_t read_rc(uint8_t kanal)
{
	extern uint8_t delay_timer; 		// der sleep()-Timer aus RP6RobotBaseLib.c

	if (kanal == 1)  // Eingang Kanal 1 der RC-Fernbedienung (SCL xBus Pin10)
	{
	   while (!(PINC & 1));          // Warten auf aufsteigende Flanke
	   sleep(1);                     // setzt den delay_timer auf 0
	   while (PINC & 1);          	// Warten auf absteigende Flanke
	   return (delay_timer);         // Fertig, Rückgabewert in 0.1ms
	}
	if (kanal == 2)  // Eingang Kanal 2 der RC-Fernbedienung (SDA xBus Pin12)
	{
	   while (!(PINC & 2));          // Warten auf aufsteigende Flanke
	   sleep(1);                     // setzt den delay_timer auf 0
	   while (PINC & 2);          	// Warten auf absteigende Flanke
	   return (delay_timer);         // Fertig, Rückgabewert in 0.1ms
	}
	return(0);                       // ungültiger Parameter übergeben
}


int main(void)
{
	initRobotBase();
	DDRC &= ~3;					// Ports auf Eingang
	PORTC &= ~3;            // und PullUps aus
	setLEDs(1);             // Anzeige Programm gestartet
	
	writeString_P("\n\n\r2-Kanal RC-Empfänger einlesen                   31.12.07 mic\n\r");
	
	while(1)
	{
	   writeString_P("\n\r");
	   writeString_P("Kanal 1: ");
	   writeInteger(read_rc(1), 10);
	   writeString_P("  Kanal 2: ");
	   writeInteger(read_rc(2), 10);
	   mSleep(300);
	}
	return 0;
}
Die Ausgabe dazu:
Code:
[RP6BOOT]

[READY]



2-Kanal RC-Empfãnger einlesen                   31.12.07 mic


Kanal 1: 14  Kanal 2: 14

Kanal 1: 14  Kanal 2: 14

Kanal 1: 14  Kanal 2: 14

Kanal 1: 13  Kanal 2: 14

Kanal 1: 14  Kanal 2: 14

Kanal 1: 14  Kanal 2: 14

Kanal 1: 14  Kanal 2: 14

Kanal 1: 13  Kanal 2: 14

Kanal 1: 14  Kanal 2: 14

Kanal 1: 15  Kanal 2: 13

Kanal 1: 15  Kanal 2: 13

Kanal 1: 15  Kanal 2: 13

Kanal 1: 16  Kanal 2: 13

Kanal 1: 16  Kanal 2: 14

Kanal 1: 17  Kanal 2: 14

Kanal 1: 18  Kanal 2: 14

Kanal 1: 18  Kanal 2: 14

Kanal 1: 18  Kanal 2: 14

Kanal 1: 14  Kanal 2: 14

Kanal 1: 12  Kanal 2: 14

Kanal 1: 9  Kanal 2: 14

Kanal 1: 10  Kanal 2: 14

Kanal 1: 10  Kanal 2: 14

Kanal 1: 10  Kanal 2: 13

Kanal 1: 10  Kanal 2: 13

Kanal 1: 12  Kanal 2: 13

Kanal 1: 14  Kanal 2: 14

Kanal 1: 14  Kanal 2: 11

Kanal 1: 14  Kanal 2: 10

Kanal 1: 14  Kanal 2: 10

Kanal 1: 14  Kanal 2: 10

Kanal 1: 14  Kanal 2: 10

Kanal 1: 14  Kanal 2: 14

Kanal 1: 14  Kanal 2: 14

Kanal 1: 14  Kanal 2: 15

Kanal 1: 14  Kanal 2: 18

Kanal 1: 14  Kanal 2: 18

Kanal 1: 14  Kanal 2: 18

Kanal 1: 14  Kanal 2: 18

Kanal 1: 14  Kanal 2: 14

Kanal 1: 14  Kanal 2: 14

Kanal 1: 14  Kanal 2: 14

Kanal 1: 14  Kanal 2: 14

Kanal 1: 14  Kanal 2: 14

Kanal 1: 14  Kanal 2: 14
Da das Signal nur 0 oder 1 ist, benötigt man natürlich keinen ADC. Der Empfänger wird an Vcc und GND angeschlossen. Die Kanäle in dieser Version an SDA und SCL (PortC0/PortC1). Alle Anschlüsse sind am xBUS verfügbar.

Gruß

mic

[Edit]
Ich Depp, ich weiß doch, welche Ports verwendet werden sollten. Hier die Version für ADC2/3 (ungeprüft):
Code:
// Auswerten eines 2-Kanal RC-Empfängers an PortA2 und PortA3     31.12.2007 mic

// Version für blenderkid (nicht geprüft)

#include "RP6RobotBaseLib.h"        // Library einbinden
#include "RP6uart.h"        			// Zum Debuggen, wir wollen ja was sehen,
#include "RP6uart.c"        			// auch wenn wir kein LCD besitzen

uint8_t read_rc(uint8_t kanal)
{
	extern uint8_t delay_timer; 		// der sleep()-Timer aus RP6RobotBaseLib.c

	if (kanal == 1)  // Eingang Kanal 1 der RC-Fernbedienung (ADC2 PortA2)
	{
	   while (!(PINA & 4));          // Warten auf aufsteigende Flanke
	   sleep(1);                     // setzt den delay_timer auf 0
	   while (PINA & 4);          	// Warten auf absteigende Flanke
	   return (delay_timer);         // Fertig, Rückgabewert in 0.1ms
	}
	if (kanal == 2)  // Eingang Kanal 2 der RC-Fernbedienung (ADC3 PortA3)
	{
	   while (!(PINA & 8));          // Warten auf aufsteigende Flanke
	   sleep(1);                     // setzt den delay_timer auf 0
	   while (PINA & 8);          	// Warten auf absteigende Flanke
	   return (delay_timer);         // Fertig, Rückgabewert in 0.1ms
	}
	return(0);                       // ungültiger Parameter übergeben
}


int main(void)
{
	initRobotBase();
	DDRA &= ~12;				// Ports auf Eingang   ADC2+3
	PORTA &= ~12;            // und PullUps aus
	setLEDs(1);             // Anzeige Programm gestartet
	
	writeString_P("\n\n\r2-Kanal RC-Empfänger einlesen                   31.12.07 mic\n\r");
	
	while(1)
	{
	   writeString_P("\n\r");
	   writeString_P("Kanal 1: ");
	   writeInteger(read_rc(1), 10);
	   writeString_P("  Kanal 2: ");
	   writeInteger(read_rc(2), 10);
	   mSleep(300);
	}
	return 0;
}
Noch ein [Edit]: Hab' doch glatt überlesen, dass es für ein M32 sein soll. Damit kann ich leider nicht dienen, weil mir das keiner schenken mag. *traurigkuck*