Технический форум по робототехнике.
MiBBiM » 25 авг 2011, 19:46
приоритет операции НЕ выше приоритета ИЛИ, сравните
- Код: Выделить всё • Развернуть
DDRB&=~(1<<DDB6)|(1<<DDB5);
DDRB&=~(((1<<DDB6)|(1<<DDB5)));
Korbofos » 10 окт 2011, 09:27
Почему этот код скомпелированный в авр студии, в железе работает отлично. А с кодевиженом какая-то еруда, сервы не встают в центр? У кодевижена своя математика

? Неохото в авр стидию переходить...
- Код: Выделить всё • Развернуть
{
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);
}
chinga » 10 окт 2011, 14:39
при компиляции выводит "Evaluation version code size limit exceeded!", это типа е компилируется, с free version? а есть ссылки на кряканный CVAVR? я смотрел тут, все выводят "not find".
Korbofos » 10 окт 2011, 18:20
Korbofos » 17 окт 2011, 20:57
Если мк тактируется от кварца в "конфигурации проекта" Cvavr надо какие то настройки менять?
- Вложения
-

chinga » 11 ноя 2011, 13:41
Здравствуйте.
у меня вот с CVAVR возникли проблемы.
написал программу что б Серво по градусам крутить
вот код
- Код: Выделить всё • Развернуть
void servo_grad(int grad){
int i=0; //180 = 2300
unsigned int time; //0 = 500
unsigned int time_s = 0; //grad = 1 * 10 +500
unsigned int time_u = 0;
time = grad*10+500;
time_s = 20000 - time;
if(time_s%1000 > 0 ){
time_u = time_s%1000;
time_s = time_s/1000;
}else{
time_s = time_s/1000;
time_u = 0;
}
for(i = 0; i<100; i++){
PORTC.0 = 1;
delay_us(time);
PORTC.0 = 0;
delay_ms(time_s);
delay_us(time_u);
}
}
вот здесь
- Код: Выделить всё • Развернуть
delay_us(time*1);
и здесь
- Код: Выделить всё • Развернуть
delay_us(time_u);
ошибку выдает: Error: C:\Users\NI\Desktop\cvavr_proj\SERVO_test1\a.c(37): constant integral expression required
в чем проблема? если некое число поставить, то нормально, но мне надо в зависимости от градуса крутить ее
chinga » 13 ноя 2011, 14:17
а как можно еще управлять сервой?
Korbofos » 13 ноя 2011, 14:47
chinga » 19 ноя 2011, 14:36
извините, еще такой вопрос, как вывести значение float?
- Код: Выделить всё • Развернуть
float = c;
int k = 1;
c = (float)k*0.33;
printf("%f \r\n\0", c);
k++;
delay_ms(2000);
у меня на терминале выводит 2f и все, хотя с меняется.
Добавлено спустя 2 часа 34 минуты 34 секунды:а как установить? не получается, все же как некоммерческий работает.
Korbofos » 04 апр 2012, 18:54
Подскажите красиво ли переходить в прерывании в функцию
- Код: Выделить всё • Развернуть
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
emergency_stop_count++;
if(emergency_stop_count>30)
{
motors_off();
}
}
void motors_off (void)
{
TCCR1A=0x00;
TCCR1B=0x00;
PORTB&=~((1<<PORTB6)|(1<<PORTB7));
PORTC&=~((1<<PORTC7)|(1<<PORTC6));
DDRB&=~((1<<DDB6)|(1<<DDB5));
DDRC&=~((1<<DDC7)|(1<<DDC6));
TCCR2=0x00;
TIMSK&=~(1<<TOIE2);
}
Или лучше содержимое функции motors_off переместить в само прерывание?
boez » 05 апр 2012, 10:45
Красиво. Но долго

Если в прерывании нет вызовов функций - компилятор сохраняет в стеке только те регистры, которые реально используются. А вот если есть - то все, которые по соглашению о вызовах функций могут портиться внутри функции. А их там больше десятка вроде. Поэтому лучше в прерываниях пользоваться макросами или inline-функциями.
Korbofos » 07 июн 2013, 09:57
Подскажите почему CV приемлет Булеву переменную только так
- Код: Выделить всё • Развернуть
_Bool
,а так
- Код: Выделить всё • Развернуть
bool
выдаёт ошибку

Romikgy » 07 июн 2013, 11:26
#define bool _Bool
RoboHobbyRu » 07 июн 2013, 13:22
Korbofos, если речь идёт о типе переменной, такого типа в стандарте Си нет, вот они и, видимо, решили добавить этот тип, но "с оговоркой"
Korbofos » 24 июн 2013, 02:44
Ещё небольшой вопрос. Что будет если в основном цикле изменяем значение переменной или регистра, и в этот момент попытаемся изменить значение этой переменной в прерывании?