_igor_U_ (13.10.2005 12:40, просмотров: 1555)
Скоро свихнусь. Не понимаю в чем дело. Помогите. Задача - при изменении входа с 1 на 0 в течении секунды выдавать на выход определенное значение, через секунду его изменить и выдавать пока на входе 0.
В программе опрашивается состояние входа, если он изменяется, то выставляется флаг ValveFirstFlags.Change. ValveFirstFlags.In - состояние входа. Если ValveFirstFlags.On=1, то значит на выход выдается значение, т.е. секундный импульс уже был запущен. WaitFull - секундная задержка. OtlUp(), OtlDown(), Otl2Up(), Otl2Down() - отладочное дерганье ножками.
Что я вижу по Otl'ам: часть программы когда ValveFirstFlags.Change==1 выполняется как ей и положено единожды при изменении состояния входа. Часть программы когда ValveFirstFlags.Full==1 выполняется постоянно пока вход равен 0. Почему это происходит не понимаю. По идее после 100 выполнений этого куска флаг ValveFirstFlags.Full должен сбросится. Получается, что этого не происходит. В конце письма я приведу ассемблерный листинг этого куска. В ассемблерном листинге проверял адрес WaitFull 0x00D5 - больше нигде не используется. Проверял также возможность ошибочного изменения флагов - тоже не нашел. WaitFull изменял как со 100 уменьшением до 0, или до числа большего 100, так и увеличением от 0 до 100 с проверкой - больше 100.
Память кода используется на 35%, данных на 18%. Компилирую под WinAvr. Контроллер - mega8.
Крыша потихоньку едет.
if(ValveFirstFlags.Change==1)
{
OtlUp();
ValveFirstFlags.Change=0;
if (ValveFirstFlags.In==0)
{
if (ValveFirstFlags.On==0)
{
ValveFirstFlags.Full=1;
ValveFirstFlags.On=1;
WaitFull=100;
}
}
else
{
ValveFirstFlags.Full=0;
ValveFirstFlags.On=0;
}
OtlDown();
}
else
{
if (ValveFirstFlags.Full==1)
{
Otl2Up();
--WaitFull;
if (WaitFull==0)
{
ValveFirstFlags.Full=0;
}
Otl2Down();
}
}
Ассемблерный листинг:
в r13 я проверял на самом деле загружен ValveFirstFlags, эти флаги в прерываниях не используются, поэтому случайное повреждение этого значения сомнительно.
if (ValveFirstFlags.Full==1)
a50: d4 fe sbrs r13, 4
a52: 0d c0 rjmp .+26 ; 0xa6e
{
Otl2Up();
a54: 94 9a sbi 0x12, 4 ; 18
--WaitFull;
a56: 80 91 d5 00 lds r24, 0x00D5
a5a: 81 50 subi r24, 0x01 ; 1
a5c: 80 93 d5 00 sts 0x00D5, r24
if (WaitFull==0)
a60: 88 23 and r24, r24
a62: 21 f4 brne .+8 ; 0xa6c
{
ValveFirstFlags.Full=0;
a64: 5f ee ldi r21, 0xEF ; 239
a66: d5 22 and r13, r21
a68: d0 92 84 00 sts 0x0084, r13
}
Otl2Down();
a6c: 94 98 cbi 0x12, 4 ; 18
a6e: 80 91 84 00 lds r24, 0x0084
}