hallo Jordi,
wie sieht die "RP6ControlUltrasonic.c" und "*.h" denn aus?
btw, der code macht sich viel besser, wenn er in den "code" tags eingegeben wird (erweiterete ansicht, mittlere iconreihe, drittes von rechts)
hallo Jordi,
wie sieht die "RP6ControlUltrasonic.c" und "*.h" denn aus?
btw, der code macht sich viel besser, wenn er in den "code" tags eingegeben wird (erweiterete ansicht, mittlere iconreihe, drittes von rechts)
gruß inka
Hallo inka,
Die RP6ControlUltrasonic.c existiert gar nicht, ich habe die beiden Methoden in der Hauptdatei implementiert. War da etwas schlampig, werde die Methoden noch auslagern.
In der Headerdatei sind eigentlich nur die Methoden definiert. In der Orginaldatei waren vorher noch #defines für die Nutzung mit Timer1.
RP6ControlUltrasonic.h:
Code:// Defines // Prototypes // RP6ControllerUltrasonicTest.c void task_US_SW(void); void displayData(unsigned int r);
Hi Jordi,
also würde es bei übernahme Deines codes reichen die zeile mit dem include zu entfernen, denke ich. Ich habe in dem thread den ich neulich hier erwähnt habe eine blockierende lösung des auslesens von hc-sr04 gehabt, und wollte Deien code auch ausprobieren...
ist mir gar nicht aufgefallenund war gar nicht gemeint, manchmal sind die funktionen im programm selbst sogar übersichtlicher...
gruß inka
Hallo inka,
ich muss mal ganz blöd fragen: Was meinst Du mit 'blockierend'? Ich vermute mal dass mein Code auch 'blockiert', da der Code nur weiter ausgeführt wird wenn der Sensor das Echo erkennt (was bisher immer passiert ist, da die Sensorreichweite bisher nie ausgereizt wurde). Ich denke ich sollte noch die Stopwatch01 überwachen und bei Zeitüberschreitung die nächste Messung auslösen.
Funktioniert der Code bei Dir?
Grüsse, Jordi
hi Jordi,
ab hier haben wir uns mit der blockierneden und nicht-blockierenden ausführungen der mess-schleifen beschäftigt. Gehört nun Dein code zu den blockierenden? Es geht mir hier lediglich darum den prinzipiellen unterschied zu verstehen und am funktionierendem code testen zu können - die nicht blockierende ausführung habe ich nicht in einen code packen können. Dass der RP6 bei der blockierenden ausführung der US-messung mal z.b. kurz seine fahrt unterbrechen muss, stört mich nicht weiter...
ja, teilweise. Die entfernungsabfrage funktioniert nun, nachdem ich es teilweise umschreiben musste (da ich für den hc-sr04 zwei pins nehmen muss - echo und trig), der servo noch nicht, das liegt vermutlich an der anderen initailisierung und dem betreiben der Servos an der multi-IO karte. Kommt noch, jetzt bin ich erstmal für eine woche weg...
gruß inka
hi Jordi,
ich habe nun mit dem code etwas "herumgespielt", es funktioniert bei mir (messung und servo auch):
ich habe den code nach meinem verständnis angepasst, weil ich ein paar sachen in Deinem code nicht verstanden habe:Code:#include "RP6ControlLib.h" #include "RP6I2CmasterTWI.h" #include "RP6Control_MultiIOLib.h" #include "RP6Control_I2CMasterLib.h" #include "RP6Control_MultiIO.h" #include "RP6Control_LFSBumperLib.h" #include "RP6Control_OrientationLib.h" #include "RP6Stopwatch0Lib.h" #include "RP6ControlServoLib.h" #include "standard.h" #define I2C_RP6_BASE_ADR 10 uint16_t servopos, range; //ULTRASONIC FUNCTIONS ####################################### void task_US_SW() { DDRC |= IO_PC6; // IO_PC6 Ausgang PORTC |= (1<<PORTC6); // IO_PC6 high IO_PC6; _delay_us(10); // 10uS warten PORTC &= (0<<PORTC6); // IO_PC6 low ~IO_PC6; DDRC &= ~IO_PC5; // IO_PC5 Eingang while(!(PINC & IO_PC5)); // Warten bis steigende Flanke an IO_PC5 setStopwatch01(0); while(PINC & IO_PC5); // Warten bis fallende Flanke an IO_PC5 range = getStopwatch01() * 1.67; // Wert der Stoppuhr * 1,67 = Abstand in cm. } void displayData() { writeString_P("Abstand:"); writeInteger(range, DEC); writeString_P(" cm\n"); //sound(170,40,0); } //END OF ULTRASONIC FUNCTIONS ################################ int main(void) { initRP6Control(); multiio_init(); initLCD(); setLEDs(0b111111); mSleep(500); setLEDs(0b000000); I2CTWI_initMaster(100); I2CTWI_setTransmissionErrorHandler(I2C_transmissionError); showScreenLCD(" RP6Control M32", " hc-sr04 plus servo"," jordi","PC5 und PC6"); mSleep(1500); clearLCD(); setServoPower(1); PCA9685_init(50); servopos = (SERVO1_LT); startStopwatch01(); while(true) { PCA9685_set(1, servopos); servopos += 5; mSleep(2000); if (servopos > (SERVO1_RT)) servopos = (SERVO1_LT); task_US_SW(); displayData(); } return 0; }
- die funktion displayData(range) innerhalb der messfunktion - warum?
- die variablen r und range - warum zwei, warum innerhalb der funktion deklariert/definiert?
die messwerte, die ich bekomme sind nachvollziehbar, das einzige was mich noch stört ist das verhalten meines servos: es kommen erstmal 4 messwerte bevor die erste servobewegung stattfindet. Verstehe ich nicht, liegt aber nicht an Deinem, sondern an meinem code ...
gruß inka
Hi inka,
eine paar Gedanken, eine Pause in der Hauptschleife ist nicht so vorteilhaft, da Pausiert ja denn wirklich alles. Ist es denn in Deinem Projekt wirklich nötig alle 5 Servoschritte eine Messung vorzunehmen ? Wie soll das denn später funktionieren wenn der BOT sich bewegt ?
Wäre es nicht besser nur an bestimmten Positionen links, rechts und mitte die Messung durchzuführen ?
Wieviel cm bewegt sich denn der Bot bis zur nächsten Messung ?Dass der RP6 bei der blockierenden ausführung der US-messung mal z.b. kurz seine fahrt unterbrechen muss, stört mich nicht weiter...
Wenn ich das richtig sehe, dreht Dein Servo langsam nach rechts bis er > RT erreicht hat und dann in einem Rutsch zurück nach LT. Das sieht doof aus. Warum läßt Du ihn nicht auch wieder Schrittweise nach LT drehen ? Ich habe auch eine Funktion in der Lib geschrieben wo alle meine Servos eine Grundposition einnehmen. Diese rufe ich immer vor der Hauptschleife auf (Display Zeit) und habe bei Start immer die gleiche Position.
Gruß TrainMen
Hallo inka,
danke für Deine Fragen. Warum ich das so programmiert habe kann ich Dir gar nicht beantworten...war nur glücklich dass Servo und Sensor endlich wie gewünscht zusammengearbeitet haben. Durch Deine Fragen habe ich mich aber nochmal mit dem Code auseinandergesetzt und muss zugeben dass ich nicht gerade elegant programmiert habe.
Grüsse, Jordi
Nachtrag: Ich bekomme vor der ersten Servo-Bewegung 2 US-Messungen...stört mich aber im Moment (noch) nicht...setze mich derzeit mit der Kommunikation zwischen den µCs auseinander...
Lesezeichen