- Код: Выделить всё • Развернуть
у меня такая проблема мне необходима объединить три программы в одну я пробовал объединить но у меня одно действия мешает другому как так сделать чтобы они работали независимо
код работает но не так как надо когда его включаешь он должен ехать в перед а он просто стоит но тсопы у него реагируют а датчик освещенности у него вообще не работает ни как не могу разобраться
программа сделана под игрушечную машинку на ней стоит 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]