Hi Dirk,

Zitat von
Dirk
1. Die Funktion:
Code:
uint8_t read_IR_value(void)
{
// uint8_t temp = 0;
I2CTWI_transmitByte(I2C_RP6_BASE_ADR, 30); // Start with register 30
I2CTWI_readBytes(I2C_RP6_BASE_ADR, temp_IR, 1);
return temp;
}
... tut nicht das, was sie soll.
Wenn du sie im Programm mit temp = read_IR_value(); aufrufst, wird von der Funktion nicht der IR-Sensor-Wert zurückgegeben, sondern der Wert der (globalen) Variablen temp.
Allerdings wird der IR-Sensor-Wert in der (ebenfalls globalen) Variablen temp_IR gespeichert, die im Programm als Array definiert ist.
temp_IR[0] wird von dir aber nicht weiter benutzt.
Die Funktion müßte so aussehen:
Code:
uint8_t read_IR_value(void)
{
uint8_t tmp = 0;
I2CTWI_transmitByte(I2C_RP6_BASE_ADR, 30); // Start with register 30
I2CTWI_readBytes(I2C_RP6_BASE_ADR, tmp, 1);
return tmp;
}
Dann kriegst du mit temp = read_IR_value(); den IR-Sensor-Wert in temp.
meinst Du hier evtl "tmp"? Verstehe ich das richtig: in der ursprünglichen version wurde nicht der aktuelle sensor-wert in "temp" geschrieben, sondern ein wert aus dem IR-array? Ich werde die geändert version testen...

Zitat von
Dirk
2. Nochmal zur Hauptschleife:
Code:
while(true)
{
do
{
// Alles weitere ...
task_checkINT0();
task_I2CTWI();
}
while(!bumper_left && !bumper_right);
stop();
}
... und dem Problem, dass sie m.E. nicht funktioniert. Warum soll diese Schleife auf die Bumper reagieren? Teste das mal! Wird der Stop-Befehl erreicht, wenn du einen Bumper drückst?
der stop-befehl wird erreicht, mit diesem, unverändertem
Code:
#include "RP6ControlLib.h"
#include "RP6I2CmasterTWI.h"
#include "RP6Control_MultiIOLib.h"
#include "RP6Control_I2CMasterLib.h"
#include "RP6Control_LFSBumperLib.h"
#include "RP6ControlServoLib.h"
#include "standard.h"
#define I2C_RP6_BASE_ADR 10
/******************variablen***************************/
//uint8_t transmit_buffer[10];
uint8_t RP6data[32];
uint8_t i, j, t;
int16_t x, y, z;
uint8_t temp;
//uint8_t ir_value[0];
uint8_t temp_IR[0];
//uint8_t feld_IR[200];
/*******************************************************************************/
void readAllRegisters(void)
{
I2CTWI_transmitByte(I2C_RP6_BASE_ADR, 0); // Start with register 0...
I2CTWI_readBytes(I2C_RP6_BASE_ADR,RP6data, 31); // and read all 30 registers up to
// register Number 29 !
// Now we output the Data we have just read on the serial interface:
writeString_P("\nREADING ALL RP6 REGISTERS:");
uint8_t i = 0;
for(i = 0; i < 31; i++)
{
if(i % 8 == 0) // add some newline chars otherwise everything
writeChar('\n'); // is printed on ONE single line...
else
writeString_P(" | ");
writeChar('#');
writeIntegerLength(i,DEC,2);
writeChar(':');
writeIntegerLength(RP6data[i],DEC,3);
}
writeChar('\n');
}
/***************************************************************************/
uint8_t read_IR_value(void)
{
// uint8_t temp = 0;
I2CTWI_transmitByte(I2C_RP6_BASE_ADR, 30); // Start with register 30
I2CTWI_readBytes(I2C_RP6_BASE_ADR, temp_IR, 1);
return temp;
}
/******************************************************************/
void I2C_requestedDataReady(uint8_t dataRequestID)
{
checkRP6Status(dataRequestID);
}
/********************hauptprogramm*****************************/
int main(void)
{
initRP6Control();
multiio_init();
initLCD();
//orientation_init();
setLEDs(0b1111);
mSleep(500);
setLEDs(0b0000);
I2CTWI_initMaster(100);
I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);
I2CTWI_setRequestedDataReadyHandler(I2C_requestedDataReady);
showScreenLCD(" RP6Control M32", " bake_suche_1", "", "");
mSleep(1500);
clearLCD();
accuspannung();
mSleep(1500);
clearLCD();
while(true)
{
setLEDs(0b0100);
startStopwatch3();
t=0;
do
{
// readAllRegisters();
if(getStopwatch3() > 50)
{
temp = read_IR_value();
if (temp !=0)
{
setMultiIOLED1(1);
setMultiIOLED1(0);
rotate(80, RIGHT, 5, false);
temp = read_IR_value();
if (temp == 0) stop(); //break;
if(bumper_left && bumper_right) //stop();//break;
{
stop();
}
}
temp = read_IR_value();
if (temp == 0)
{
x = getStopwatch3();
setMultiIOLED3(1);
setMultiIOLED3(0);
if (t<10)
{
t++;
if (t == 10)
{
y = getStopwatch3();
z = y-x;
/*
writeInteger(x, DEC);
writeChar('\n');
writeInteger(y, DEC);
writeChar('\n');
writeInteger(z, DEC);
writeChar('\n');
*/
t=0;
setStopwatch3(0);
if (z< 600)
{
move(100, FWD, DIST_MM(100), false);
setStopwatch3(0);
t=0;
mSleep(400);
task_checkINT0();
task_I2CTWI();
if(bumper_left && bumper_right)
{
stop();
}
}
}
}
}
}
task_checkINT0();
task_I2CTWI();
}
while(!bumper_left && !bumper_right);
stop();
}
return 0;
}

Zitat von
Dirk
3. Ich kann nicht verstehen, warum durch eine Abfrage des IR-Empfängers rasch hintereinander im 50ms-Teil Reflektionen "erkannt" bzw. ausgeblendet werden können. In einem Raum können Lichtreflektionen durch ein einfaches GCC-Programm nicht berechnet/erkannt werden. Sie unterscheiden sich in der Laufzeit in einem Zimmer nur im Nanosekundenbereich.
das ist aber das ergebnis meiner versuche. Bei einer abfrage fur der RP ganz woanders gegen die wand, weil er dort die bake gesehen hat, bei 10x nacheinader hat er die richtige richtung gefunden. Nicht nur in einem raum, sondern an verschiedene stellen, sogar draussen...
Lesezeichen