По идее таймер должен зациклистя, но этого не происходит т.к надо вызвать ф-цию timer1_init(); или TCCR1B =0x01; //Старт таймера при делителе = 1024. По понятным причинам вставлять эти ф-ции в подпрограмму прерывания таймера я не могу.
Подаётся только управляющийй импульс , без 20мс периода после него.
2aesok:Или ваш вариант нерабочий, или я опять затупил :)
По идее таймер должен зациклистя, но этого не происходит т.к надо вызвать ф-цию timer1_init(); или TCCR1B =0x01; //Старт таймера при делителе = 1024. По понятным причинам вставлять эти ф-ции в подпрограмму прерывания таймера я не могу.
Подаётся только управляющийй импульс , без 20мс периода после него.
2aesok:Или ваш вариант нерабочий, или я опять затупил :)
У меня сейчас мало времени.
1. 2 правило програмирования микроконтроллеров: ВСЕ ПРЕРЕМЕННЫЕ КОТОРЫЕ ИСПОЛЬЗУЮТЬСЯ И В ОСНОВНОЙ ПРОГРАММЕ И ПРЕРЫВАНИЯХ ДОЛЖНЫ БЫТЬ ОБЯВЛЕННЫ С МОДИФИКАТОРОМ volatile.
volatile int gangle;//Управляющий импульс
2. Вызывайте timer1_init(); только один из раз main.
3. if(cur_state == 0) { //вывести '1' Вместо //вывести '1' должно быть управление пином к которому подключена серва.
#pragma interrupt_handler timer1_ovf_isr:9 void timer1_ovf_isr(void) { //TIMER1 has overflowed TCNT1H = 0xDC; //reload counter high value TCNT1L = 0x01; //reload counter low value }
//call this routine to initialize all peripherals void init_devices(void) { //stop errant interrupts until set up CLI(); //disable all interrupts port_init(); timer1_init();
1) ProjectWizard - When you first create a project , you use the Project Wizard to lead you through a series of dialog boxes in which you choose options for the MCU type, modules, functions and etc. of your project. AtmanAvr generates code automatically for you.
2) CodeWizard - The Code Wizard is like a programmer's assistant: it makes it easier for you to do certain routine tasks such as 1) creating new modules, 2) adding or deleting interrupt functions, and 3) seeing which modules or interrupt handlers are already defined and jumping to the handler program code.
Спасибо за пример, теперь трясет только первую серву ,остальные стоят ровно. С чем это может быть связано?
Кроме этого при управлении другими 7-ю сервами, к каждой последующей прибавляется ~0.25гр Чтоб было понятней приведу пример: 1.Подаю команду на первую серву. 2.Первая серва встаёт в положение +2.27, её дёргает в промежутке (+2.27..+2.48)
3.Подаю команду на вторую серву. 4.Вторая серва встаёт в положение +2.51, и там остаётся до следующей команды
5.Подаю команду на третью серву. 6.Третья серва встаёт в положение +2.75, и там остаётся до следующей команды
2AVR123.nm.ru: Задержку я переделал по вашему образцу(TCCR1B =0x02;TCNT1 =2201;)
Из-за чего это может быть? Если импульс 20мс точный, то почему накапливается ошибка в 0.25гр от серве к серве?
PS:Сервами я управляю ПОКА по ОДНОЙ(при подаче команды на следующую серву, предидущая ОСТАНАВЛИВАЕТСЯ)
Так, первую серву дергает потому что при запуске МК, таймер СРАЗУ выводит в PB0 единичку и начинает считать 20мс Почему именно PB0???
Интересно то, что делает он это параллельно с управлением остальными сервами, никак на них не влияя :D Логичный вывод---на одном таймере можно управлять несколькими сервами одновременно
На осциллографе сигнал такой формы(PB0): ______ _____ _____ | | | | | | |20мс |_|20мс |_|20мс |