Без описания |
Поиск в теме | Версия для печати |
mihail |
Отправлено: 13 Июля, 2010 - 00:18:22
|
Гуру
Сообщений всего: 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) |
|
|
Vaspit |
Отправлено: 14 Июля, 2010 - 20:43:53
|
Полковник
Сообщений всего: 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) |
|
|
Vaspit |
Отправлено: 15 Июля, 2010 - 12:14:54
|
Полковник
Сообщений всего: 70
Дата рег-ции: Июль 2010
|
Вот, перезалил схемы, в JPEG на 4Мб
cjA пишет:по ножкам ДД пройтись
Я совсем зелёный, не шарю, что обозначает эта фраза?
mihail пишет:На выводах ШИМ, на время отладки программы, можно просто установить логическую единицу.
Там скорее всего уже стоит 1, т.к. насколько я понимаю, питание идёт через них и лампочка зелёная горит.(Отредактировано автором: 15 Июля, 2010 - 12:21:21) |
|
|
|
Поиск в теме | Версия для печати |
Страниц (17): « 1 2 3 4 [5] 6 7 8 9 ... » В конец |
« Программирование микроконтроллеров » |
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
|
|
|
|
|