роботы робототехника микроконтроллеры


 Страниц (17): « 1 2 3 4 [5] 6 7 8 9 ... » В конец    

> Без описания
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



а вот вопрос: nop-ов в цикл насувать - не применяется в Си?
 
 Top
mihail Post Id



Гуру


Сообщений всего: 1065
Дата рег-ции: Март 2010  



nop - ассемблерная команда предписывающая микроконтроллеру один такт ничего не делать.

Код на ассемблере включают в программы на C если не могут что то сделать иначе Ухмылка или нужно быстрое выполнение программы.

Применительно к CVAVR это может выглядеть так
CODE:

#asm("nop")

(Добавление)
В CVAVR общее разрешение прерываний делается так
CODE:

#asm("sei")

Насколько мне известно, по другому не получится Ухмылка
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



mihail, вот и интересно, как компилятор цикл с одним только нопом откомпилит при разных оптимизациях.
 
 Top
mihail Post Id



Гуру


Сообщений всего: 1065
Дата рег-ции: Март 2010  



nest пишет:
как компилятор цикл с одним только нопом откомпилит

Проверил Ухмылка

CVAVR 2.04.8a (стандартные параметры)
CODE:

for (k=0; k<20; k++)
{
#asm("nop")
}

не удаляет при оптимизации.

А вообще, смотреть надо в конкретной ситуации. Цикл, который по мнению компилятора не нужен, компилятор запросто может выбросить из программы при компиляции.

(Добавление)

zatmenie, вот еще код для Вашего робота придумал Улыбка
CODE:

/*****************************************************
Chip type : ATtiny2313
Clock frequency : 4,433619 MHz
Memory model : Tiny
External SRAM size : 0
Data Stack size : 32
*****************************************************/

#include <tiny2313.h>
#include <stdlib.h>

void wait0 (void)
{
TCNT0=0;
while (TCNT0<22) {};
}

/* код ниже меня немного смущает, однако, если все работает как надо, ну и ладненько */
// Возможные режимы движения
enum {STOP, F, B};
//------------------------------ -------------------------------- ----------------
// Включение комбинации моторов для движения в заданном направлении
//------------------------------ -------------------------------- ----------------
void go(unsigned char direction)
{

switch (direction)
{
case STOP:
PORTB.0=0;
PORTB.1=0;
break;

case F:
PORTB.0=1;
PORTB.1=0;
break;

case B:
PORTB.0=0;
PORTB.1=1;
break;
}

}


void main(void)
{

int mood = 40;

// Input/Output Ports initialization
// Port A initialization
// Func2=In Func1=In Func0=In
// State2=P State1=P State0=P
PORTA=0x07;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=P State6=P State5=P State4=0 State3=0 State2=0 State1=0 State0=0
PORTB=0xE0;
DDRB=0x1F;

// Port D initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=P State5=P State4=P State3=P State2=P State1=P State0=P
PORTD=0x7F;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 4,330 kHz
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x05;
TCNT0=0x16;
OCR0A=0x00;
OCR0B=0x00;


while(1)
{

wait0(); /* можно заменить стандартной функцией задержки */

if(PIND.0==0)
{
mood = mood + 1;
go(F);
}
else
{
mood = mood - 1;
go(B);
}

/* проверка достижения переменной mood предельных значений */
if( mood > 99 ) { mood = 75; }
if( mood < 1 ) { mood = 25; }

/* плохое настроение, светодиод красный */
if( mood < 30 )
{
PORTB.2=1;
PORTB.3=0;
PORTB.4=0;
}

/* среднее настроение, светодиод оранжевый/желтый */
if( mood > 30 && mood < 60 )
{
PORTB.2=0;
PORTB.3=1;
PORTB.4=0;
}

/* хорошее настроение, светодиод зелененький */
if( mood > 60 )
{
PORTB.2=0;
PORTB.3=0;
PORTB.4=1;
}

}

}

(Отредактировано автором: 13 Июля, 2010 - 00:29:16)

 
 Top
zatmenie Post Id



Генерал


Сообщений всего: 97
Дата рег-ции: Май 2009  



mihail пишет:
zatmenie, вот еще код для Вашего робота придумал

Мне с таймером идея нравится, а как вообще нужно настраивать таймеры? НАПРИМЕР 8-ми битный? Какую максимальную задержку он может создать? Ну и вообще как и что делать?
(Добавление)
Что такое Mode? Outp.A? Outp.B? и т.д
(Добавление)
nest пишет:
zatmenie, а что вам мешает использовать стандартные функции задержки ?
я не хочу их использовать потому что робота буду постепенно модернизировать а стандартные функции занимают весь микроконтроллер что в будущем может мешать
(Добавление)
А можно создать несколько функций WHILE что бы каждая отвечала за что то своё. например while1 отвечает за движение, while2 отвечает за настроение, while3 еще а что то и т.д., но при этом что бы они работали параллельно а не одна после другой?
Прикреплено изображение
2010-07-13_204753.png

 
 Top
cjA Post Id



Генерал


Сообщений всего: 3291
Дата рег-ции: Янв. 2010  



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

и понимания
case STOP:

что такое STOP? откуда берется? ну и тд

(Отредактировано автором: 13 Июля, 2010 - 21:50:57)

 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



zatmenie пишет:
nest пишет:
zatmenie, а что вам мешает использовать стандартные функции задержки ?
я не хочу их использовать потому что робота буду постепенно модернизировать а стандартные функции занимают весь микроконтроллер что в будущем может мешать
тогда переходите сразу на асм. Там каждый байт в ваших личных руках.
 
 Top
mihail Post Id



Гуру


Сообщений всего: 1065
Дата рег-ции: Март 2010  



zatmenie пишет:
А можно создать несколько функций WHILE что бы каждая отвечала за что то своё. например while1 отвечает за движение, while2 отвечает за настроение, while3 еще а что то и т.д., но при этом что бы они работали параллельно а не одна после другой?

Насколько мне известно, параллельное выполнение программ на микроконтроллерах ATmega/ATtiny невозможно. В основной функции main() {} может быть только один бесконечный цикл while(1) {}.
zatmenie пишет:
Что такое Mode? Outp.A? Outp.B? и т.д

Я как то книжечку одну видел Ухмылка В качестве учебника C или ассемблера она не очень, но там есть ответы на многие Ваши вопросы. Там есть перевод datasheet ATtiny2313 и описаны ассемблерные команды на русском языке!
Белов А. В. Самоучитель разработчика устройств на микроконтроллерах AVR. - СПб.: Наука и Техника, 2008. - 544с.
 
 Top
cjA Post Id



Генерал


Сообщений всего: 3291
Дата рег-ции: Янв. 2010  



по большому счету оно нигде невозможно. один независимый процесс- один независимый процессор Улыбка
можно подцепить несколько внешних таймеров чтобы прерывание вызывали и обработчики движения , настроение. Но это конечно не while должны быть, а просто процедуры.
(внутренних таймеров там кажется два плюс основной while (1)- вот уже три задачи "параллельных"Подмигивающий
 
 Top
Vaspit Post Id



Полковник


Сообщений всего: 70
Дата рег-ции: Июль 2010  



Люди, помогите, не могу понять где ошибся (то ли в коде, то ли в подключении). У меня такая система: к плате с PIC микроконтроллером подключёна дополнительная оценочная плата (IE-ZX_DCM2) с драйвером L293D. Нужно, что бы вращался моторчик "С", подключённый к IE-ZX-DCM2. Подключил я плату с моторчиками через порты RE0, RE1, RE2 (оставил немного строк кода, которые были в инструкции от набора, так для примера).

Здесь схемы плат и как я их соединил: http://ifolder.ru/18523385

Вместо Pwm3 можно поставить везде Pwm1, тогда не будет ошибок, однако моторчик всё равно не работает.

Код такой:

CODE:

char motor_duty_= 127; // Ширина импульса ШИМ по умолчанию 50%
char motor_init_=0; // Начальное состояние


// *** Motor A *****
// PD0 ====> 1A
// PD1 ====> 1B
// PC2 ====> 1E (PWM1)


// *** Motor B *****
// PB1 ====> 2A
// PB2 ====> 2B
// PC1 ====> 2E (PWM2)


// *** Мотор С ****
// PE2 ====> 1A // Тут порты вибираю
// PE1 ====> 1B
// PE0 ====> 1E (PWM3)


//****************************************************
//********* Функция инициализации двигателя ****************
//****************************************************
void Motor_Init()
{
if (motor_init_==0) // Это первый вызов функции ?
{
motor_init_=1; // Состояние
ANSELH.F0=0; // RB1 ==> Цифровой Ввод/Вывод (это для мотора 1, подключённого к плате с PIC МК)
ANSELH.F2=0; // RB2 ==> Цифровой Ввод/Вывод (это для мотора 2, подключённого к плате с PIC МК)

ANSEL.F6=0; // RE1==> Цифровой Вывод (там есть варианты поставить аналоговый, если присвоить значение - 1) (это для мотора 2, подключённого к оценочной плате ZX-DCM2)

ANSEL.F7=0; // RE2==> Цифровой Вывод (это для мотора 2, подключённого к оценочной плате ZX-DCM2)

TRISB.F1=0; // Двигатель Б 2A
TRISB.F2=0; // Двигатель Б 2B

TRISD.F0=0; // Двигатель А 1A
TRISD.F1=0; // Двигатель А 1B

TRISE.F1=0; // Двигатель С 1А
TRISE.F2=0; // Двигатель С 1В

Pwm1_Init(5000); // Инициализация ШИМ1 => 1E
Pwm2_Init(5000); // Инициализация ШИМ2 => 2E

//Pwm3_Init(5000); - ЕСЛИ РАЗКОММЕНТИРОВАТЬ -> ОШИБКА: Internal Error PWM_Init not foud

}
}
//****************************************************
//****************************************************
//********* Управление шириной импульса *******************
//****************************************************
void Change_Duty(char speed)
{
if (speed != motor_duty_) // Получили то же значение скорости?
{
motor_duty_=speed; // Сохранить текущее значение скорости
Pwm1_Change_Duty(speed); // Двигатель A
Pwm2_Change_Duty(speed); // Двигатель B
//Pwm3_Change_Duty(speed); // Движок С - ЕСЛИ РАЗКОММЕНТИТЬ - ОШИБКА: "переменная не описана"
}
}
//****************************************************


/*******Двигатель С вперёд*****/
void Motor_C_FWD()
{
//Pwm3_Start(); - ЕСЛИ РАЗКОММЕНТИТЬ - ОШИБКА: "переменная не описана"
PORTE.F1 =0;
PORTE.F2 =1;
}

/*******Двигатель С назад*****/
void Motor_C_BWD()
{
//Pwm3_Start(); - ЕСЛИ РАЗКОММЕНТИТЬ - ОШИБКА: "переменная не описана"
PORTE.F1 =1;
PORTE.F2 =0;
}

/*******Двигатель С выкл*****/
void Motor_C_Stop()
{
//Pwm3_Start(); - ЕСЛИ РАЗКОММЕНТИТЬ - ОШИБКА: "переменная не описана"
PORTE.F1 =0;
PORTE.F2 =0;
}



/******* Команда ДВИЖЕНИЕ ВПЕРЕД для С ******/
void C_Forward(char speed)
{
Motor_Init();
Change_Duty(speed);
Motor_C_FWD();
}

/******* Команда ДВИЖЕНИЕ НАЗАД для С ******/
void C_Backward(char speed)
{
Motor_Init();
Change_Duty(speed);
Motor_C_BWD();
}


Тот код в основной программе используется как include.

А в основной программе строки кода для запуска движков такие:

CODE:

CODE:

while(1)
{
char key=get_remote(); // получаю символ кнопки на пульте

if((key=='d')||(key=='D'))
Lcd_Out(1, 1, text2); //вывожу на экран ЖКИ сообщение
C_Backward(255); //процедура вращения движка
Delay_ms(300);
Lcd_Cmd(Lcd_Clear);
}


Компилятор ошибок не выдаёт, если ТАМ ЗАКОММЕНТИРОВАНО. На экран ЖКИ сообщение выводится, однако движок не вращается.

P.S. После забивание кода в PIC МК, на плате ДСМ2 начала гореть лампочка (+Vm). Елси подключить батарейку к +/- выводам (+Vm), то лампочка гаснет, убираю - включается.

(Отредактировано автором: 14 Июля, 2010 - 20:48:02)

 
 Top
mihail Post Id



Гуру


Сообщений всего: 1065
Дата рег-ции: Март 2010  



Vaspit пишет:
Здесь схемы плат и как я их соединил: http://ifolder.ru/18523385


Схемы не смотрел. По моему, 24.46 Мб для пары картинок многовато Замешательство
С программой на С для PIC помочь не могу (просто не знаю как С управляет портами этих микроконтроллеров), но могу порекомендовать статью из которой можно понять принцип управления драйвером электродвигателя http://myrobot.ru/stepbystep/r_firstbot1.php На выводах ШИМ, на время отладки программы, можно просто установить логическую единицу.
 
 Top
cjA Post Id



Генерал


Сообщений всего: 3291
Дата рег-ции: Янв. 2010  



кстати да!
(это самый дурной способ проверки)
если плюсиком по ножкам ДД пройтись - происходит штонибудь?
 
 Top
Vaspit Post Id



Полковник


Сообщений всего: 70
Дата рег-ции: Июль 2010  



Вот, перезалил схемы, в JPEG на 4Мб


cjA пишет:
по ножкам ДД пройтись

Я совсем зелёный, не шарю, что обозначает эта фраза?


mihail пишет:
На выводах ШИМ, на время отладки программы, можно просто установить логическую единицу.


Там скорее всего уже стоит 1, т.к. насколько я понимаю, питание идёт через них и лампочка зелёная горит.

(Отредактировано автором: 15 Июля, 2010 - 12:21:21)

 
 Top
cjA Post Id



Генерал


Сообщений всего: 3291
Дата рег-ции: Янв. 2010  



Я не краснее- по ножкам управления Драйвера Двигателей- L293 у тебя наверное?

тупо по питанию через проводок (плюс пять или минус ноль) потыкать на ножки инпат1234 - должно что то происходить.
там четыре канала, может какой и сгорел.
Может искрить даже будет , но если ничего не происходит- я бы задумался.
 
 Top
Vaspit Post Id



Полковник


Сообщений всего: 70
Дата рег-ции: Июль 2010  



cjA пишет:
Я не краснее- по ножкам управления Драйвера Двигателей- L293 у тебя наверное?

тупо по питанию через проводок (плюс пять или минус ноль) потыкать на ножки инпат1234 - должно что то происходить.
там четыре канала, может какой и сгорел.
Может искрить даже будет , но если ничего не происходит- я бы задумался.


Не ну вот там есть выводы питания, если я подсоединяю к ним батарейку, то красная лампочка гаснет, если убираю батарейку зажигается опять
 
 Top
Страниц (17): « 1 2 3 4 [5] 6 7 8 9 ... » В конец
« Программирование микроконтроллеров »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 





Powered by Exclusive Bulletin Board
ExBB FM 1.0 RC1 Smiles by Fool from Foolstown
  Яндекс.Метрика   Рейтинг@Mail.ru