Технический форум по робототехнике.
avr123.nm.ru » 20 сен 2011, 21:32
вот асм, вроде верный. PE5 обнуляется.
- Вложения
-
- code.png (8.46 КиБ) Просмотров: 1873
Korbofos » 20 сен 2011, 21:43
Этот бит сбрасывает ножку в 0 (1<<FOC3C);
Для создания такого сигнала на картинке.
А что за сдвиг в 0х20?
- Вложения
-
avr123.nm.ru » 20 сен 2011, 21:45
Korbofos писал(а):Почему то не срабатывает сброс ножки в 0??????
- Код: Выделить всё • Развернуть
TCCR3C|=(1<<FOC3C);
Не пойму почему это должно сбрасывать ножку в ноль и какую ножку ?
По симуляции в PROTEUS изменение ноги PE5 уже происходит в самом начале прерывания.
Если вам надо именно сбрасывать дак так и пишите в нее "0".
Последний раз редактировалось
avr123.nm.ru 20 сен 2011, 21:50, всего редактировалось 1 раз.
Korbofos » 20 сен 2011, 21:49
Да PE5 в ноль.
avr123.nm.ru » 20 сен 2011, 21:55
Хотя код АСМ есть н ов PROTEUS бит FOC3C не становится "1". Либо ПРОТЕУС не прав ( преверьте в симуляторе AVR studio? можно выкинуть все из проги только этот код проверить).
либо надо читать даташит и возможно этот бит ставится как-то хитрее.
вот что написано в даташите - когда эти биты работают, надо проверить что WGM не в режиме ШИМ
- Вложения
-
Korbofos » 20 сен 2011, 22:06
Режим Normal стоит. Полезу в AVR studio.
avr123.nm.ru » 20 сен 2011, 22:11
Да WGM все нули. В студии посмотрите. Но это симулячция. А CVAVR асм код записи 1 в этот бит скомпилил. В железе должно работать.
По методу отладки программы через UART в задаче 4 курса по AVR -
www.proavr.narod.ru/z4.htm вы можете вставить после этой строки вывод этого регистра в UART
псевдокод:
UDR = регистр;
пауза (1 секунда например);
и на терминале на ПК посмотреть что в регистре в реальном AVR получается.
Korbofos » 20 сен 2011, 22:22
В Avr студии тоже самое, ножка не сбрасывается.
Есть ещё пару мыслей, (программатора с собой нет)завтра дома попробую.
Спасибо Авр123!
avr123.nm.ru » 20 сен 2011, 22:28
Я в студии 4.18 посмотрел.
1) бит FOC3C в студии ставится в "1" (т.е. PROTEUS ошибается в симуляции, интересно VMLAB посмотреть)
2) ножка PE5 как и весь порт становятся нулем еще до этой строки, я ставил брэйкпоинт в самом начале прерывания и по приходу на нее весть порт Е уже ноль, в PROTEUS точно так же.
Однако в начале прерывания только переменные и не понятно может он и выполняет уже строку, надо в начале прерывания воткнуть несколько NOP или лишенных смысла действий на время отладки, чтоб было на что брэйкпоинты поставить
Korbofos » 20 сен 2011, 22:39
У меня тоже студия 4.18.
Поставил TCCR3C|=(1<<FOC3C); в конец прерывания.
Но у меня ножка не обнуляется.
avr123.nm.ru » 21 сен 2011, 08:19
Не понимаю про какую ножку вы пишите, я указал конкретно ПЕ5 и весь порт Е обнуляется еще ДО этого кода и в студии и в потеусе.
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 спасибо вам за помощь!
avr123.nm.ru » 21 сен 2011, 16:48
Прошу вас выложить проект для народа по окончании отладки.
Korbofos » 21 сен 2011, 18:54
Хорошо обязательно выложу!
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]);
}
Где здесь подвох?