roboforum.ru

Технический форум по робототехнике.

Хе-хе. Нужна помощь с программой

Хе-хе. Нужна помощь с программой

space » 30 янв 2008, 19:30

Нужна помощь с программой.Вот исходник:


#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

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

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

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

Re: Хе-хе. Нужна помощь с программой

-= Александр =- » 31 янв 2008, 02:41

А в чем пишешь?
Некоторые компилеры неадекватно понимают оператор &. Попробуй заменить на &&

Re: Хе-хе. Нужна помощь с программой

space » 31 янв 2008, 16:28

Пишу на Си. А команду && уже пробовал. Там вообще датчики перестают на, что либо реагировать

Re: Хе-хе. Нужна помощь с программой

-= Александр =- » 31 янв 2008, 19:23

Попробуй просто if ((PIND & 0x02)==0)
И проверь кстати что у тебя на PD1 в этот момент творится?

Re: Хе-хе. Нужна помощь с программой

space » 31 янв 2008, 21:00

Ладно попробую. Спасиб

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

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

Re: Хе-хе. Нужна помощь с программой

space » 01 фев 2008, 21:07

Попробовал тоже самое :(

Re: Хе-хе. Нужна помощь с программой

Grover » 03 фев 2008, 22:14

Я конечно чайник, но попробуй:

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

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

Re: Хе-хе. Нужна помощь с программой

space » 03 фев 2008, 22:38

Пробую тут другой вариантик. Мне надо подогнать эту прогу под сумо-бота. Так вот сделал только чтоб реагировал на датчики края. А чтоб ехал вперёд в начале программы незнаю как сделать, подскажите. Что мне надо добавить или изменить в проге.
Код: Выделить всёРазвернуть
#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) ;

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


Rambler\'s Top100 Mail.ru counter