[uquote="ARV",url="/forum/viewtopic.php?p=4224321#p4224321"]проблема-то явно не в замене 16-бит на 8, 8-битная переменная не сможет до 900 добежать никак, только до 255.[/uquote]
счет вниз идет. Декремент.
Вот тот кусок кода:
Код: Выделить всё
if(count_bite > 15)
{
TCCR0B = 0x00;
TIFR0 |= (1<< OCF0A)|(1 << OCF0B);
TCCR0A &= ~(1 << WGM01);
OCR0A = 0x00;
TIMSK0 = 0x00;
TCNT0 = 0x00;
OCR0B = 0x25; // 500Hz 0x25 для тактов
TIMSK0 |= (1 << OCIE0B);
steps = STEP;
if(buffer == COMMAND_OPEN)
{
if(PORTB_RD(RVRS)) PORTB_ON(INA); else PORTB_OFF(INA); // реверс включен или нет
PORTB |= 0x02; TCCR0B |= (1 << CS02)|(0<< CS01)|(1<< CS00); // EN1 ON, EN2 OFF
} else
{
if(buffer == COMMAND_CLOSE)
{
if(PORTB_RD(RVRS)) PORTB_OFF(INA); else PORTB_ON(INA); // реверс включен или нет
PORTB |= 0x04; TCCR0B |=(1 << CS02)|(0<< CS01)|(1<< CS00); // EN1 OFF, EN2 ON
} else steps = 0; // для перехода к сбросу
}
while (steps){} // висим в цикле пока не отщелкаются все шаги
TCCR0B = 0x00;
TIFR0 |= (1<< OCF0A)|(1 << OCF0B);
TIMSK0 = 0x00;
PORTB &= ~0x19; // ~(1 << INA)|(1 << EN1)|(1 << EN2)
flag = RST;
}
строка while (steps){} . В протеусе слежу за значением steps в окне
переменная steps глобальная volatile uint16_t steps = STEP; Ей присваивается значение STEP = 1162. В прерывании таймера step декрементируется:
Код: Выделить всё
ISR(TIM0_COMPB_vect)
{
PORTB ^= (1 << EN1)|(1 << EN2);
if(!i) {PORTB_XOR(INA); i = 2;} else;
i--;
--steps;
TCNT0 = 0;
}
в дизасемблере присвоение значения выглядит так (1162 = 0x048A):
Код: Выделить всё
steps = STEP;
000000CD LDI R20,0x8A Load immediate
--- D:\FIRMWARE\ATMEL\Jalousie_NEW\Driver\Driver\Debug/.././main.c -------------
000000CE LDI R21,0x04 Load immediate
00000143 STS 0x0062,R21 Store direct to data space
00000145 STS 0x0061,R20 Store direct to data space
а декремент в прерывании уже так:
Код: Выделить всё
--steps;
0000003F LDS R24,0x0061 Load direct from data space
00000041 LDS R25,0x0062 Load direct from data space
00000043 SBIW R24,0x01 Subtract immediate from word
00000044 STS 0x0062,R25 Store direct to data space
00000046 STS 0x0061,R24 Store direct to data space
и, если я правильно понимаю, как-то так цикл while (steps){}
Код: Выделить всё
00000163 STS 0x0062,R1 Store direct to data space
00000165 STS 0x0061,R1 Store direct to data space
00000167 LDS R24,0x0061 Load direct from data space
00000169 LDS R25,0x0062 Load direct from data space
0000016B OR R24,R25 Logical OR
0000016C BRNE PC-0x05 Branch if not equal
вроде как и все правильно

Может это глюк протеуса?
Только почему Студия последовательно два значения в один регистр пихает?
00000163 STS 0x0062,R1 Store direct to data space
00000165 STS 0x0061,R1 Store direct to data space
типа 16-ти разрядное значение загрузили:
Синтаксис: Операнды: Счётчик команд:
(i) STS k16, Rr 0 ≤ r ≤ 31, 0 ≤ k ≤ 65535 PC ← PC + 2
Добавлено after 1 hour 23 minutes 58 seconds:
[uquote="GoldenAndy",url="/forum/viewtopic.php?p=4224245#p4224245"]
Land, запустите на выполнение в симуляторе студии. поставте бряк в проблемном месте и покажите нам сишный код и дизасм этого места.
ЗЫ. Возможно, дизасм вам даже без нас ответ даст, 16 бит там или 8.[/uquote]
А в Студии все работает

С 950 шагов до 890 прошел нормально. И кому верить? Протеусу или Студии?