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
Lesezeichen