Hätte noch eine Lösung ohne Interrupts.
Im 2.Modus ("Single pin for both Trigger and Echo").
Müsste prozessorunabhängig sein
für 16Mhz geschrieben

Habe meinen Code für deinen Pin ADC2 = PA2 (Atmega32)angepasst.

Code:
//Auszug aus ibex_header_v117.h
//(c) Bernhard Stiehle 2008-2010
//***********************************************//
// INT USONIC
// liefert den Abstand des Ultraschallsensors
// in Zentimetern. Es muss die Type SRF05 sein.
// Rueckgabewert -1 = Modul reagiert nicht/ außerhalb Bereich
//***********************************************//
int usonic()
{

 int ustime=0;  //Eine Variable bitte ... danke !
 int failure=0; //Sicherheit
 
 cbi(DDRA,2);	        //Anschluss als Eingang
 cbi(PORTA,2);        //Pull-ups sicherheitshalber ausschalten
 
 sbi(DDRA,2);	        //Anschluss als Ausgang
 cbi(PORTA,2);   		//Low-Pegel ausgeben
 usleep(1);		    	//Wartezeit
 
 sbi(PORTA,2);		    //High-Impuls ausgeben (-> Sensor misst)
 usleep(1);			    //Warten
 cbi(PORTA,2);		    //Impuls Ende
 
 cbi(DDRA,2);	        //Anschluss als Eingang
 cbi(PORTA,2);		    //Pull-ups sicherheitshalber ausschalten
 usleep(1);			    //warten
 
 
 while( !(PINA & 4) )  //warten, bis der Sensor sein Signal
 {                      //zurueckgibt (warten solange low)
  asm volatile("nop");
  asm volatile("nop");
  failure++;            //Sicherheit: wenn kein Signal nach bestimmter Zeit kommt
  if(failure>2500)    
  {return -1;}         //dann -1 zurueck liefern (= kein Modul angeschlossen)
 }

 failure=0; 
 
 while(PINA & 4)       //Signal hat begonnen (=high)
 {
  ustime++;             //Dauer des Impulses messen
  usleep(1);            //Die Variable will eine Einheit (hier 0,1 ms)
  failure++;            //Sicherheit: wenn Signal nach bestimmter Zeit nicht endet
  if(failure>5000)
  {return -1;}         //dann -1 zurueck liefern (= kein Modul angeschlossen)
 }
 
 msleep(35);            //Wartezeit (Echo soll verhallen, sonst Fehlmessung)
 
 return int( float(ustime)*float(1.408) );  //Rueckgabewert in Zentimeter, bitte !
}
usleep(1) habe ich für meine Programmierung als 100 Mikrosekunden = 0,1ms definiert, bitte nicht wundern, wirst du noch durch einen anderen Wartebefehl ersetzen müssen.
Die Wartezeiten sind großzügig gewählt.
PINA & 4 ist gewollt, auch wenn der Pin PA2 heißt. (2 hoch 2=4)

Das Ausführen dieser Funktion kann den Programmablauf deutlich verlangsamen, da das Programm wirklich bis zum Ende der Messung wartet.

wieso so viele themen eröffnen?
https://www.roboternetz.de/phpBB2/viewtopic.php?t=54475

Gruß
Bernhard