Hi,

ich wollte meinen RP6 etwas erweitern und in das Beispielpogramm Move_05 meine funktionen implementieren.

Er soll eigentlich nur während er "cruised" mit dem SRF02 Messungen durchführen und dann auf den LEDs SL1 bis 6 darstellen. Das funktioniert auch genau so wie ich mir das gewünscht habe. Allerdings ragiert dann das ACS nicht mehr auf Gegenstände.

Ich habe auch schon versucht nur Teilfunktionen auszuführen. Also ohne zu messen eine Zahl auf den LEDs ausgeben, aber dennoch funzt das ACS nicht. Und auch wenn ich nur messe ohne es darzustellen geht es nicht. GRGR ich habe keine Ahnung woran es liegt.

hier der Code, allerdings nur mein modifizierten Teil, den Rest hat wohl jeder.

Code:
#define	SRF02				0xE0		
#define attachdistance  	8

		/***************************************************************************************\ 	
		|	Diese FUnktion stellt einen Messwert der Distanz vor dem Roboter bereit.			|
		|	Bitter nicht vergessen vorher die I2C Master Library einzufügen.					|
		|	Und außerdem noch die Definitionen.														|
		|																						|
		|	#include "RP6I2CmasterTWI.h"														|
		|	#define	SRF02	0xE0		// dies ist die Standardadresse des SRF02				|
		|	#define attachdistance  8	// hiermit lässt sich die Montagedistanz korregieren	|
		\***************************************************************************************/
		
uint16_t distanceSRF02(void)
	{

		static uint8_t measureactive = false;		//Messungsstatus
		uint8_t srfbuffer[2];						//Speicher für die übertragenen Bytes
		uint16_t distance = 0;						//Gemessene Strecke

		if (measureactive == false)
		{
			I2CTWI_transmit2Bytes(SRF02, 0, 81); 	// SRF02 bekommt im Register 0 den Befehl in cm zu messen
			measureactive = true;
			startStopwatch6();
		}
	
		if (getStopwatch6() >= 65 && measureactive == true)
		{
			I2CTWI_transmitByte(SRF02, 2); 			// Ab dem zweiten Reigster Daten anfordern
			I2CTWI_readBytes(SRF02, srfbuffer, 2); 	// und in dem Array speichern
			distance = (srfbuffer[0] * 256) + srfbuffer[1]-attachdistance; 
			stopStopwatch6();
			measureactive = false;
		}
		// hiermit werden Messfehler korregiert, da negative Werte sonst bei anderen funktionen zu Problemen führen
		if (distance == -attachdistance)			
			distance = 0;
			
		return distance;
	}

	/* stellt die gemessene Strecke auf den Status LEDs dar*/
	
 void LEDmeter(uint16_t distance)
	{
	
	statusLEDs.LED1=0;
	statusLEDs.LED2=0;
	statusLEDs.LED3=0;
	statusLEDs.LED4=0;
	statusLEDs.LED5=0;
	statusLEDs.LED6=0;	
	
	if ((distance % 100)/25 >= 1)			// cm werden auf der einen Seite dargestellt. Jede LED=25cm
	statusLEDs.LED1=1;
	if ((distance % 100)/25 >= 2)
	statusLEDs.LED2=1;
	if ((distance % 100)/25 >= 3)
	statusLEDs.LED3=1;						// m auf der anderen. Jede LED=1m
	if (distance / 100 >= 1)
	statusLEDs.LED4=1;
	if (distance / 100 >= 2)
	statusLEDs.LED5=1;
	if (distance / 100 >= 3)
	statusLEDs.LED6=1;
	
	updateStatusLEDs();
	}



/**
 * We don't have anything to do here - this behaviour has only
 * a constant value for moving forwards - s. above!
 * Of course you can change this and add some random or timed movements 
 * in here...
 */

void behaviour_cruise(void)
	{
	uint16_t distance = distanceSRF02();

	if (distance != 0)
		{
		LEDmeter(distance);						// Anzeige der Distanz auf SL1  bis SL6
		
		writeString_P("\n Dist.= ");
		writeInteger(distance,DEC);
		writeString_P("cm");
		writeString_P("\t");
		writeInteger(distance / 100,DEC);
		writeString_P("\t");
		writeInteger((distance % 100)/25,DEC);
		}
	}
mfg WarChild