Страница 1 из 1

переменная в си , счетчик по кругу

Добавлено: Вс сен 03, 2017 15:18:39
sergeyiv
помогите осилить столь простую задачу
нужно по кругу пустить переменную ))
с 0 до 506 и так чтоб при переходе через 506 она возвращалась в ноль при инкременте, при декременте с 506 в ноль

Код: Выделить всё

         uint16_t  e;    
           if (e >= 506)
		{
			EncData=0;
		}
		
		if ( e < 0)
		{
			EncData = 0x03f5;
		}
                     e = enc;
код такого плана работает только в одно сторону , как сделать чтоб через ноль вернуться на 506
это кусок программы управление энкодером , задача: когда докручиваешь энкодер до 506 перепрыгнуть на ноль , а если в другую сторону крутить чтоб с нуля прыгнул на 506

переменной "e" присваивается значение энкодера

Re: переменная в си , счетчик по кругу

Добавлено: Вс сен 03, 2017 16:16:10
YS
Я бы написал

Код: Выделить всё

    e = e % 507;
или просто

Код: Выделить всё

if (e<0)
{
  e=506;
}

if (e>506)
{
  e=0;
}
Кстати, вы там проверяете беззнаковую переменную на то, что она меньше нуля. Это бессмысленно. :wink:

Re: переменная в си , счетчик по кругу

Добавлено: Вс сен 03, 2017 19:31:56
sergeyiv
Кстати, вы там проверяете беззнаковую переменную на то, что она меньше нуля. Это бессмысленно. :wink:

верное замечание , но я указал переменную в десятичном формате , если указываю в 16ричном , то у меня от нуля улетает в 0х7fff
и в моем примере проверяется переменная "e" которой присваивается значении из переменной "enc" , а "enc" возвращается из функции энкодера в которой есть переменная EncData
ее то мне и надо сбрасывать либо в 0 либо в максимальное значение 0x01fa
а так как все переменные видны , то условие выше не работает так как "e" получает значение EncData , отличия enc и EncData в том что EncData сдвинута на 1 (EncData<<1)

Код: Выделить всё


if (e >= 0x01fa)
		{
			EncData=0;
		}
		
		if ( e >= 0x7fff)
		{
			EncData = 0x03f4;
		}
e = enc

так пытается перескочить , но не стабильно , хочется какое то более изящное решение

Re: переменная в си , счетчик по кругу

Добавлено: Пн сен 04, 2017 04:50:10
Ivanoff-iv
вот возможные варианты - все подходят и для знаковых и для беззнаковых переменных счетчика т.к. сначала идет плюс, который должен вытянуть знак (если возможен большой декремент - можно добавлять и 2 и 3 периода...)
е=(е+507)%507; //так будет крутиться в обе стороны
или так:
е+=507; //если добавить период - ничего не собьётся
пока (е>=507) е-=507; //проверка выхода за верх. границу
при желании можно диапазон счетчика от 0 отодвинуть:
е+=507;
пока (е>=607) е-=507; //диапазон от 100 до 606.

Re: переменная в си , счетчик по кругу

Добавлено: Ср сен 06, 2017 00:23:32
sergeyiv
Спасибо !
помогло е=(е+507)%507;
четко работает !