danke nochmal dirk für deine hilfe. leider bin ich bis heute nicht mehr zum programmieren gekommen und habs drum auch total vergessen dir zu antworten.
aber dafür funktioniert mein arm nun komplett so wie ich will, also nicht nur für einen zyklus. viel habe ich probiert, wie ich das umsetzen kann, auch deine vorschläge aus deinem letzten post habe ich ausprobiert, aber erst heute kam mir die lösung.
zur erinnerung: mein bisheriges problem war, dass das setStopwatchx(0) nur die Stopwatchx zurückgesetzt hat und diese sich wiederum danach selbstständig gestartet hat.
darum bin ich heute in der anleitung auf die funktion stopStopwatchx(); gestoßen. seit ich diese dann in mein programm mit eingebaut habe, funktioniert alles wie gewollt.
hier ist nun mein fertiges programm:
Code:
// Uncommented Version of RP6ControlServo.c
// ------------------------------------------------------------------------------------------
#include "RP6ControlLib.h"
#include "RP6ControlServoLib.h"
#include "RP6I2CmasterTWI.h"
#include "RP6Control_I2CMasterLib.h"
//Servo 1 => PC2
//Servo 2 => PC3
//Servo 3=> PC4
//Servo 4=> PC5
//Servo 5=> PC6
//Reflexkoppler => PD6
uint8_t a;
void task_teil_erkannt(void)
{if (PIND & (1<<6))
{
a=1;
writeString_P("kein Teil erkannt\n");
}
else {a=0;
writeString_P("Teil erkannt\n");
startStopwatch2();
}
}
void task_servoansteuerung(void)
{
if (getStopwatch2() >100 && getStopwatch2() <6000)
{
servo1_position = 0;
writeString_P("Greifer zu\n");
stopStopwatch3();
setStopwatch3(0);
}
if (getStopwatch2() > 2000 && getStopwatch2()<6000)
{
servo3_position = 50;
stopStopwatch3();
setStopwatch3(0);
writeString_P("Arm hoch\n");
}
if (getStopwatch2() >3000 && getStopwatch2() < 5000)
{servo2_position =0;
stopStopwatch3();
setStopwatch3(0);}
if ( getStopwatch2() >4000 && getStopwatch2() <6000)
{servo5_position = 0;
stopStopwatch3();
setStopwatch3(0);}
if ( getStopwatch2() >5000 && getStopwatch2() <6000 )
{servo2_position =150;
writeString_P("Greifer auf Grundposition zurück\n");
stopStopwatch3();
setStopwatch3(0);}
if (getStopwatch2() >6000 )
{servo3_position = RIGHT_TOUCH;
writeString_P("Stopwatch3 starten\n");
startStopwatch3();}
if ( getStopwatch3() >1000 )
{servo1_position = RIGHT_TOUCH;
writeString_P("Stopwatch3 läuft\n");
stopStopwatch2();}
if ( getStopwatch3() > 2000 && getStopwatch3() <4000)
{servo3_position =50;
writeString_P("Arm hoch 3\n");
setStopwatch2(0);
writeString_P("Stopwatch2 auf 0 \n");}
if (getStopwatch3() >3000)
{servo5_position = MIDDLE_POSITION;
setStopwatch2(0);}
if (getStopwatch3() >4000)
{servo3_position = RIGHT_TOUCH;
setStopwatch2(0);}
}
void RP6_Bewegung(void)
{if (getStopwatch3() >4200 || (a==1 && getStopwatch2() ==0 && getStopwatch3() ==0))
{changeDirection(BWD);
moveAtSpeed(50,50);
stopStopwatch2();
setStopwatch2(0);
writeString("RP6 fahren\n");}
if (a==0)
{moveAtSpeed(0,0);
stopStopwatch3();
setStopwatch3(0);
writeString("RP6 Stillstand\n");}
}
int main(void)
{
initRP6Control();
I2CTWI_initMaster(100);
DDRD &=~ (1<<6); //Eingang für Reflexkoppler
initSERVO(SERVO1|SERVO2|SERVO3|SERVO5);
servo1_position = RIGHT_TOUCH;
servo2_position = 150;
servo3_position = RIGHT_TOUCH;
servo5_position = MIDDLE_POSITION;
while(true)
{task_servoansteuerung();
task_teil_erkannt();
RP6_Bewegung();
task_SERVO();
mSleep(3);
}
return 0;
}
einziger wehrmutstropfen ist die tatsache, dass einer meiner servos, wohl aufgrund meines zu schweren armes einen getriebeschaden hat, weshalb aus meinem ursprünglichen 5- achs-arm nun ein 4- achs-arm wurde.
das versprochene video werde ich in den kommenden tagen wie versprochen online stellen.
was mich abschließend noch brennend interessieren würde, ist die frage, warum ich die stopwatches, wie in meinem fall erst mit stopStopwatchx() stoppen und anschließend mit setStopwatchx(0); rücksetzen muss, damit sie nicht von alleine wieder starten und nicht so, wie man es sonst gewohnt ist, ohne stopStopwatchx();.
vielleicht hat ja jemand aus dem forum eine erklärung dazu...
mfg andi
Lesezeichen