Hallo,
brauche funktionierenden Quelltext für SRF05 Ultraschallsensor an einem Atmega32.
Bitte um Hilfe!
Hallo,
brauche funktionierenden Quelltext für SRF05 Ultraschallsensor an einem Atmega32.
Bitte um Hilfe!
Moin moin.
http://www.shop.robotikhardware.de/s...roducts_id=133
Da kannst Du das Datenblatt mit Anleitung und Beispiele
runterladen.
Gruß Richard
Du hast doch in "SRF05: Abfrage, Berechnung; Ergebnis immer 0" schon mal danach gefragt; da ist auch ein voll funktionsfähiger Code für nen Mega8 von mir. Den auf Mega32 umzubauen ist wirklich keine Zauberei.
#ifndef MfG
#define MfG
Ja, habe ich! Aber du wolltest mir nicht allzu viel verraten.
Nein, wirklich, habe das mit den Interrupts nicht hingekriegt....
Mit dem Beispielprogramm in Bascom scheint es zu funktionieren, es piepst! Aber über welche RS232-Schnittstelle gibt er das Ergebnis aus? Wie schließe ich das an?
Ich glaube nicht das Dir jemand alles vorkaut. RN Wisssen, Bascom
Demos samples/Serial...lesen und testen. Zur Verbindung mit dem PC
brauchst Du aber einen RS232 Wandler! mit den Simulator von Bascom
geht es auch erst einmal. Einfach den Wert mittels Print ausgeben und im Simulator anschauen. Das solltest Du mir möglichst vielen Bascom Beispielen machen, das Bildet! Im Bascom Quellcode ganz oben ein
$sim einfügen, sonst braucht der Simulator gelegentlich ewig!
Viel Spaß beim Basteln.
Gruß Richard
Naja was heisst nicht zu viel verraten... es steht eigentlich alles da.
Die #defines in der .h so anpassen, dass sie zur Pinbelegung von dir passen. Ebenso der Interrupt-Name und dessen Register.
Der Result-Pin muss ein interruptfähiger Pin sein, der Trigger-Pin kann irgendeiner sein.
Diese Änderungen musst sowieso du selbst machen, da nur du weisst, wo was bei dir angeschlossen ist.
Was genau ging denn bei dem Interrupt nicht?
#ifndef MfG
#define MfG
Danke für eure Antworten!
Wusste nicht was ich da an den Werten ändern soll... Wofür braucht man die Interrupts in diesem Fall überhaupt?
Die Interrupts werden zur Zeitmessung des Echos benötigt. D.h. auch jeder andere Code wird auch Interrupts verwenden. Darum muss der Interrupt auch auf beide Flanken reagieren; Steigend: Messung starten. Fallend: Messung stoppen und Laufzeit berechnen.
#ifndef MfG
#define MfG
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
Danke für deine Hilfe Bernhard! Das werde ich gleich ausprobieren!
Dieses Thread ist bissl älter, da ging's um das Anschließen des Sensors, halt ein anderes Thema.
Wollte kein Chaos im Forum verunstalten...
Lesezeichen