roboforum.ru

Технический форум по робототехнике.
Текущее время: 30 ноя 2024, 09:27

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: Хе-хе. Нужна помощь с программой
СообщениеДобавлено: 30 янв 2008, 19:30 
Не в сети
Аватара пользователя

Зарегистрирован: 17 июн 2007, 23:44
Сообщения: 565
Откуда: Тула
прог. языки: Bascom AVR Basic, CodeVisionAVR
ФИО: Замотаев Кирилл Игоревич
Нужна помощь с программой.Вот исходник:


#include <avr/io.h>
/***************** Функция задержки ****************/
void delay(unsigned short ms) // Минимальная задержка с кварцем 8 МГц - 1 мс
{
unsigned short i, j, k; // объявляем переменные
for (i=0; i<ms; i++) // главный цикл формирования задержки
for (j=0; j<185; j++) // вложенный цикл формирования задержки
k++; // произвольное действие
}
/****************************************************/


int main(void) // начало основной программы
{

DDRC = 0xff; // все выводы порта C сконфигурировать как выходы
DDRD = 0x00; // все выводы порта D сконфигурировать как входы
PORTD = 0xff; // установить "1" на всех выводах порта D,
// включаем подтягивающие резисторы
// ------- Основная программа ---------
while (1) {
if (!(PIND & (1<<PIND1))) // проверить "0" на линии 1 порта D
{
// ------------------ отъезд назад ------------------
PORTC &= ~_BV(PC1); // установить "0" на линии 1 порта C
PORTC |= _BV(PC2); // установить "1" на линии 2 порта C
PORTC &= ~_BV(PC3); // установить "0" на линии 3 порта C
PORTC |= _BV(PC4); // установить "1" на линии 4 порта C

delay(5000);
// --------------------------------------------------


// разворот вправо

PORTC &= ~_BV(PC1); // установить "1" на линии 1 порта C
PORTC |= _BV(PC2); // установить "0" на линии 2 порта C
PORTC |= _BV(PC3); // установить "1" на линии 3 порта C
PORTC &= ~_BV(PC4); // установить "0" на линии 4 порта C

delay(5000);
// --------------------------------------------------

}
else
{
// -------------- включаем моторы вперед ---------------

PORTC |= _BV(PC1); // установить "1" на линии 1 порта C
PORTC &= ~_BV(PC2); // установить "0" на линии 2 порта C
PORTC |= _BV(PC3); // установить "1" на линии 3 порта C
PORTC &= ~_BV(PC4); // установить "0" на линии 4 порта C

// -----------------------------------------------------
}

} // закрывающая скобка бесконечного цикла

} // закрывающая скобка основной программы

Так вот объясните пожалуйста почему у меня программа начинает роботу со строчек выделенных красным? Робот при включение выполняет сначало эту команду,
а потом уже работает по программе(едит вперёд, если мк получает сигнал от фотодиода, то робот делает отъезд и разварачивается).
И ещё, если я добовляю вот такие строки (выделенные синим), то фотодиоды воспринимают сигнал ни сразу, а через несколько секунд, а без этих строк сразу. Почему так?


#include <avr/io.h>
/***************** Функция задержки ****************/
void delay(unsigned short ms) // Минимальная задержка с кварцем 8 МГц - 1 мс
{
unsigned short i, j, k; // объявляем переменные
for (i=0; i<ms; i++) // главный цикл формирования задержки
for (j=0; j<185; j++) // вложенный цикл формирования задержки
k++; // произвольное действие
}
/****************************************************/


int main(void) // начало основной программы
{

DDRC = 0xff; // все выводы порта C сконфигурировать как выходы
DDRD = 0x00; // все выводы порта D сконфигурировать как входы
PORTD = 0xff; // установить "1" на всех выводах порта D,
// включаем подтягивающие резисторы
// ------- Основная программа ---------
{
DDRD |= _BV(PD0); // Установить линию 0 порта D в "1" т.е. на вывод[/color]
while(1) { // Бесконечный цикл
PORTD &= ~_BV(PD0); // Сбросить бит PD0 в "0" = 0V, светодиод включен
delay(500); // Ждем 0.5 сек.
PORTD |= _BV(PD0); // Установить бит PD0 в "1" = 5V, светодиод выключен
delay(500); // Ждем 0.5 сек.

{
if (!(PIND ^ (1<<PIND1))) // проверить "0" на линии 1 порта D
{
// ------------------ отъезд назад ------------------
PORTC &= ~_BV(PC1); // установить "0" на линии 1 порта C
PORTC |= _BV(PC2); // установить "1" на линии 2 порта C
PORTC &= ~_BV(PC3); // установить "0" на линии 3 порта C
PORTC |= _BV(PC4); // установить "1" на линии 4 порта C

delay(5000);
// --------------------------------------------------


// разворот вправо

PORTC &= ~_BV(PC1); // установить "1" на линии 1 порта C
PORTC |= _BV(PC2); // установить "0" на линии 2 порта C
PORTC |= _BV(PC3); // установить "1" на линии 3 порта C
PORTC &= ~_BV(PC4); // установить "0" на линии 4 порта C

delay(5000);
// --------------------------------------------------
}
else
{
// -------------- включаем моторы вперед ---------------

PORTC |= _BV(PC1); // установить "1" на линии 1 порта C
PORTC &= ~_BV(PC2); // установить "0" на линии 2 порта C
PORTC |= _BV(PC3); // установить "1" на линии 3 порта C
PORTC &= ~_BV(PC4); // установить "0" на линии 4 порта C

// -----------------------------------------------------
}

} // закрывающая скобка бесконечного цикла

} // закрывающая скобка основной программы

_________________
https://vk.com/ledscale - платы, vk.com/ledscale3dprintig - 3Д печать\моделирование, vk.com/ledrenovation- ремонт светодиодных источников света


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Хе-хе. Нужна помощь с программой
СообщениеДобавлено: 31 янв 2008, 02:41 
Не в сети
Мастер Самоделкин
Аватара пользователя

Зарегистрирован: 11 окт 2004, 19:20
Сообщения: 3678
Откуда: Россия, СПб
прог. языки: C/C++, Python, asm
ФИО: Курмис Александр Андреевич
А в чем пишешь?
Некоторые компилеры неадекватно понимают оператор &. Попробуй заменить на &&

_________________
Ниндзя - круче всех. Они умеют ходить по воде, делить на ноль и угадывать шаффл в АйПоде.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Хе-хе. Нужна помощь с программой
СообщениеДобавлено: 31 янв 2008, 16:28 
Не в сети
Аватара пользователя

Зарегистрирован: 17 июн 2007, 23:44
Сообщения: 565
Откуда: Тула
прог. языки: Bascom AVR Basic, CodeVisionAVR
ФИО: Замотаев Кирилл Игоревич
Пишу на Си. А команду && уже пробовал. Там вообще датчики перестают на, что либо реагировать

_________________
https://vk.com/ledscale - платы, vk.com/ledscale3dprintig - 3Д печать\моделирование, vk.com/ledrenovation- ремонт светодиодных источников света


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Хе-хе. Нужна помощь с программой
СообщениеДобавлено: 31 янв 2008, 19:23 
Не в сети
Мастер Самоделкин
Аватара пользователя

Зарегистрирован: 11 окт 2004, 19:20
Сообщения: 3678
Откуда: Россия, СПб
прог. языки: C/C++, Python, asm
ФИО: Курмис Александр Андреевич
Попробуй просто if ((PIND & 0x02)==0)
И проверь кстати что у тебя на PD1 в этот момент творится?

_________________
Ниндзя - круче всех. Они умеют ходить по воде, делить на ноль и угадывать шаффл в АйПоде.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Хе-хе. Нужна помощь с программой
СообщениеДобавлено: 31 янв 2008, 21:00 
Не в сети
Аватара пользователя

Зарегистрирован: 17 июн 2007, 23:44
Сообщения: 565
Откуда: Тула
прог. языки: Bascom AVR Basic, CodeVisionAVR
ФИО: Замотаев Кирилл Игоревич
Ладно попробую. Спасиб

Добавлено спустя 4 минуты 43 секунды:
-= Александр =- писал(а):
Попробуй просто if ((PIND & 0x02)==0)
И проверь кстати что у тебя на PD1 в этот момент творится?

Когда нет сигнала на фотодиод подаётся 3,5 вольта, когда принимает отражённый свет напряжение на фотодиод падает до 0,34 В


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Хе-хе. Нужна помощь с программой
СообщениеДобавлено: 01 фев 2008, 21:07 
Не в сети
Аватара пользователя

Зарегистрирован: 17 июн 2007, 23:44
Сообщения: 565
Откуда: Тула
прог. языки: Bascom AVR Basic, CodeVisionAVR
ФИО: Замотаев Кирилл Игоревич
Попробовал тоже самое :(


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Хе-хе. Нужна помощь с программой
СообщениеДобавлено: 03 фев 2008, 22:14 
Не в сети
Аватара пользователя

Зарегистрирован: 28 янв 2008, 09:27
Сообщения: 78
Откуда: Россия
Я конечно чайник, но попробуй:

В даташите (в примерах) после инициализации портов:
Код:
DDRC = 0xff; // все выводы порта C сконфигурировать как выходы
DDRD = 0x00; // все выводы порта D сконфигурировать как входы
PORTD = 0xff; // установить "1" на всех выводах порта D,
// включаем подтягивающие резисторы

выдерживают небольшую паузу, что бы МК успела переключить порты и пины.

_________________
Мои странички в интернете: http://groversuper.ucoz.ru


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Хе-хе. Нужна помощь с программой
СообщениеДобавлено: 03 фев 2008, 22:38 
Не в сети
Аватара пользователя

Зарегистрирован: 17 июн 2007, 23:44
Сообщения: 565
Откуда: Тула
прог. языки: Bascom AVR Basic, CodeVisionAVR
ФИО: Замотаев Кирилл Игоревич
Пробую тут другой вариантик. Мне надо подогнать эту прогу под сумо-бота. Так вот сделал только чтоб реагировал на датчики края. А чтоб ехал вперёд в начале программы незнаю как сделать, подскажите. Что мне надо добавить или изменить в проге.
Код:
#include <inttypes.h>
#include <io.h>
#include <sig-avr.h>
#include <interrupt.h>
#include <stdlib.h>

// назначение определений для удобства работы с периферией
#define OUT PORTC
#define MOTOR_F  PC1
#define MOTOR_B  PC2
#define TURN_R   PC3 
#define TURN_L   PC4

#define IN PIND
#define BUMPER_F PD2
#define BUMPER_B PD3

// Возможные режимы движения
enum {F, R, L, B};

//------------------------------------------------------------------------------
// Задержка t х 10ms
//------------------------------------------------------------------------------
#define F_CPU 8000000
#define K_DELAY_10ms   F_CPU/600
void Delay_10ms(unsigned char t) {
  unsigned int i;
  if (t==0) return;
  while (t--) for(i=0;i<K_DELAY_10ms; i++);
}

// текущее направление движения
unsigned char this_move;

//------------------------------------------------------------------------------
// Включение комбинации моторов для движения в заданном направлении
//-\-----------------------------------------------------------------------------
void go(unsigned char direction){

  switch (direction) {
case F://F
PORTC |= _BV(PC1);
PORTC &= ~_BV(PC2);
PORTC |= ~_BV(PC3);
PORTC &= ~_BV(PC4);
break;

case R://R
PORTC &= ~_BV(PC1);
PORTC |= _BV(PC2);
PORTC |= _BV(PC3);
PORTC &= ~_BV(PC4);
break;

case L://L
PORTC |= _BV(PC1);
PORTC &= ~_BV(PC2);
PORTC &= ~_BV(PC3);
PORTC |= _BV(PC4);
break;

case B://B
PORTC &= ~_BV(PC1);
PORTC |= _BV(PC2);
PORTC &= ~_BV(PC3);
PORTC |= _BV(PC4);
break;
}
}
//------------------------------------------------------------------------------
// Обработка прерывания от переднего бампера (INT0 = PD2)
//------------------------------------------------------------------------------
SIGNAL(SIG_INTERRUPT0)  //датчик края на PD2
   {
   if(this_move==R) go(L);
   if(this_move==L) go(R);
   else go(B);
   Delay_10ms(50);    // отъезд в течение 0.5 х 2 сек
   Delay_10ms(50);
   this_move=B;

   if(this_move==R) go(L);
   if(this_move==L) go(R);
   else go(R);
   Delay_10ms(50);    // отъезд в течение 0.5 х 2 сек
   Delay_10ms(50);
   this_move=R;

//------------------------------------------------------------------------------
// Обработка прерывания от заднего бампера (INT1 = PD3)
//------------------------------------------------------------------------------
SIGNAL(SIG_INTERRUPT1) //датчик на PD3
{
   if(this_move==R) go(L);
   if(this_move==L) go(R);
   else go(B);
   Delay_10ms(50);    // отъезд в течение 0.5 х 2 сек
   Delay_10ms(50);
   this_move=B;
   
   if(this_move==R) go(L);
   if(this_move==L) go(R);
   else go(L);
   Delay_10ms(50);    // отъезд в течение 0.5 х 2 сек
   Delay_10ms(50);
   this_move=L;
}

//------------------------------------------------------------------------------
// Главная программа
//------------------------------------------------------------------------------
int main(void)
{
  DDRC  = 0xff;  // назначаем все линии порта B на выход
  PORTC = 0x00;  // и устанавливаем на них низкий уровень

  DDRD  = 0x00;  // назначаем все линии порта D на вход
  PORTD = 0xff;  // подключаем внутренние нагрузочные резисторы

  // разрешаем прерывания int0 и int1
  outb(GIMSK, (1<<INT0)|(1<<INT1));

  // запрос на прерывание - по спадающим фронтам на int0 и int1
  outb(MCUCR, (1<<ISC01)|(1<<ISC11));

  // разрешаем прерывания
  sei();           

  // запускаем главный цикл
  while(1) ;

}

_________________
https://vk.com/ledscale - платы, vk.com/ledscale3dprintig - 3Д печать\моделирование, vk.com/ledrenovation- ремонт светодиодных источников света


Последний раз редактировалось Vooon 03 фев 2008, 23:40, всего редактировалось 1 раз.
CODE!!!


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 4 часа


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO