Hallo,
vielen Dank für Eure Hilfe. Jetzt funktioniert alles wie es soll. Ich habe die Stopwatch- und die Servo-Lib aus diesem Forum und Code für den Sensor aus dem holländischen Arexx-Forum verwendet und angepasst. Als nächstes werde ich mich mit der Kommunikation zwischen RP6 Base und RP6 Control befassen.
Hier ist der Code:
Code:
#include "./RP6Lib/RP6control/RP6ControlServoLib.h"
#include "./RP6Lib/RP6common/RP6Stopwatch0Lib.h"
#include "RP6ControlUltrasonic.h"
volatile uint16_t pos = 0;
//ULTRASONIC FUNCTIONS #######################################
void task_US_SW()
{
uint16_t range;
//MEASURING
DDRC |= IO_PC3; // IO_PC3 Ausgang
PORTC |= (1<<PORTC3); // IO_PC3 high IO_PC3;
_delay_us(10); // 10uS warten
PORTC &= (0<<PORTC3); // IO_PC3 low ~IO_PC3;
DDRC &= ~IO_PC3; // IO_PC3 Eingang
while(!(PINC & IO_PC3)); // Warten bis steigende Flanke an IO_PC3
setStopwatch01(0);
while(PINC & IO_PC3); // Warten bis fallende Flanke an IO_PC3
range = getStopwatch01() * 1.67; // Wert der Stoppuhr * 1,67 = Abstand in cm.
displayData(range);
//MEASURING END
}
void displayData(uint16_t r)
{
writeString_P("Abstand:");
writeInteger(r, DEC);
writeString_P(" cm\n");
sound(170,40,0);
}
//END OF ULTRASONIC FUNCTIONS ################################
int main(void)
{
initRP6Control();
setLEDs(0b111111);
mSleep(500);
setLEDs(0b000000);
initSERVO(SERVO1);
startStopwatch2();
startStopwatch01();
while(true)
{
if (getStopwatch2() > 2000) { // Alle 2000ms Servo drehen
if (pos == 0) {
servo1_position = 0;
}
if (pos == 1) {
servo1_position = MIDDLE_POSITION;
}
if (pos == 2) {
servo1_position = RIGHT_TOUCH;
}
if (pos == 3) {
servo1_position = MIDDLE_POSITION;
}
pos++;
if (pos > 3) {pos = 0;}
setStopwatch2(0);
task_US_SW();
}
task_SERVO();
mSleep(3);
}
return 0;
}
Und hier sind meine Einstellungen für den Servo aus der RP6ControlServoLib.h:
Code:
#define LEFT_TOUCH 56
#define RIGHT_TOUCH 42
#define MIDDLE_POSITION (RIGHT_TOUCH / 2)
#define PULSE_REPETITION 17
#define F_TIMER1 50000
Lesezeichen