hi Jordi,
ich habe nun mit dem code etwas "herumgespielt", es funktioniert bei mir (messung und servo auch):
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;
}
ich habe den code nach meinem verständnis angepasst, weil ich ein paar sachen in Deinem code nicht verstanden habe:
- 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 ...
Lesezeichen