Многозадачность таймера

Обсуждаем контроллеры компании Atmel.
Ответить
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Сообщение uwrtey »

А что скажете про вариант который я сделал? ( с помощью сравнения )
по моему он проще, и прерывание в нем всего одно...
2002.txt
(12.94 КБ) 156 скачиваний
только вот он что-то не работает, и я до сих пор не понял почему... :cry:
не зная броду не лезь к вольтмоду
Реклама
cbb
Открыл глаза
Аватара пользователя
Сообщения: 45
Зарегистрирован: Вт мар 29, 2011 12:48:46

Сообщение cbb »

в авиамоделизме главное -- вес. Проще взять готовый, они ж мизерные и лёгкие, дешевые и вполне надёжные. Стандартные пары кварцев легко решают вопрос смены канала.
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Сообщение uwrtey »

Готовое - у меня есть, тут речь о том, что я учусь программировать. :))
не зная броду не лезь к вольтмоду
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Может это поможет. Выбран режим CTC и задействованы прерывания OC1A OC1B, если захват случился в момент обработки OC1A добавляется 1 в регистр R3 и имеющая вес 40'000. Т.е. расчет длительности нужно проводить с учетом состояния R3:XH:XL. Результат работы выведен на PB3 и PB4.
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Сообщение uwrtey »

это лишнее..
программа вроде должна работать и так...

сразу предупрежу - эта программа пока-что работает только единожды ( в стадии разработки - так сказать ) : отправляет на серву заданный импульс и повисает в бесконечном цикле.

по крайней мере, когда я обнулял таймер при входе в прерывание - она работала, но этот вариант меня не устраивал, так как сбивалась генерация ШИМа запущенного на этом же таймере. Теперь вместо обнуления таймера программа рассчитывает заданную длительность, но на серву приходит какая-то белиберда -( слишком длинный импульс )
я скорее всего допустил логическую ошибку, в добавленном коде, но найти ее я не могу.. :(
не зная броду не лезь к вольтмоду
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

Леонид Иванович писал(а): Не понял, при чем здесь длительность обработчика? Захват производится аппаратно, не важно, что в это время выполняется.
Да, дествительно, результат остается в регистре ICR1, тогда тем более все должно нормально работать.
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

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 ; точка выхода из прерывания
в таком случае поможет только ресет до срабатывания захвата

Нужно в обработчике расчитать только длину принятого импульса, все остальное выкинуть в главный цикл.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Сообщение uwrtey »

zero648 писал(а): Ошибка есть и огромная, нет необходимости нагружать обработчик прерывания дополнительными процедурами, тем более вставлять в него бесконечный цикл
это зависание я сделал умышлено, для того что бы единожды вывести на сервопривод управляющий импульс ... ( для отладки - так сказать.... )
zero648 писал(а):Нужно в обработчике рассчитать только длину принятого импульса, все остальное выкинуть в главный цикл.
а вот над этим нужно подумать...
не зная броду не лезь к вольтмоду
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Сообщение uwrtey »

о-о, нашел еще одну ошибку

Код: Выделить всё


bolshe_2:


	SUB XL, ZL			; вычисляем длительность импульса
	SBC XH, ZL			; длительность канала находится в "Х"

	rjmp prodolzaem			; 
а должно быть

Код: Выделить всё

bolshe_2:


	SUB XL, ZL			; вычисляем длительность импульса
	SBC XH, ZH			; длительность канала находится в "Х"

	rjmp prodolzaem			;
не зная броду не лезь к вольтмоду
Друг Кота
Аватара пользователя
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск

Сообщение Леонид Иванович »

zero648 писал(а):тогда тем более все должно нормально работать.
Нет, не должно. Выше я уже приводил пример кода с необходимой коррекцией.
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Сообщение uwrtey »

ура! заработало! :beer:
Осталось добавить обработку двух первых каналов...
// там не все так просто - их еще микшировать нужно, но заготовка у меня уже есть.... :)
Спасибо ОГРОМНОЕ, Мужики! :beer:
не зная броду не лезь к вольтмоду
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Сообщение uwrtey »

Всем снова привет.
У меня возникла новая проблема. По идее нужно создать новую тему, так как проблема не имеет ни какого отношения к таймеру.
Если нужно, что-бы я создал новую тему - то создам новую...

Я добавил в программу управление моторами. ( полностью собрал программу и решил ее проверить )
Подключил моторы и разочаровался: ни моторы ни сервопривод тангажа не исполняют команды!
Я уж подумал, что допустил ошибку, когда добавлял управление моторами....
Но не тут-то было. Я просто отключил моторы и сервопривод тангажа стал выполнять команды с передатчика.
Не понимаю, как моторы могут повлиять на работу программы? // надо проверить не просаживают ли они напряжение ...

ПС ключевые транзисторы такие http://pdf.datasheetcatalog.com/datashe ... rf540n.pdf
Вложения
попытка_1.txt
(20.24 КБ) 159 скачиваний
приемник_1.gif
(21.34 КБ) 321 скачивание
не зная броду не лезь к вольтмоду
Друг Кота
Аватара пользователя
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск

Сообщение Леонид Иванович »

Смотрите питание и разводку земли. Для проверки можно попробовать запитать моторы от отдельного источника.
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Сообщение uwrtey »

Для того, что-бы исключить влияние помех от индуктивной нагрузки, вместо моторов я включил лампы накаливания. А также в цепь их питания я включил диоды.
Теперь сервопривод исполняет команды передатчика, но при этом дорожит, как волчий хвост на морозе...
Сами же лампы накаливания работают странным образом: одна из них постоянно потухшая, а вторая мигает хаотичным образом.

Я Подозреваю, что программная ошибка все же есть ( у меня еще ни разу не обходилось без ошибок )
Но так-же подозреваю, что есть ошибка в схемотехнике. Может тут нужно какой-то драйвер использовать? или гальванически развязать цепь нужно ?

Вот нашел первую программную ошибку: частота ШИМа организованного на таймере_0 слишком велика ~ 7,8 Килогерца....
многовато наверно для такого транзистора....

Кстати, транзисторы у меня Б.У. - возможно - они не рабочие... :(

ПС - раздельное питание я еще не пробовал.
не зная броду не лезь к вольтмоду
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Сообщение uwrtey »

uwrtey писал(а):Теперь сервопривод исполняет команды передатчика, но при этом дорожит, как волчий хвост на морозе...
Я снизил частоту ШИМа до 61 герца и дрожание сервопривода прекратилось. Интересно какая тут взаимосвязь была ?
Остальные проблемы пока остались - решаю...

Транзисторы проверил - они рабочие... ( хотя, я их уже скорее всего проверял... )
не зная броду не лезь к вольтмоду
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Сообщение uwrtey »

В данный момент борюсь с еще одним непонятным глюком.

Напоминаю, что вместо моторов у меня включены лампы накаливания ( это что бы исключить возможные помехи с моторов )

У меня, при старте приемника, ( когда еще не включен передатчик и в приемнике не случилось ни одного прерывания ) на лампы должен выводится ШИМ с импульсом равным нулю
( то-есть лампы не должны светить )
А на самом деле лампы горят в полный накал.
Настройки Таймера_0 в полном порядке. ( для проверки я урезал программу, что-бы проверить ШИМ на таймере_0. И у меня все работало... )

Вот я и не могу понять, как так происходит, что приемник стартует и лампы сразу же зажигаются.
Правда я не смотрел осциллограмму ШИМа, который выводится на моторы ( на лампы в данном случае ), но я уверен, что там белиберда...
Ох, чувствую я, что тут не только программная ошибка....
Такое ощущение, что эти два аппаратных ШИМа ( на таймере_0 и на таймере_1 ) как-то связаны друг с другом и как то друг на друга влияют....
Вложения
попытка_2 - копия.txt
(20.45 КБ) 144 скачивания
не зная броду не лезь к вольтмоду
Ответить

Вернуться в «AVR»