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.
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.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 ! }
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







Zitieren

Lesezeichen