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*
Lesezeichen