ist schon nem freund passiert xD jaja ist doch jetzt eh egal wer das war
ich hab jetzt das problem, dass nur mein rechter entrieb rückwärts fährt, wenn ich forwärts gas gebe. wenn ich zu mehr als 1,2 sek vollgas gebe bekomm ich dauernd 0xf8 raus... an dem setMotorPower(300-xxx) kann es nicht liegen, die zeile hab ich schon testweise rausgenommen, keine veränderung...
ich hab mein altes linienfolgeprogramm nochmal ausgegraben, es funktioniert fast einwandfrei, keine errors, das einzige was nicht so läuft wie es soll ist: der RP6 fährt nur rückwärts ! auch wenn ich vorher changeDirection(FWD); oder setMotorDir(FWD,FWD); aufrufe...
hier mal die ganzen programme bzw. die teile aus den master/slave Libs/progs die ich eingefügt habe:
RC-Programm:
Code:
#include "RP6ControlLib.h"
#include "RP6I2CmasterTWI.h"
#include "RP6Control_I2CMasterLib.h"
void I2C_requestedDataReady(uint8_t dataRequestID)
{
checkRP6Status(dataRequestID);
}
void I2C_transmissionError(uint8_t errorState)
{
writeString_P("\nI2C ERROR - TWI STATE: 0x");
writeInteger(errorState, HEX);
writeChar('\n');
}
volatile uint16_t speed=0;
volatile uint16_t dir=0;
volatile uint16_t speedcount=0;
volatile uint16_t dircount=0;
ISR(TIMER1_COMPA_vect)
{
if (PINA & ADC5)
{
speedcount++;
}
else
{
if (speedcount > 0)
{
speed=speedcount;
}
speedcount=0;
}
if (PINA & ADC3)
{
dircount++;
}
else
{
if (dircount > 0)
{
dir=dircount;
}
dircount=0;
}
}
void initRC(void)
{
TCCR1A = (0 << WGM11) | (0 << WGM10) | (0 << COM1A0) | (0 << COM1A1); // CTC-Mode4, ohne OCR-Pin
TCCR1B = (0 << WGM13) | (1 << WGM12) | (0 << CS12) | (1 << CS11) | (0 << CS10); // CTC und prescaler /8
TIMSK |= (1 << OCIE1A); // Interrupt ein
OCR1A = 20; // 100kHz?
DDRA &= ~ADC5;
PORTA &= ~ADC5;
DDRA &= ~ADC3;
PORTA &= ~ADC3;
}
int main(void)
{
initRP6Control();
initLCD();
initRC();
startStopwatch1();
mSleep(1000);
I2CTWI_initMaster(100);
I2CTWI_setRequestedDataReadyHandler(I2C_requestedDataReady);
I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);
uint16_t speed1 = 0, dir1 = 0;
while(1)
{
cli(); // Interrupts verbieten
speed1=speed;
dir1=dir;
sei(); // Interrupts wieder zulassen
if (speed1 < 150 && speed1 > 140)
{
if (dir1 > 180){ setMotorDir(BWD,FWD); setMotorPower(150,150); }
if (dir1 < 120){ setMotorDir(FWD,BWD); setMotorPower(150,150); }
}
if (speed1 < 140)
{
setMotorDir(BWD, BWD);
if(dir1 < 140){ setMotorPower((300-speed1),(300-speed1)-dir1); }
if(dir1 > 150){ setMotorPower((300-speed1)-(300-dir1),(300-speed1)); }
if(dir1 < 150 && dir1 > 140) { setMotorPower(300-speed1, 300-speed1); }
}
if (speed1 > 150)
{
setMotorDir(FWD, FWD);
if(dir1 < 140){ setMotorPower(speed1,speed1-dir1); }
if(dir1 > 150){ setMotorPower(speed1-(300-dir1), speed1); }
if(dir1 < 150 && dir1 > 140) { setMotorPower(speed1, speed1); }
}
if(adcLSL < 500 || adcLSR < 500) { PORTA |= ADC7; } // Scheinwerfer an
if(adcLSL > 500 && adcLSR > 500) { PORTA &= ~ADC7; } // Scheinwerfer aus
task_checkINT0();
task_I2CTWI();
}
return 0;
}
setMotorDir und setMotorPower in der Control master lib:
Code:
void setMotorPower(uint8_t PWR_left, uint8_t PWR_right)
{
if(PWR_left > 210) PWR_left = 210;
if(PWR_right > 210) PWR_right = 210;
I2CTWI_transmit4Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_MOTOR_PWR, PWR_left, PWR_right );
while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();
}
void setMotorDir(uint8_t dir_left, uint8_t dir_right)
{
I2CTWI_transmit4Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_MOTOR_DIR, dir_left, dir_right);
while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();
}
die beiden funktionen im Base slave prog:
Code:
#define CMD_SET_MOTOR_PWR 13
#define CMD_SET_MOTOR_DIR 14
....
//einfügung in die switch-case funktion:
case CMD_SET_MOTOR_PWR: setMotorPower(param1,param2); break;
case CMD_SET_MOTOR_DIR: setMotorDir(param1,param2); break;
wenns hilft hier noch das Linienfolgeprogramm, das ja bis auf die rückwärtsfahrt funktioniert:
Code:
#include "RP6ControlLib.h"
#include "RP6ControlServoLib.h"
#include "RP6I2CmasterTWI.h"
#include "RP6Control_I2CMasterLib.h"
void I2C_requestedDataReady(uint8_t dataRequestID)
{
checkRP6Status(dataRequestID);
}
void I2C_transmissionError(uint8_t errorState)
{
showScreenLCD("I2C ERROR: 0x","");
writeIntegerLCD(errorState, HEX);
}
int main(void)
{
initRP6Control();
initLCD();
mSleep(500);
I2CTWI_initMaster(100);
I2CTWI_setRequestedDataReadyHandler(I2C_requestedDataReady);
I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);
setMotorDir(FWD,FWD);
while(1)
{
if (adcLSL > adcLSR)
{
setMotorPower(100,50);
}
else
{
setMotorPower(50,100);
}
task_checkINT0();
task_I2CTWI();
getAllSensors();
}
return(0);
}
wo könnte der fehler sein -.- hab langsam keine lust mehr i-was mit meinem RP6 zu machen da fast nie was geht...
MfG Julian
Lesezeichen