Почему мой вложенный цикл while не работает?

В настоящее время я программирую в RobotC, для Vex 2.0 Cortex. Я использую кодировщики, чтобы мой робот работал прямо.

Это мой код:

void goforwards(int time)
{
    int Tcount = 0;
    int speed1 = 40;
    int speed2 = 40;
    int difference = 10;


    motor[LM] = speed1;
    motor[RM] = speed2;
    while (Tcount < time)
    {
        nMotorEncoder[RM] = 0;
        nMotorEncoder[LM] = 0;

        while(nMotorEncoder[RM]<1000)
        {
            int REncoder = -nMotorEncoder[RM];
            int LEncoder = -nMotorEncoder[LM];

            if (LEncoder > REncoder)
            {
                motor[LM] = speed1 - difference;
                motor[RM] = speed2 + difference;
                if (motor[RM]<= 0)
                {
                    motor[RM] = 40;
                    motor[LM] = 40;
                }
            }
            if (LEncoder < REncoder)
            {
                motor[LM] = speed1 + difference;
                motor[RM] = speed2 - difference;
                if (motor[RM]<= 0)
                {
                    motor[RM] = 40;
                    motor[LM] = 40;
                }
                Tcount ++;
            }
        }
    }
}


task main()
{

    goforwards(10);
}

Для справки, это мои настройки Pragma:

#pragma config(I2C_Usage, I2C1, i2cSensors)
#pragma config(Sensor, dgtl2,  ,               sensorDigitalIn)
#pragma config(Sensor, dgtl7,  ,               sensorDigitalOut)
#pragma config(Sensor, I2C_1,  ,               sensorQuadEncoderOnI2CPort,    , AutoAssign )
#pragma config(Sensor, I2C_2,  ,               sensorQuadEncoderOnI2CPort,    , AutoAssign )
#pragma config(Motor,  port1,           RM,            tmotorVex393_HBridge, openLoop, reversed, encoderPort, I2C_2)
#pragma config(Motor,  port10,          LM,            tmotorVex393_HBridge, openLoop, encoderPort, I2C_1)

Когда я выполняю код, значения кодировщика робота очень близки, но робот перестает двигаться, когда они достигают 1000. Я думал, что код, который я написал, должен вернуть значения кодеров обратно в 0 после того, как они достигнут 1 тыс., И, следовательно, код следует повторить в цикле оболочки 10 раз (в этом случае). Что я сделал не так?

2 ответа

Решение

Вы обновляете Tcount в неправильном месте. Сделайте это только в конце внешнего цикла.

То, что вы написали сейчас, делает Tcount увеличивать каждый раз, когда он движется вперед. К тому времени он достигает 1000 шагов, Tcount уже 1000

Ваш times равно 10. Итак, `Tcount >= time, и он не будет снова входить во внешний цикл while.

Кажется, что переменная управления внутреннего цикла (т.е. nMotorEncoder[RM]) никогда не обновляется, это означает, что внутренний цикл будет повторяться вечно. То есть вы никогда не вернетесь к телу внешнего цикла

Другие вопросы по тегам