по моему он проще, и прерывание в нем всего одно... только вот он что-то не работает, и я до сих пор не понял почему...
по моему он проще, и прерывание в нем всего одно... только вот он что-то не работает, и я до сих пор не понял почему...
Да, дествительно, результат остается в регистре ICR1, тогда тем более все должно нормально работать.Леонид Иванович писал(а): Не понял, при чем здесь длительность обработчика? Захват производится аппаратно, не важно, что в это время выполняется.
Ошибка есть и огромная, нет необходимости нагружать обработчик прерывания дополнительными процедурами, тем более вставлять в него бесконечный цикл:uwrtey писал(а): Теперь вместо обнуления таймера программа рассчитывает заданную длительность, но на серву приходит какая-то белиберда -( слишком длинный импульс )
я скорее всего допустил логическую ошибку, в добавленном коде, но найти ее я не могу..
в таком случае поможет только ресет до срабатывания захватаchannal_2: ; канал_2 ( сервопривод тангажа )
ldi Temp, 4 ; следующим будет СИНХРОИМПУЛЬС
sts ch_count, Temp
OUT OCR1BH,XH ; зададим длину импульса
OUT OCR1BL,XL ; и выведем ее в порт сравнения
no_out:
rjmp no_out ; зависание
;**************************************************************************************************************
; Выход из прерывания
;**************************************************************************************************************
out_1:
pop temp4 ; извлекаем "SREG" ////////////////////////////////////////////////////
out SREG, temp4
RETI ; точка выхода из прерывания
это зависание я сделал умышлено, для того что бы единожды вывести на сервопривод управляющий импульс ... ( для отладки - так сказать.... )zero648 писал(а): Ошибка есть и огромная, нет необходимости нагружать обработчик прерывания дополнительными процедурами, тем более вставлять в него бесконечный цикл
а вот над этим нужно подумать...zero648 писал(а):Нужно в обработчике рассчитать только длину принятого импульса, все остальное выкинуть в главный цикл.
Код: Выделить всё
bolshe_2:
SUB XL, ZL ; вычисляем длительность импульса
SBC XH, ZL ; длительность канала находится в "Х"
rjmp prodolzaem ;
Код: Выделить всё
bolshe_2:
SUB XL, ZL ; вычисляем длительность импульса
SBC XH, ZH ; длительность канала находится в "Х"
rjmp prodolzaem ;Нет, не должно. Выше я уже приводил пример кода с необходимой коррекцией.zero648 писал(а):тогда тем более все должно нормально работать.
Я снизил частоту ШИМа до 61 герца и дрожание сервопривода прекратилось. Интересно какая тут взаимосвязь была ?uwrtey писал(а):Теперь сервопривод исполняет команды передатчика, но при этом дорожит, как волчий хвост на морозе...