roboforum.ru

Технический форум по робототехнике.

 

Управление сервами

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Re: Управление сервами

Сообщение avr123.nm.ru » 20 сен 2011, 21:32

вот асм, вроде верный. PE5 обнуляется.
Вложения
code.png
code.png (8.46 КиБ) Просмотров: 662
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14200
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: Управление сервами

Сообщение Korbofos » 20 сен 2011, 21:43

Этот бит сбрасывает ножку в 0 (1<<FOC3C);
Для создания такого сигнала на картинке.
А что за сдвиг в 0х20?
Вложения
222.JPG
РАБОТА, РАБОТА перейди на Федота, с Федота на его брата, а ко мне их зарплата.
Аватара пользователя
Korbofos
 
Сообщения: 296
Зарегистрирован: 15 янв 2011, 11:27
Откуда: Челябинск
прог. языки: C/C++
ФИО: Александр

Re: Управление сервами

Сообщение avr123.nm.ru » 20 сен 2011, 21:45

Korbofos писал(а):Почему то не срабатывает сброс ножки в 0??????
Код: Выделить всёРазвернуть
TCCR3C|=(1<<FOC3C);


Не пойму почему это должно сбрасывать ножку в ноль и какую ножку ?

По симуляции в PROTEUS изменение ноги PE5 уже происходит в самом начале прерывания.

Если вам надо именно сбрасывать дак так и пишите в нее "0".
Последний раз редактировалось avr123.nm.ru 20 сен 2011, 21:50, всего редактировалось 1 раз.
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14200
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: Управление сервами

Сообщение Korbofos » 20 сен 2011, 21:49

Да PE5 в ноль.
РАБОТА, РАБОТА перейди на Федота, с Федота на его брата, а ко мне их зарплата.
Аватара пользователя
Korbofos
 
Сообщения: 296
Зарегистрирован: 15 янв 2011, 11:27
Откуда: Челябинск
прог. языки: C/C++
ФИО: Александр

Re: Управление сервами

Сообщение avr123.nm.ru » 20 сен 2011, 21:55

Хотя код АСМ есть н ов PROTEUS бит FOC3C не становится "1". Либо ПРОТЕУС не прав ( преверьте в симуляторе AVR studio? можно выкинуть все из проги только этот код проверить).

либо надо читать даташит и возможно этот бит ставится как-то хитрее.

вот что написано в даташите - когда эти биты работают, надо проверить что WGM не в режиме ШИМ
Вложения
ds.png
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14200
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: Управление сервами

Сообщение Korbofos » 20 сен 2011, 22:06

Режим Normal стоит. Полезу в AVR studio.
РАБОТА, РАБОТА перейди на Федота, с Федота на его брата, а ко мне их зарплата.
Аватара пользователя
Korbofos
 
Сообщения: 296
Зарегистрирован: 15 янв 2011, 11:27
Откуда: Челябинск
прог. языки: C/C++
ФИО: Александр

Re: Управление сервами

Сообщение avr123.nm.ru » 20 сен 2011, 22:11

Да WGM все нули. В студии посмотрите. Но это симулячция. А CVAVR асм код записи 1 в этот бит скомпилил. В железе должно работать.

По методу отладки программы через UART в задаче 4 курса по AVR - www.proavr.narod.ru/z4.htm вы можете вставить после этой строки вывод этого регистра в UART

псевдокод:
UDR = регистр;
пауза (1 секунда например);

и на терминале на ПК посмотреть что в регистре в реальном AVR получается.
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14200
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: Управление сервами

Сообщение Korbofos » 20 сен 2011, 22:22

В Avr студии тоже самое, ножка не сбрасывается.
Есть ещё пару мыслей, (программатора с собой нет)завтра дома попробую.
Спасибо Авр123!
РАБОТА, РАБОТА перейди на Федота, с Федота на его брата, а ко мне их зарплата.
Аватара пользователя
Korbofos
 
Сообщения: 296
Зарегистрирован: 15 янв 2011, 11:27
Откуда: Челябинск
прог. языки: C/C++
ФИО: Александр

Re: Управление сервами

Сообщение avr123.nm.ru » 20 сен 2011, 22:28

Я в студии 4.18 посмотрел.

1) бит FOC3C в студии ставится в "1" (т.е. PROTEUS ошибается в симуляции, интересно VMLAB посмотреть)

2) ножка PE5 как и весь порт становятся нулем еще до этой строки, я ставил брэйкпоинт в самом начале прерывания и по приходу на нее весть порт Е уже ноль, в PROTEUS точно так же.

Однако в начале прерывания только переменные и не понятно может он и выполняет уже строку, надо в начале прерывания воткнуть несколько NOP или лишенных смысла действий на время отладки, чтоб было на что брэйкпоинты поставить
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14200
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: Управление сервами

Сообщение Korbofos » 20 сен 2011, 22:39

У меня тоже студия 4.18.
Поставил TCCR3C|=(1<<FOC3C); в конец прерывания.
Но у меня ножка не обнуляется.
РАБОТА, РАБОТА перейди на Федота, с Федота на его брата, а ко мне их зарплата.
Аватара пользователя
Korbofos
 
Сообщения: 296
Зарегистрирован: 15 янв 2011, 11:27
Откуда: Челябинск
прог. языки: C/C++
ФИО: Александр

Re: Управление сервами

Сообщение avr123.nm.ru » 21 сен 2011, 08:19

Не понимаю про какую ножку вы пишите, я указал конкретно ПЕ5 и весь порт Е обнуляется еще ДО этого кода и в студии и в потеусе.
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14200
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: Управление сервами

Сообщение Korbofos » 21 сен 2011, 16:06

Ввёл переменную OCR33 и в железе всё пошло.
Только при старте сервы иногда занимают разную позицию.
Код: Выделить всёРазвернуть
interrupt [TIM3_COMPC] void timer3_compc_isr(void)
{
static char current_servo=1;
static unsigned int pause = 18432;
static unsigned int OCR33;
        if (current_servo == 9)
        {
         current_servo = 0;
         OCR33 += pause;
         OCR3C=OCR33;
         pause = 18432;
        }
        else
        {
         OCR33+=servo_position[current_servo];
         OCR3C=OCR33;
         pause -= servo_position[current_servo];
         current_servo++;
        }

   TCCR3C|=(1<<FOC3C);

}     

Авр123 спасибо вам за помощь!
РАБОТА, РАБОТА перейди на Федота, с Федота на его брата, а ко мне их зарплата.
Аватара пользователя
Korbofos
 
Сообщения: 296
Зарегистрирован: 15 янв 2011, 11:27
Откуда: Челябинск
прог. языки: C/C++
ФИО: Александр

Re: Управление сервами

Сообщение avr123.nm.ru » 21 сен 2011, 16:48

Прошу вас выложить проект для народа по окончании отладки.
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14200
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: Управление сервами

Сообщение Korbofos » 21 сен 2011, 18:54

Хорошо обязательно выложу!
РАБОТА, РАБОТА перейди на Федота, с Федота на его брата, а ко мне их зарплата.
Аватара пользователя
Korbofos
 
Сообщения: 296
Зарегистрирован: 15 янв 2011, 11:27
Откуда: Челябинск
прог. языки: C/C++
ФИО: Александр

Re: Управление сервами

Сообщение Korbofos » 29 сен 2011, 18:41

Проблема вот в чём по rs-232 отравляю три байтика. 1байт- номер функции мк(серва), 2байт- номер сервы, 3байт позиция.
Например отправляю: 4,1,210 - 1 серву в крайние положение
отправляю: 4,0,0. - отключить управление сервами.
отправляю: 4,1,210 - может начать "шорохоться" другая серва.
Да и вообще при каждом новом включении сервы встают в разные позиции.

Код: Выделить всёРазвернуть
unsigned char rx_buffer[3];
unsigned int servo_position[9]={1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382};//среднее положение для кварца 7.372800


interrupt [TIM3_COMPC] void timer3_compc_isr(void)
{
static char current_servo=1;
static unsigned int pause = 18432;
static unsigned int OCR33;
       
TCCR3C|=(1<<FOC3C);

if (current_servo == 9)
        {
         current_servo = 0;
         OCR33 += pause;
         OCR3C=OCR33;
         pause = 18432;
        }
        else
        {
         OCR33+=servo_position[current_servo];
         OCR3C=OCR33;
         pause -= servo_position[current_servo];
         current_servo++;
        }

}     



void servo (unsigned char servo, unsigned int pos)//передаю в функцию оба значения char
{
if ((servo&&pos)==0)
{
servo_off();
return;
}
else if(SERV==OFF){servo_on();}
if (servo>8){servo=8;}
if (servo<1){servo=1;}
if (pos<90){pos=90;}
if (pos>210){pos=210;}
servo_position[servo]=((pos*74/8)-6);   //Может здесь что нибудь не так с приведением                                                                                         
}                                       //типов?       


void servo_on (void)
{
DDRE|=((1<<DDE5)|(1<<DDE2));
PORTE&=~((1<<PORTE5)|(1<<PORTE2));
PORTE.2=1;
OCR3C=2000;
TCCR3A=0x04;
TCCR3B=0x02;
ETIMSK|=(1<<OCIE3C);
PORTE.2=0;
}

void servo_off (void)
{
DDRE&=~((1<<DDE5)|(1<<DDE2));
TCCR3A=0x00;
TCCR3B=0x00;
ETIMSK&=~(1<<OCIE3C);
}

void main(void)
{


servo(rx_buf[1],rx_buf[2]);

}


Где здесь подвох?
РАБОТА, РАБОТА перейди на Федота, с Федота на его брата, а ко мне их зарплата.
Аватара пользователя
Korbofos
 
Сообщения: 296
Зарегистрирован: 15 янв 2011, 11:27
Откуда: Челябинск
прог. языки: C/C++
ФИО: Александр

Пред.След.

Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: Yahoo [Bot] и гости: 6

Mail.ru counter