Hallo

Das wird so nichts, weil die IR-Abstandsmessung nach Waste beim asuro mit variablen Halbwellen der Trägerfrequenz arbeitet. Das ist letzlich die Meisterleistung seiner Modifikation der asuro-Lib bei der IR-Abstandsmessung.

Wir erzeugen im Moment ein symetrisches Signal bei dem die Impuls- und Pausenzeiten des IR-Signals 50:50 sind. Waste hat den Timer im PWM-Mode betrieben und die Dauer der Halbwellen mit dem OCR2-Register gesteuert. Das kann meine Ansteuerung nicht, weil der OC2-Pin bei der bee zur Motordrehrichtungsansteuerung (PD7, DIR_R) verwendet wird und deshalb nicht zur freien Verfügung steht. (Das ist meiner Meinung nach einer der wenigen Kritikpunkte bei der bee) Um das nachzubilden müßten wir in der ISR zusätzlich eine Software-PWM einbauen. (was natürlich nicht ausschliest, dass wir das noch machen werden;)

Weil ich deine Erweiterungen (noch) nicht an meiner bee angebaut habe, kann ich weiterhin nur "theoretisch" programmieren. Testen mußt du selbst. Das folgende Programm sendet jeweils auf einer Seite ein IR-Signal, prüft, ob der SFH ein IR-Echo empfängt und zeigt das Ergebniss an den roten Leds an:
Code:
// nibobee Einfache Abstandsmessung mit Pinselbee-Umbau               11.1.2010 mic

// Es werden im Wechsel die rechten und linken IR-Leds mit 36kHz angesteuert
// und jeweils das Echo ausgewertet und an den roten Leds angezeigt.
// LED3 leuchtet, wenn die ISR aktiv ist.

// https://www.roboternetz.de/phpBB2/vi...=480142#480142

// Die Anoden der rechten IR-LEDs hängen mit Vorwiderstand an PA0 (X1-AN0)
// Die Anoden der linken IR-LEDs hängen mit Vorwiderstand an PA1 (X1-AN1)
// Die Kathoden beider IR-LEDs sind mit PA3 (X3-AN3) verbunden
// Der Empfänger SFH5110 ist mit PA2 (X2-AN2) verbunden

#include <nibobee/iodefs.h>
#include <nibobee/delay.h>
#include <nibobee/led.h>
#include <stdlib.h>

#define FALSE	(1==0)
#define TRUE	(1==1)

uint8_t detect_right(void)
{
	uint8_t echo;

	DDRA |= (1<<PA3); 		// Trägerfrequenz an Kathoden einschalten
	TIMSK |= (1 << OCIE2);  // ISR aktivieren

	PORTA |= (1<<PA0); 		// rechte IR-LEDs einschalten
	delay(1);            	// 36 IR-Impulse senden (10 sollten dem SFH genügen) ???
	//delay(10);            // delay(1) ist nicht immer 1/1000 Sek!!!

   // SFH Ausgang wird low, wenn er Trägersignal erkennt => echo ist true ;)
	echo=((PINA & (1<<PA2)) == 0);   // SFH hängt an PA2

	PORTA &= ~(1<<PA0);     // IR-Leds wieder ausschalten
	TIMSK &= ~(1 << OCIE2);	// ISR ausklinken
	DDRA &= ~(1<<PA3);      // keine Trägerfrequenz an Kathoden
	PORTA &= ~(1<<PA3);     // bedeutet alle IR-LEDS aus
	led_set(LED_R_YE, 0);   // ISR-Kontroll-LED aus
	return(echo);
}

uint8_t detect_left(void)
{
	uint8_t echo;

	DDRA |= (1<<PA3);       // 36kHz-Trägersignal senden
	TIMSK |= (1 << OCIE2);

	PORTA |= (1<<PA1);
	delay(1);
	//delay(10);

	echo=((PINA & (1<<PA2)) == 0);   // Echo empfangen?

	PORTA &= ~(1<<PA1);     // Trägersignal ausschalten
	TIMSK &= ~(1 << OCIE2);
	DDRA &= ~(1<<PA3);
	PORTA &= ~(1<<PA3);
	led_set(LED_R_YE, 0);
	return(echo);
}

int main(void)
{
   led_init();
   PORTB |= 15; 	// alle LEDs an
   delay(2000); 	// wait4programmer
   PORTB &= ~15;	// alle LEDs aus

	// Timer2-Setup für 72kHz
	TCCR2 = (1 << WGM21) | (1 << CS20); // CTC-Mode, no prescaling, no OC2-PIN!
   OCR2  = 208; // 36kHz @15MHz

   DDRA |= (1<<PA1) | (1<<PA0); // Anoden der LEDs mit Vorwiderstand an PA0/1
   PORTA &= ~((1<<PA1) | (1<<PA0)); // low = LEDs aus
   DDRA &= ~(1<<PA3); // keine 72kHz-Ansteuerung
   PORTA &= ~(1<<PA3); // deshalb Kathoden-Pin auf Ausgang ohne PullUp
   
   if(TRUE) led_set(0,1); // true-Test ;)
   sei(); // und los

   while(1)
	{
	   if(detect_right()) led_set(2,1); else led_set(2,0);
	   if(detect_left()) led_set(1,1); else led_set(1,0);
	   delay(1000);
	}
}

ISR (TIMER2_COMP_vect)
{
   static uint8_t status=0;
   if(status)
   {
      led_set(LED_R_YE, 1); // Kontroll-LED
      PORTA |= (1<<PA3);
      status=0;
   }
   else
   {
      led_set(LED_R_YE, 0);
      PORTA &= ~(1<<PA3);
      status=1;
   }
}
Der SFH reagiert nach ca. 10 Signalwellen auf eine IR-Trägerfrequenz. Wir senden jeweils ca. 36 Wellen (mit dem schrottigen delay() gemessen) und prüfen dann, ob der SFH etwas erkannt hat. Das funktioniert vermutlich nur zufriedenstellend, wenn die IR-Leds eine deutliche Richtungswirkung haben. Das kann man z.B. mit Schrumpfschläuchen (wie beim Probot) über den Leds erreichen.

Ob das Programm wie erwartet fumktioniert mußt du testen. Bei meiner bee ohne deine Erweiterung ist der X3-Slot nicht belegt und die PA2/3-Pins hängen frei in der Luft. Deshalb kann ich mit dem Daumen eine Brücke zwischen GND und PA2 machen und so einen SFH-Empfang simulieren ;)

Wie groß sind eigentlich die Vorwiderstände der IR-LEDs? Vorsichtshalber sollten nie beide Seiten eingeschaltet sein um eine Überlastung von PA3 zu vermeiden.

Gruß

mic