roboforum.ru

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

помогите с программирование в winavr

помогите с программирование в winavr

alex91 » 10 сен 2010, 17:09

Код: Выделить всёРазвернуть
всем добрый день
у меня такая проблема мне необходима объединить три программы в одну я пробовал объединить но у меня одно действия мешает другому как так сделать чтобы они работали независимо

код работает но не так как надо когда его включаешь он должен ехать в перед а он просто стоит но тсопы у него реагируют а датчик освещенности у него вообще не работает ни как не могу разобраться
программа сделана под игрушечную машинку на ней стоит 1tsop-ы для объезда препятствий 2радиоуправление 3датчик освещенности в пространстве
хотелось сделать так; если нет пару секунд команд от пульта он просто едет и объезжает препятствия но датчик срабатывал всегда независимо от того есть команды от пульта или нет
есть код на cи для winavr но он в ужасном состоянии его надо дорабатывать в программирование я только начинаю осваивать очень буду рад за любую помощь [#include <avr/io.h>
#include <util/delay.h>
#include <avr/iom8.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#define F_CPU 8000000UL // 8 MHz

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++; // произвольное действие
}

volatile int modulation=200; // длина всей посылки (можно менять)
unsigned long int t_1 = 9990;
SIGNAL(SIG_OVERFLOW0) //функция модуляции сигнала//
{
if(modulation<20) //длина пачки//
{
PORTB ^= 0b00000001;
}

else
{
PORTB &= 0b00000000;
}

if(modulation<200) //для счета длины посылки
{modulation++;}

else
{modulation=0;}

TCNT0 = 0;
}



void init_timer0 () //настройка таймера 0
{cli();
TCNT0 = 111;
TCCR0 = 1;
TIMSK = 1;
sei();
}


int main(void) //основная программа
{
DDRD ^= 0b00000001;/*фары*/

DDRB |= (1<<0); /* PB0 сконфигурировать как выход, ИК-светодиод */
DDRB |= (1<<1); /* PB1 сконфигурировать как выход, индикаторный светодиод 1 */
DDRB |= (1<<2); /* PB2 сконфигурировать как выход, индикаторный светодиод 2 */
DDRB |= (1<<3); /* PB3 сконфигурировать как выход, индикаторный светодиод 3 */


/* PB5 */
/* PB6 */
/* PB7 */

DDRC &= (~(1<<0)); /* датчик света в пространстве */
DDRC |= (1<<1); /* PC1 сконфигурировать как выход, драйвер двигателя */
DDRC |= (1<<2); /* PC2 сконфигурировать как выход, драйвер двигателя */
DDRC |= (1<<3); /* PC3 сконфигурировать как выход, драйвер двигателя */
DDRC |= (1<<4); /* PC4 сконфигурировать как выход, драйвер двигателя */
/* PC5 */
/* PC6 */
/* PC7 */

DDRD &= (~(1<<1)); /* PD4 сконфигурировать как вход, канал радиоуправления */
DDRD &= (~(1<<2)); /* PD4 сконфигурировать как вход, канал радиоуправления */
DDRD &= (~(1<<3)); /* PD4 сконфигурировать как вход, канал радиоуправления */
DDRD &= (~(1<<4)); /* PD4 сконфигурировать как вход, канал радиоуправления */
DDRD &= (~(1<<5)); /* PD5 сконфигурировать как вход, TSOP 1 */
DDRD &= (~(1<<6)); /* PD6 сконфигурировать как вход, TSOP 2 */
DDRD &= (~(1<<7)); /* PD7 сконфигурировать как вход, TSOP 3 */

PORTD |= (1<<1); /* PD4 установить "1", включаем подтягивающий резистор */
PORTD |= (1<<2); /* PD4 установить "1", включаем подтягивающий резистор */
PORTD |= (1<<3); /* PD4 установить "1", включаем подтягивающий резистор */
PORTD |= (1<<4); /* PD4 установить "1", включаем подтягивающий резистор */
PORTD |= (1<<5); /* PD5 установить "1", включаем подтягивающий резистор */
PORTD |= (1<<6); /* PD6 установить "1", включаем подтягивающий резистор */
PORTD |= (1<<7); /* PD7 установить "1", включаем подтягивающий резистор */

_delay_ms(100); //сброс ложного сигнала тсопа при включении (можно убрать)

init_timer0(); //инициализация таймера!!!

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


/* ------------------ моторы вперед ------------------- */

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

/* ----------------------------------------------------- */



/* проверка TSOP 1 */
if( !(PIND & (1<<5)) ) /* проверить "0" на PD5 */
{
PORTB |= (1<<1); /* установить "1" на PB1, включить индикаторный светодиод */

/* ------- левый мотор назад, правый мотор вперед ------- */


PORTC &= (~(1<<1)); /* установить "0" на линии 1 порта C */
PORTC |= (1<<2); /* установить "1" на линии 2 порта C */
PORTC |= (1<<3); /* установить "1" на линии 3 порта C */
PORTC &= (~(1<<4));
/* ----------------------------------------------------- */

_delay_ms(1000); /* задержка */

PORTB &= (~(1<<1)); /* установить "0" на PB1, выключить индикаторный светодиод */
}


/* проверка TSOP 2 */
if( !(PIND & (1<<6)) ) /* проверить "0" на PD6 */
{
PORTB |= (1<<2); /* установить "1" на PB2, включить индикаторный светодиод */

/* ------------------- моторы назад -------------------- */

PORTC &= (~(1<<1)); /* установить "0" на линии 1 порта C */
PORTC |= (1<<2); /* установить "1" на линии 2 порта C */
PORTC &= (~(1<<3)); /* установить "0" на линии 3 порта C */
PORTC |= (1<<4); /* установить "1" на линии 4 порта C */
_delay_ms(175);


PORTC &= (~(1<<1)); /* установить "0" на линии 1 порта C */
PORTC |= (1<<2); /* установить "1" на линии 2 порта C */
PORTC |= (1<<3); /* установить "1" на линии 3 порта C */
PORTC &= (~(1<<4));
_delay_ms(700);

/* ------------------- моторы назад -------------------- */

PORTB &= (~(1<<2)); /* установить "0" на PB2, выключить индикаторный светодиод */
}


/* проверка TSOP 3 */
if( !(PIND & (1<<7)) ) /* проверить "0" на PD7 */
{
PORTB |= (1<<3); /* установить "1" на PB3, включить индикаторный светодиод */

/* ------- левый мотор вперед, правый мотор назад ------- */

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

/* ----------------------------------------------------- */

_delay_ms(1000); /* задержка */

PORTB &= (~(1<<3)); /* установить "0" на PB3, выключить индикаторный светодиод */
}
/* ---- датчик света в пространстве ---- */

if( !(PINC & (1<<0)) ) /* проверить "0" на PD5 */
{
PORTD &= 0b00000001; /* установить "0" на линии 0 порта D */
}
else
{
PORTD ^= 0b00000001; /* установить "1" на линии 0 порта D */
}
/* ------РАДИОУПРАВЛЕНИЕ----------- */

{

if( (PIND & (1<<PIND1)) && /* проверить "1" на линии 1 порта D */
(PIND & (1<<PIND2)) && /* проверить "1" на линии 2 порта D */
(PIND & (1<<PIND3)) && /* проверить "1" на линии 3 порта D */
(PIND & (1<<PIND4)) ) /* проверить "1" на линии 4 порта D */
{

t_1 = t_1 + 1;

}
else
{


if ( PIND & (1<<PIND1) ) /* проверить "1" на линии 1 порта D */
{ // -------------- включаем моторы вперед ---------------

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

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


if ( PIND & (1<<PIND4) ) /* проверить "1" на линии 3 порта D */
{ // --------------------- поворот --------------------

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

/* ------------------- поворот ------------------------------- */
if ( PIND & (1<<PIND5) ) /* проверить "1" на линии 5 порта D */
{ PORTC &= ~_BV(PC1); // установить "0" на линии 0порта C
PORTC |= _BV(PC2); // установить "1" на линии 2 порта C
PORTC |= _BV(PC3); // установить "1" на линии 3 порта C
}
else
{ PORTC &= ~_BV(PC4); } /* установить "0" на линии 4 порта C */


t_1 = 0;

}
}
}

} /* закрывающая скобка бесконечного цикла */
]программа[/code]
Последний раз редактировалось alex91 10 сен 2010, 22:00, всего редактировалось 1 раз.

Re: помогите с программирование в winavr

SkyStorm » 10 сен 2010, 18:48

Для такой программы у меня есть решение
Код: Выделить всёРазвернуть
Правильно работающая программа


Rambler\'s Top100 Mail.ru counter