Hallo

dein fertiges hex-file ist ein anderes programm...
Jain, das selbe Programm ist es eigentlich schon, aber mit der falschen Lib kompiliert. Das steht glaube ich irgendwo weiter unten...

DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW


Setzt den TXD-Pin des Mega8 auf Ausgangsfunktion und gibt ein Low aus. An diesem Pin ist die Kathode IR-LED angeschlossen die deshalb nur leuchten kann, wenn dieser Pin Low ist.

OCR2 = 0xFC;

Das ist der eigentliche Trick der Sache. Die Anode der IR-LED ist (über R16) am OC2-Pin angeschlossen, das ist der Ausgangspin von Timer2. Hier wird nun ein (ich glaube 36kHz-)Signal mit variablem Puls-Pauseverhältniss erzeugt. Je größer dabei der Pulsanteil ist, desto empfindlicher wird die Abstandsmessung, 0xff ist unempfindlich wenn ich mich recht erinnere. Das alles funktioniert aber nur richtig, wenn man die von waste angepasste Lib (anderer PWM-Mode und Ausgangstogglen) verwendet. Das funktionierte bei mir zu Anfang nicht, deshalb funzt das Hex nicht.

ir=PIND & (1 << PD0);

Fragt den IR-Empfänger ab und speichert 1 oder 0 in ir. Dazu muß man aber wissen, dass der Empfänger das Signal invertiert! Wenn er kein 36kHz-Signal erkennt ist sein Ausgang high, deshalb prüft if(ir) ob die Bahn frei ist (kein IR-Echo erkannt) und if(!ir) prüft auf ein Hinderniss (Echo erkannt).

Gruß

mic