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