ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
21 июля
41423
_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 }