Hallo SlyD
Ich verwende die orginale Version 1.3 vom 25.9.07 Die Variable delay_timer habe so eingebunden:
extern uint8_t delay_timer;
Eine Fehlermeldung erhalte ich nicht beim Compilieren, ich lese die Variable auch nur aus.
Ich verwende delay_timer mit Absicht, weil weiterhin timer für eigene Anwendungen frei bleiben sollte. Weil meine Funktion blockierend ist, kann delay_timer von sleep() in dieser Zeit nicht verwendet/verändert werden. Ein weiterer Vorteil ist, dass ich mit sleep(0) (war noch ein Bug in der ersten Version) bequem schreibend auf delay_timer zugreifen kann, auch wenn der Aufruf theoretisch einen kleinen Messfehler verursacht.
Der Tipp mit dem SDA-Reset funktioniert wunderbar, ich habe nun den zweiten Kanal auf E-INT1 gelegt und kann das Programm deshalb auch wieder stoppen.
Das aktuelle Programm sieht nun so aus:
Code:
// Auswerten eines 2-Kanal RC-Empfängers an PortC0 und PortA4 31.12.2007 mic
// Mit der RP6-Library, blockierend wie sleep(), ohne timeout!!!
// 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(0); // 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 (E_INT1 xBus Pin8)
{
while (!(PINA & E_INT1)); // Warten auf aufsteigende Flanke
sleep(0); // setzt den delay_timer auf 0
while (PINA & E_INT1); // Warten auf absteigende Flanke
return (delay_timer); // Fertig, Rückgabewert in 0.1ms
}
return(0); // ungültiger Parameter übergeben
}
int main(void)
{
initRobotBase();
DDRC &= ~1; // Ports auf Eingang (SCL)
PORTC &= ~1; // und PullUps aus
extIntOFF(); // E_INT1 auf Eingang
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;
}
Leider sind meine ADC0/1-Anschlüsse vorerst dauerhaft belegt, weil ich sie zur Servoansteuerung verwende um meinen RP6 mit einem 4-Radantrieb zu betreiben. Ich habe immer noch keine Alternative zu den orginalen Antriebseinheiten gefunden, deshalb muss ich wohl abwarten, bis mir die passenden Teile eines Schrott-RP6 in die Hände fallen oder arexx ein Getriebekit zum Nachrüsten anbietet.
Gruß
mic
Lesezeichen