[an error occurred while processing this directive]
По IARу.. Прерывания будь они неладны.
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
миниатюрный аудио-видеорекордер mAVR

Отправлено serdgik 11 июля 2002 г. 06:27

Многоуважаемые коллеги. Не могли бы вы прояснить следующую ситуацию?
Есть фрагмент программы грубо говоря сделана задержка на таймере:
...........
#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