Hi inka,
Egal, wichtig wäre nur, dass die "Zählfunktion" alle paar MS wieder dran ist (so wie z.B. die Funktionen task_ADC(), task_motionControl() der RP6 Lib).... in einer schnellen programm-hauptschleife nur diese funktion, oder die möglichkeit aus einer hauptschleife diese schnelle funktion aufzurufen?
Gruß
Dirk
also ich habs jetzt mit meinen bescheidenen möglichkeiten versucht:
der code läuft einmal durch und gibt vier mal "0000" aus. Ich habe es bereits mit zeitmessung mit stopwatch zu ergründen versucht, danach bleibt der code in der " if ( PINC & (1<<PC5) )" abfrage hängen...Code:#include "RP6ControlLib.h" #include "RP6Control_MultiIOLib.h" uint16_t anfang, ende, dauer, distanz_schleife; void trig_schleife(void) { PORTC |= (1<<PC6);//Trig high _delay_us(12); PORTC &= ~(1<<PC6);//TRIG auf low } void messung_SR_04_schleife (void) { startStopwatch2(); anfang=getStopwatch2(); DDRC |= (1 << PC6);//Trig als Ausgang PORTC &= ~(1<<PC6);//TRIG auf low DDRC &= ~(1<<PC5);//Echo als Eingang PORTC &= ~(1<<PC5);//ECHO pullup AUS (Echo auf LOW) // PORTC |= (1<<PC5);//Echo auf high while(1) { if ( PINC & (1<<PC5) ) { ende = getStopwatch2(); dauer = (ende - anfang); distanz_schleife = (dauer*4)/58; //das stimmt noch nicht! break; } } } int main(void) { initRP6Control(); multiio_init(); initLCD(); while(1) { //Messung starten messung_SR_04_schleife (); //Signal auslösen trig_schleife(); _delay_ms(50); //Werte ausgeben writeString("anfang: "); writeIntegerLength(anfang, DEC, 4); writeString(" ende: "); writeIntegerLength(ende, DEC, 4); writeString(" dauer: "); writeIntegerLength(dauer, DEC, 4); writeString(" distanz: "); writeIntegerLength(distanz_schleife, DEC, 4); writeChar('\n'); mSleep(200); } return 0; }
Habe ich einen logischen fehler eingebaut, stimmt die reihenfolge der programmteile nicht, oder ist schlicht die abfrage des ports falsch? Ich wüsste nicht wo ich noch nachlesen soll, oder was ich noch probieren kann...
gruß inka
Hi inka,
ja, so im Prinzip meinte ich das.
Programm Ablauf:
1. Lass mal zuerst zum Probieren die Funktion messung_SR_04_schleife() ganz weg.
2. Die Portpin-Definitionen für Trig und Echo und startStopwatch2(); pack an den Anfang von Main.
3. In der while(1)-Schleife in Main Folgendes:
3. a. trig_schleife();
3. b. In einer while-Schleife warten bis Echo HIGH wird
3. c. setStopwatch2(0);
3. d. In einer while-Schleife warten bis Echo wieder LOW wird
3. e. dauer = getStopwatch2();
3. f. dauer anzeigen, Distanz berechnen und auch anzeigen
3. g. ca. 60ms warten, dann geht's mit der while(1)-Schleife von vorn los.
Gruß
Dirk
hi Dirk,
die blockierende variante funktioniert nun (auch für zwei HC-SR04), an der nicht blockierenden variante arbeite ich noch...(ist die eigentlich vorteilhaft, oder halt nur eine variante?)
Code:#include "RP6ControlLib.h" #include "RP6Control_MultiIOLib.h" double dauer_1, dauer_2, distanz_schleife_1, distanz_schleife_2; void trig_schleife(void) { PORTC |= (1<<PC6);//Trig high _delay_us(12); PORTC &= ~(1<<PC6);//TRIG auf low } int main(void) { initRP6Control(); multiio_init(); initLCD(); DDRC |= (1 << PC6);//Trig als Ausgang PORTC &= ~(1<<PC6);//TRIG auf low DDRC &= ~(1<<PC5);//Echo_1 als Eingang PORTC &= ~(1<<PC5);//ECHO_1 pullup AUS (Echo auf LOW) DDRC &= ~(1<<PC3);//Echo_2 als Eingang PORTC &= ~(1<<PC3);//ECHO_2 pullup AUS (Echo auf LOW) dauer_1 = 0; distanz_schleife_1 = 0; dauer_2 = 0; distanz_schleife_2 = 0; startStopwatch2(); startStopwatch3(); while(1) { trig_schleife(); loop_until_bit_is_set(PINC, PC5); setStopwatch2(0); loop_until_bit_is_clear(PINC, PC5); dauer_1 = getStopwatch2(); distanz_schleife_1 = (dauer_1*34.3)/2; //Werte ausgeben writeString(" dauer_1: "); writeDouble(dauer_1, DEC, 2, 2); writeString(" ms"); writeString(" distanz_1: "); writeDouble(distanz_schleife_1, DEC, 3, 2); writeString(" cm"); writeChar('\n'); mSleep(500); trig_schleife(); loop_until_bit_is_set(PINC, PC3); setStopwatch3(0); loop_until_bit_is_clear(PINC, PC3); dauer_2 = getStopwatch3(); distanz_schleife_2 = (dauer_2*34.3)/2; //Werte ausgeben writeString(" dauer_2: "); writeDouble(dauer_2, DEC, 2, 2); writeString(" ms"); writeString(" distanz_2: "); writeDouble(distanz_schleife_2, DEC, 3, 2); writeString(" cm"); writeChar('\n'); mSleep(500); } return 0; }
gruß inka
Hi inka,
ich freu mich für Dich das es nun auch für 2 Sensoren funktioniert. Nur jetzt hast Du ja sogar 3 Ports in Arbeit für die beiden Sensoren. In dem Vorschlag von Dirk ging es ja darum den ICP Pin nicht mehr zu benutzen und eine eigene Zeitschleife zu bauen. Hast Du in der Richtung schon experimentiert ?
Blockierend ist meiner Meinung immer blöd. Der Bot steht dann zu oft, besser ist wenn er schon im Fahren die Hindernisse ausweicht, welches natürlich nur mit der nicht blockierenden Funktioniert. Aber da bist Du ja auch schon dran.
Gruß TrainMen
Hi TrainMen,
nun, bei der timerversion war es der PD6(ICP) und der PC6, bei der zeitschleifenversion (das ist der code in meinem letzten post) sind es der PC5/PC6 für einen sensor und zusätzlich der PC3 für den zweiten sensor, der ICP ist frei - aufgabe erfüllt?
bei der nichtblockierenden version scheitere ich zunächst mal an der abfrage der PINs.Diese drei versionen habe ich schon versucht:
Code:abfrage ob PIN gesetzt: if (PINC & (!(1<<PC5))) if ( ( PINC & 0x01 ) == 1 ) if(bit_is_set(PINC, PIN5)) abfrage ob PIN gelöscht: if (!( PINC & (1<<PC5) )==0) if ( ( PINC & 0x01 ) == 0 ) if(bit_is_clear(PINC, PIN5))
bisher erfolglos, hast Du evtl. einen vorschlag?
gruß inka
Lesezeichen