roboforum.ru

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

Помогите с кодом

Помогите с кодом

RomS » 13 окт 2011, 18:56

Всем привет! Помогите пожалуйста переделать код под мегу8! У самого чет не че не получается. Мега8 у меня работает на заводской частоте без кварца.
/*****************************************************
Chip type : AT90S2313
Clock frequency : 4,000000 MHz
Memory model : Tiny
External SRAM size : 0
Data Stack size : 32
*****************************************************/

#include <90s2313.h>

#include
#include

// назначение определений для удобства работы с периферией
#define OUT PORTB
#define MOTOR_F 7
#define MOTOR_B 6
#define TURN_R 5
#define TURN_L 4

#define IN PIND
#define LIGHT_R 0
#define LIGHT_L 1
#define BUMPER_F 2
#define BUMPER_B 3

// Возможные режимы движения
enum {STOP, F, FR, FL, B, BR, BL};

//------------------------------------------------------------------------------
// Задержка t х 10ms
//------------------------------------------------------------------------------
void Delay_10ms(unsigned char t)
{char i;
for(i=0;i }

// таблица вероятностей для выбора направления движения
// исходя из текущего направления движения
unsigned char p[7][7] =
{14, 43, 57, 71, 86, 93, 100,
7, 43, 71, 100, 100, 100, 100,
7, 50, 93, 100, 100, 100, 100,
7, 50, 57, 100, 100, 100, 100,
29, 29, 29, 29, 57, 79, 100,
36, 36, 36, 36, 71, 93, 100,
36, 36, 36, 36, 71, 79, 100};

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

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

switch (direction) {
case STOP:
OUT.MOTOR_F=0;
OUT.MOTOR_B=0;
OUT.TURN_R=0;
OUT.TURN_L=0;
break;

case F:
OUT.MOTOR_F=1;
OUT.MOTOR_B=0;
OUT.TURN_R=0;
OUT.TURN_L=0;
break;

case FR:
OUT.MOTOR_F=1;
OUT.MOTOR_B=0;
OUT.TURN_R=1;
OUT.TURN_L=0;
break;

case FL:
OUT.MOTOR_F=1;
OUT.MOTOR_B=0;
OUT.TURN_R=0;
OUT.TURN_L=1;
break;

case B:
OUT.MOTOR_F=0;
OUT.MOTOR_B=1;
OUT.TURN_R=0;
OUT.TURN_L=0;
break;

case BR:
OUT.MOTOR_F=0;
OUT.MOTOR_B=1;
OUT.TURN_R=1;
OUT.TURN_L=0;
break;

case BL:
OUT.MOTOR_F=0;
OUT.MOTOR_B=1;
OUT.TURN_R=0;
OUT.TURN_L=1;
break;
}
}

//------------------------------------------------------------------------------
// Выбор направления движения в следующем шаге по таблице вероятностей
//------------------------------------------------------------------------------
unsigned char next_move(void){
unsigned char pp, i;

pp = rand()/327; // получаем случайное число 0..99
for (i=0;i<7;i++){ // ищем соответствие в таблице вероятностей
if (p[this_move][i] > pp) break;
}
this_move = i; // записываем новое полученное направление как текущее
return(i);
}

//------------------------------------------------------------------------------
// Обработка прерывания от переднего бампера (INT0 = PD2)
//------------------------------------------------------------------------------
interrupt [EXT_INT0] void ext_int0_isr(void)
{
if(this_move==FR) go(BL);
if(this_move==FL) go(BR);
else go(B);
Delay_10ms(250); // отъезд в течение 2.5 х 2 сек
Delay_10ms(250);
this_move=B;
}

//------------------------------------------------------------------------------
// Обработка прерывания от заднего бампера (INT1 = PD3)
//------------------------------------------------------------------------------
interrupt [EXT_INT1] void ext_int1_isr(void)
{
if(this_move==BR) go(FL);
if(this_move==BL) go(FR);
else go(F);
Delay_10ms(250); // отъезд в течение 2.5 х 2 сек
Delay_10ms(250);
this_move=F;
}

//------------------------------------------------------------------------------
// "Случайное блуждание"
//------------------------------------------------------------------------------
unsigned char walk(void){
// этот цикл организует "свободное блуждание" пока
// нет сигнала ни от одного из датчиков освещенности
while((IN.LIGHT_R) && (IN.LIGHT_L)){
go(next_move()); // получаем следующее направление движения и
Delay_10ms(250); // движемся в этом направлении 2.5 сек
}
// этот цикл организует движение на свет, пока
// есть сигнал хотя бы от одного из датчиков освещенности
while((IN.LIGHT_R==0) || (IN.LIGHT_L==0)){
if((IN.LIGHT_R==0) && (IN.LIGHT_L==0)) go(F);
else if(IN.LIGHT_R==0) go(FR);
else if(IN.LIGHT_L==0) go(FL);
}

return(0);
}

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

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

// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Falling Edge
// INT1: On
// INT1 Mode: Falling Edge
GIMSK=0xC0;
MCUCR=0x0A;
GIFR=0xC0;

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

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

Re: Помогите с кодом

EasyTech » 13 окт 2011, 19:22

Ты конечно не обижайся, но тут за тебя не кто не будет делать работу, к сожалению.
1) распачатай даташит меги8 и AT90S2313
2) пересмотри что к какой ноге подключено, где поменяй порты.
3) посмотри регистры портов,если они разные тоже поменяй.
Дело долгое, если ты не ас в этом, то это где то 2 часа делать

Re: Помогите с кодом

RomS » 13 окт 2011, 19:30

я два дня назад просто начал изучать програмирование. Если не сложно подскажите про регистры.

Добавлено спустя 2 минуты 11 секунд:
И еще этот код при компиляции ошибки выдает это из за Makefile?

Re: Помогите с кодом

HarryStar » 13 окт 2011, 19:50

Вы не с того начали. Начали изучать программирование - изучайте последовательно, не прыгайте через голову.

Re: Помогите с кодом

RomS » 13 окт 2011, 20:29

Ну я не спорю что тороплюсь. Просто бот уже собран и механика и электроника. Крутить колесиками туда сюда не интересно уже. Поставил контактные датчики(УСЫ) а программа не получается только один ус работает. Может есть коды у кого простенькие дайте пожалуйста а я под себя постараюсь сам переделать.

Добавлено спустя 23 минуты 18 секунд:
И еще подскажите учебник по WinAvr.

Re: Помогите с кодом

RomS » 14 окт 2011, 13:08

Вот попробовал сделать прошивку с датчиками усами но почему то один ус не работает. Подскажите где ошибка?


/****************************************************************
робот с датчиками усами
*****************************************************************/

#define F_CPU 1000000UL // указываем частоту в герцах

#include <avr/io.h>
#include <util/delay.h>

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

DDRC = 0xff; // все выводы порта C сконфигурировать как выходы
DDRD = 0x00; // все выводы порта D сконфигурировать как входы


PORTD = 0xff; // установить "1" на всех выводах порта D,
// включаем подтягивающие резисторы

while (1) { // Бесконечный цикл

// ПРОВЕРЯЕМ СИГНАЛ НИЗКОГО УРОНЯ ОТ бампера 1

if (!(PIND & (1<<PIND1))) // проверить "0" на линии 1 порта D
{
// ---- вращаем моторы вперед -----

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

// -----------------------------------------------------
}
else
{
// ---- поворот с риверсом 1 секунда в право -----

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

_delay_ms(1000); // ждем 1 сек.


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


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






while (1) { // Бесконечный цикл

// ПРОВЕРЯЕМ СИГНАЛ НИЗКОГО УРОНЯ ОТ бампера 2

if (!(PIND & (1<<PIND2))) // проверить "0" на линии 1 порта D
{
// ---- вращаем моторы вперед -----

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

// -----------------------------------------------------
}
else
{
// ---- поворот с риверсом 1 секунда в лево -----

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

_delay_ms(1000); // ждем 1 сек.
}


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

Re: Помогите с кодом

Radist » 14 окт 2011, 13:15

у вас друг за другом идут два бесконечных цикла. Они бесконечные. Даже так: БЕСКОНЕЧНЫЕ. Из первого цикла вы никогда не попадете во второй по причине бесконечности первого :)

Re: Помогите с кодом

RomS » 14 окт 2011, 20:04

Вот спасибо! Получилось :Yahoo!: ! А как теперь бы сделать отъезд и разворот при срабатывании обоих датчиков сразу?

Re: Помогите с кодом

Radist » 17 окт 2011, 18:34

Да легко. Делаете две проверки друг за другом, используя логические конструкции. У вас возможно 4 варианта: усы не нажаты, нажат левый, нажат правый, нажаты оба. По результатам проверки выполняете действия.

Re: Помогите с кодом

RomS » 18 окт 2011, 19:01

Спасибо!


Rambler\'s Top100 Mail.ru counter