Morpheus1997
16.08.2012, 20:37
Hey Leute. Ich habe ein Problem: Ich möchte ein Programm schreiben, welches mit Hilfe des Srf02-Ultraschallsensors die Entfernung vom Rp6 zu einem erkannten Hindernis ermittelt. Doch wenn ich das Programm starte, stürzt der Rp6 ab. Der Sensor ist übrigens an der M32 Platine angeschlossen. Kann mir vielleicht jemand helfen, hat(te) vielleicht jemand ein ähnliches Problem oder hat 'gar ein vollfunktionstüchtiges Programm, welches das "macht, was ich will"?
Vielen Dank im Vorraus. LG Marcel
#include "RP6I2CmasterTWI.h"#include "RP6ControlLib.h"
// The measured distance:
uint16_t gemesseneEntfernungSRF;
/************************************************** ***************************/
// SRF02:
// The I2C slave address of the SRF ranger - default is 0xE0, but you can
// change this when you use the function changeSRFAddr() below.
// Here we changed it to 0xE0 already:
#define SRF_ADR 0xE0
/************************************************** ***************************/
// I2C Event handlers:
// I2C Data request IDs:
#define MEASURE_US_LOW 110
#define MEASURE_US_HIGH 111
// Nur Messen wenn der Sensor still steht.
uint8_t messungOkay=0;
uint16_t SRF02_zwischenergebnis=0;
uint16_t SRF02_Dist=0;
uint16_t zaehler=0;
int main (void)
{
void initSRF02(void){
startStopwatch7();
messungOkay=1;
}
void stopSRF02(void){
stopStopwatch7();
messungOkay=0;
}
void task_SRF02(void)
{
if(messungOkay>=1){
static uint8_t measureInProgress = false;
if(!measureInProgress) // Start measurement ONCE only
{
if(TWI_operation == I2CTWI_NO_OPERATION) // If there is no request in progress...
{
I2CTWI_transmit2Bytes(SRF_ADR, 0, 81); // 81 means return distance in cm
measureInProgress = true;
setStopwatch7(0);
}
}
else if(getStopwatch7() > 70) // 120ms (measurement delay)
{
I2CTWI_transmitByte(SRF_ADR, 2); // range register high byte
I2CTWI_requestDataFromDevice(SRF_ADR, MEASURE_US_HIGH, 1); // receive it
measureInProgress = false; // allow to start new measurement
setStopwatch7(0);
// Die Messung mitteln
zaehler++;
SRF02_zwischenergebnis=SRF02_zwischenergebnis+geme sseneEntfernungSRF;
}
if(zaehler>=3){
SRF02_Dist=SRF02_zwischenergebnis/zaehler;
zaehler=0;
SRF02_zwischenergebnis=0;
}
}else{
SRF02_Dist=-1;
}
}
while (true){
task_SRF02();
initSRF02();
writeString("Srf02");
writeInteger(SRF02_Dist,DEC);
}
}
Vielen Dank im Vorraus. LG Marcel
#include "RP6I2CmasterTWI.h"#include "RP6ControlLib.h"
// The measured distance:
uint16_t gemesseneEntfernungSRF;
/************************************************** ***************************/
// SRF02:
// The I2C slave address of the SRF ranger - default is 0xE0, but you can
// change this when you use the function changeSRFAddr() below.
// Here we changed it to 0xE0 already:
#define SRF_ADR 0xE0
/************************************************** ***************************/
// I2C Event handlers:
// I2C Data request IDs:
#define MEASURE_US_LOW 110
#define MEASURE_US_HIGH 111
// Nur Messen wenn der Sensor still steht.
uint8_t messungOkay=0;
uint16_t SRF02_zwischenergebnis=0;
uint16_t SRF02_Dist=0;
uint16_t zaehler=0;
int main (void)
{
void initSRF02(void){
startStopwatch7();
messungOkay=1;
}
void stopSRF02(void){
stopStopwatch7();
messungOkay=0;
}
void task_SRF02(void)
{
if(messungOkay>=1){
static uint8_t measureInProgress = false;
if(!measureInProgress) // Start measurement ONCE only
{
if(TWI_operation == I2CTWI_NO_OPERATION) // If there is no request in progress...
{
I2CTWI_transmit2Bytes(SRF_ADR, 0, 81); // 81 means return distance in cm
measureInProgress = true;
setStopwatch7(0);
}
}
else if(getStopwatch7() > 70) // 120ms (measurement delay)
{
I2CTWI_transmitByte(SRF_ADR, 2); // range register high byte
I2CTWI_requestDataFromDevice(SRF_ADR, MEASURE_US_HIGH, 1); // receive it
measureInProgress = false; // allow to start new measurement
setStopwatch7(0);
// Die Messung mitteln
zaehler++;
SRF02_zwischenergebnis=SRF02_zwischenergebnis+geme sseneEntfernungSRF;
}
if(zaehler>=3){
SRF02_Dist=SRF02_zwischenergebnis/zaehler;
zaehler=0;
SRF02_zwischenergebnis=0;
}
}else{
SRF02_Dist=-1;
}
}
while (true){
task_SRF02();
initSRF02();
writeString("Srf02");
writeInteger(SRF02_Dist,DEC);
}
}