[an error occurred while processing this directive]
|
Многоуважаемые коллеги. Не могли бы вы прояснить следующую ситуацию?
Есть фрагмент программы грубо говоря сделана задержка на таймере:
...........
#pragma vector=TIMER0_OVF0_vect
__interrupt void TIMER0_INTF0_vector(void)
{
TCNT0=0xc1;
i++;
TCCR0=0x02;
}
void main(void)
{.....
....
_sei;
do
if (i>3) break;
while (1);
......
}
Так вот... После вызова прерывания программа из цикла вываливается!
то есть не производится проверка условия. Из дизассемлирования стало видно, что вызов прерывания происходит на brns что при возврате вызывает пропуск команды и выход из цикла или не происходит выполнение команды cpi а прерывание не сохраняет регистр статуса, то бишь флаг С изменяет свое состояние. Естесственно чем длиннее цикл тем меньше шанс попасть на это место, но при коротком цикле вероятность сбоя возрастает.
Так же не помогают способы
do {} while(i<3) и т.п
Как грамотно сделать прерывания? подскажите.. А то я снова сел за ассемблер..
Или чего то я запутался или пропустил? Поругайтесь хоть...
E-mail: info@telesys.ru