Без описания |
Поиск в теме | Версия для печати |
alex1991 |
Отправлено: 06 Июня, 2010 - 01:53:01
|
Генерал
Сообщений всего: 91
Дата рег-ции: Май 2010
|
доброй ночи всем
целый день занимался ик-бампером и у меня такая проблема;
раньше у меня от микроконтроллера выходила 2 генерированных выхода 36гц на ик светодиоды а сейчас я решил использовать один вывод мк и объединил оба ик-светодиоды к одной ножке мк.а сейчас добавил 3 тсоп посередине бампера и у меня не работает как надо прошивка если можете просмотрите мож где есть ошибка если нет пересмотрю монтаж хотя смотрел тышя раз
на данный момент конструкция работает так:
срабатывает только светодиод PB3 и все остальные не работают вот код
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/iom8.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#define F_CPU 8000000UL // 8 MHz
volatile int modulation=200; // длина всей посылки (можно менять)
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) //основная программа
{
DDRB |= (1<<0); /* PB0 сконфигурировать как выход, ИК-диод 1 */
/* PB1 */
/* PB2 */
DDRB |= (1<<1); /* PB1 сконфигурировать как выход, индикаторный светодиод 1 */
DDRB |= (1<<2); /* PB2 сконфигурировать как выход, индикаторный светодиод 2 */
DDRB |= (1<<3); /* PB3 сконфигурировать как выход, индикаторный светодиод 2 */
/* PB5 */
/* PB6 */
/* PB7 */
/* PC0 */
DDRC |= (1<<1); /* PC1 сконфигурировать как выход, драйвер двигателя */
DDRC |= (1<<2); /* PC2 сконфигурировать как выход, драйвер двигателя */
DDRC |= (1<<3); /* PC3 сконфигурировать как выход, драйвер двигателя */
DDRC |= (1<<4); /* PC4 сконфигурировать как выход, драйвер двигателя */
/* PC5 */
/* PC6 */
/* PC7 */
/* PD0 */
DDRD &= (~(1<<1)); /* PD1 сконфигурировать как вход, канал радиоуправления */
DDRD &= (~(1<<2)); /* PD2 сконфигурировать как вход, канал радиоуправления */
DDRD &= (~(1<<3)); /* PD3 сконфигурировать как вход, канал радиоуправления */
DDRD &= (~(1<<4)); /* PD4 сконфигурировать как вход, канал радиоуправления */
DDRD &= (~(1<<5)); /* PD5 сконфигурировать как вход, TSOP 1 */
DDRD &= (~(1<<6)); /* PD6 сконфигурировать как вход, TSOP 2 */
DDRD &= (~(1<<7)); /* PD7 сконфигурировать как вход, TSOP 3 */
/* PD0 */
PORTD |= (1<<1); /* PD1 установить "1", включаем подтягивающий резистор */
PORTD |= (1<<2); /* PD2 установить "1", включаем подтягивающий резистор */
PORTD |= (1<<3); /* PD3 установить "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)
/* проверка TSOP 1 */
{if ( !(PIND & (1<<5)) ) /* проверить "0" на PD5 */
{ PORTB |= (1<<1); } /* установить "1" на PB3 */
else
{ PORTB &= (~(1<<1)); } /* установить "0" на PB3 */
/* проверка TSOP 2 */
{if ( !(PIND & (1<<6)) ) /* проверить "0" на PD7 */
{ PORTB |= (1<<2); } /* установить "1" на PB4 */
else
{ PORTB &= (~(1<<2)); } /* установить "0" на PB4 */
{if ( !(PIND & (1<<7)) ) /* проверить "0" на PD5 */
{ PORTB |= (1<<3); } /* установить "1" на PB3 */
else
{ PORTB &= (~(1<<3)); } /* установить "0" на PB3 */
}
}
}
вывод
PD5-вход, TSOP 1 */
PD6-вход, TSOP 2 */
PD7-вход, TSOP 3 */
PB0-выход, ИК-диод 1 */
PB1-индикаторный светодиод1 */
PB2-индикаторный светодиод 2 */
PB3-индикаторный светодиод 3 */ |
|
|
mihail |
Отправлено: 06 Июня, 2010 - 04:37:01
|
Гуру
Сообщений всего: 1065
Дата рег-ции: Март 2010
|
CODE:
#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
volatile int modulation=200; // длина всей посылки (можно менять)
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) //основная программа
{
DDRB |= (1<<0); /* PB0 сконфигурировать как выход, ИК-светодиоды */
DDRB |= (1<<1); /* PB1 сконфигурировать как выход, индикаторный светодиод 1 */
DDRB |= (1<<2); /* PB2 сконфигурировать как выход, индикаторный светодиод 2 */
DDRB |= (1<<3); /* PB3 сконфигурировать как выход, индикаторный светодиод 3 */
/* PB4 */
/* PB5 */
/* PB6 */
/* PB7 */
/* PC0 */
DDRC |= (1<<1); /* PC1 сконфигурировать как выход, драйвер двигателя */
DDRC |= (1<<2); /* PC2 сконфигурировать как выход, драйвер двигателя */
DDRC |= (1<<3); /* PC3 сконфигурировать как выход, драйвер двигателя */
DDRC |= (1<<4); /* PC4 сконфигурировать как выход, драйвер двигателя */
/* PC5 */
/* PC6 */
/* PC7 */
/* PD0 */
DDRD &= (~(1<<1)); /* PD1 сконфигурировать как вход, канал радиоуправления */
DDRD &= (~(1<<2)); /* PD2 сконфигурировать как вход, канал радиоуправления */
DDRD &= (~(1<<3)); /* PD3 сконфигурировать как вход, канал радиоуправления */
DDRD &= (~(1<<4)); /* PD4 сконфигурировать как вход, канал радиоуправления */
DDRD &= (~(1<<5)); /* PD5 сконфигурировать как вход, TSOP 1 */
DDRD &= (~(1<<6)); /* PD6 сконфигурировать как вход, TSOP 2 */
DDRD &= (~(1<<7)); /* PD7 сконфигурировать как вход, TSOP 3 */
/* PD0 */
PORTD |= (1<<1); /* PD1 установить "1", включаем подтягивающий резистор */
PORTD |= (1<<2); /* PD2 установить "1", включаем подтягивающий резистор */
PORTD |= (1<<3); /* PD3 установить "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) /* бесконечный цикл */
{
/* проверка TSOP 1 */
if( !(PIND & (1<<5)) ) /* проверить "0" на PD5 */
{ PORTB |= (1<<1); } /* установить "1" на PB1 */
else
{ PORTB &= (~(1<<1)); } /* установить "0" на PB1 */
/* проверка TSOP 2 */
if( !(PIND & (1<<6)) ) /* проверить "0" на PD6 */
{ PORTB |= (1<<2); } /* установить "1" на PB2 */
else
{ PORTB &= (~(1<<2)); } /* установить "0" на PB2 */
/* проверка TSOP 3 */
if( !(PIND & (1<<7)) ) /* проверить "0" на PD7 */
{ PORTB |= (1<<3); } /* установить "1" на PB3 */
else
{ PORTB &= (~(1<<3)); } /* установить "0" на PB3 */
} /* закрывающая скобка бесконечного цикла */
} /* закрывающая скобка основной программы */
|
|
|
alex1991 |
Отправлено: 07 Июня, 2010 - 13:10:29
|
Генерал
Сообщений всего: 91
Дата рег-ции: Май 2010
|
решил проэксперементировать и хочу сделать так чтобы робот просто отъежает от препятствия
у меня три тсопа если есть препятствие на на 1 тсопе он примерно 1 сек поворачивает одну гусеницу а если есть препятствие на на 2 тсопе он примерно 1 сек едет назад и наконец если есть препятствие на на 3 тсопе он примерно 1 сек поворачивает другую гусеницу назад.
только у меня одна проблема дописал код который у меня был а он не хочет работать
светодиоды индикаторы работают а моторы нет но вроде они едва дергаются не пойму что не так вот код
#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
volatile int modulation=200; // длина всей посылки (можно менять)
SIGNAL(SIG_OVERFLOW0) //функция модуляции сигнала
{
if(modulation<20) //длина пачки
{
PORTB ^= 0b00000001;
PORTB ^= 0b00010000;
PORTB ^= 0b00100000;}
else
{
PORTB &= 0b00000000;
PORTB &= 0b00000000;
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) //основная программа
{
DDRB |= (1<<0); /* PB0 сконфигурировать как выход, ИК-светодиоды */
DDRB |= (1<<4); /* PB0 сконфигурировать как выход, ИК-светодиоды */
DDRB |= (1<<5); /* PB0 сконфигурировать как выход, ИК-светодиоды */
DDRB |= (1<<1); /* PB1 сконфигурировать как выход, индикаторный светодиод 1 */
DDRB |= (1<<2); /* PB2 сконфигурировать как выход, индикаторный светодиод 2 */
DDRB |= (1<<3); /* PB3 сконфигурировать как выход, индикаторный светодиод 3 */
/* PB4 */
/* PB5 */
/* PB6 */
/* PB7 */
/* PC0 */
DDRC |= (1<<1); /* PC1 сконфигурировать как выход, драйвер двигателя */
DDRC |= (1<<2); /* PC2 сконфигурировать как выход, драйвер двигателя */
DDRC |= (1<<3); /* PC3 сконфигурировать как выход, драйвер двигателя */
DDRC |= (1<<4); /* PC4 сконфигурировать как выход, драйвер двигателя */
/* PC5 */
/* PC6 */
/* PC7 */
/* PD0 */
DDRD &= (~(1<<1)); /* PD1 сконфигурировать как вход, канал радиоуправления */
DDRD &= (~(1<<2)); /* PD2 сконфигурировать как вход, канал радиоуправления */
DDRD &= (~(1<<3)); /* PD3 сконфигурировать как вход, канал радиоуправления */
DDRD &= (~(1<<4)); /* PD4 сконфигурировать как вход, канал радиоуправления */
DDRD &= (~(1<<5)); /* PD5 сконфигурировать как вход, TSOP 1 */
DDRD &= (~(1<<6)); /* PD6 сконфигурировать как вход, TSOP 2 */
DDRD &= (~(1<<7)); /* PD7 сконфигурировать как вход, TSOP 3 */
/* PD0 */
PORTD |= (1<<1); /* PD1 установить "1", включаем подтягивающий резистор */
PORTD |= (1<<2); /* PD2 установить "1", включаем подтягивающий резистор */
PORTD |= (1<<3); /* PD3 установить "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) /* бесконечный цикл */
{
/* проверка TSOP 1 */
if( !(PIND & (1<<5)) ) /* проверить "0" на PD5 */
{ PORTB |= (1<<1);
PORTB &= (~(1<<1));
PORTC |= _BV(PC1); // установить "1" на линии 1 порта C
PORTC &= ~_BV(PC2); // установить "0" на линии 2 порта C
PORTC |= _BV(PC3);
_delay_ms(1000);} // ждем 1 сек. /* установить "1" на PB1 */
else
{ PORTB &= (~(1<<1));
PORTC &= ~_BV(PC1); // установить "0" на линии 1 порта C
PORTC &= ~_BV(PC2); // установить "0" на линии 2 порта C
PORTC &= ~_BV(PC3); // установить "0" на линии 3 порта C
} /* установить "0" на PB1 */
(Добавление)
/* проверка TSOP 2 */
if( !(PIND & (1<<6)) ) /* проверить "0" на PD6 */
{ PORTB |= (1<<2);
PORTC &= ~_BV(PC1); // установить "0" на линии 1 порта C
PORTC |= _BV(PC2); // установить "1" на линии 2 порта C
PORTC &= ~_BV(PC3); // установить "0" на линии 3 порта C
PORTC |= _BV(PC4);
_delay_ms(1000);} // ждем 1 сек. } // установить "1" на линии 4 порта C} /* установить "1" на PB2 */
else
{ PORTB &= (~(1<<2));
PORTC &= ~_BV(PC1); // установить "0" на линии 1 порта C
PORTC &= ~_BV(PC2); // установить "0" на линии 2 порта C
PORTC &= ~_BV(PC3); // установить "0" на линии 3 порта C
PORTC &= ~_BV(PC4);} // установить "0" на линии 4 порта C} /* установить "1" на PB2 */ } /* установить "0" на PB2 */
/* проверка TSOP 3 */
if( !(PIND & (1<<7)) ) /* проверить "0" на PD7 */
{ PORTB |= (1<<3);
PORTC &= ~_BV(PC0); // установить "0" на линии 0порта D
PORTC |= _BV(PC1); // установить "1" на линии 1 порта D
PORTC |= _BV(PC2);
_delay_ms(1000);} // ждем 1 сек. // установить "1" на линии 2 порта D
else
{ PORTB &= (~(1<<3));
PORTC &= ~_BV(PC0); // установить "0" на линии 0порта D
PORTC &= ~_BV(PC1); // установить "0" на линии 1 порта D
PORTC &= ~_BV(PC2);} // установить "0" на линии 2 порта D
} /* закрывающая скобка бесконечного цикла */
} /* закрывающая скобка основной программы */
(Добавление)
вроде разобрался но снова не так как я хотел на препятствия отъежает но когда нет препятствия едет назад, вправо, влево, примерно по 1 сек каждая как убрать этот глюк в программе мне только нужно чтобы он включал свои моторы при препятствии вот код переделанный
#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
volatile int modulation=200; // длина всей посылки (можно менять)
SIGNAL(SIG_OVERFLOW0) //функция модуляции сигнала
{
if(modulation<20) //длина пачки
{
PORTB ^= 0b00000001;
PORTB ^= 0b00010000;
PORTB ^= 0b00100000;}
else
{
PORTB &= 0b00000000;
PORTB &= 0b00000000;
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) //основная программа
{
DDRB |= (1<<0); /* PB0 сконфигурировать как выход, ИК-светодиоды */
DDRB |= (1<<4); /* PB0 сконфигурировать как выход, ИК-светодиоды */
DDRB |= (1<<5); /* PB0 сконфигурировать как выход, ИК-светодиоды */
DDRB |= (1<<1); /* PB1 сконфигурировать как выход, индикаторный светодиод 1 */
DDRB |= (1<<2); /* PB2 сконфигурировать как выход, индикаторный светодиод 2 */
DDRB |= (1<<3); /* PB3 сконфигурировать как выход, индикаторный светодиод 3 */
/* PB4 */
/* PB5 */
/* PB6 */
/* PB7 */
/* PC0 */
DDRC |= (1<<1); /* PC1 сконфигурировать как выход, драйвер двигателя */
DDRC |= (1<<2); /* PC2 сконфигурировать как выход, драйвер двигателя */
DDRC |= (1<<3); /* PC3 сконфигурировать как выход, драйвер двигателя */
DDRC |= (1<<4); /* PC4 сконфигурировать как выход, драйвер двигателя */
/* PC5 */
/* PC6 */
/* PC7 */
/* PD0 */
DDRD &= (~(1<<1)); /* PD1 сконфигурировать как вход, канал радиоуправления */
DDRD &= (~(1<<2)); /* PD2 сконфигурировать как вход, канал радиоуправления */
DDRD &= (~(1<<3)); /* PD3 сконфигурировать как вход, канал радиоуправления */
DDRD &= (~(1<<4)); /* PD4 сконфигурировать как вход, канал радиоуправления */
DDRD &= (~(1<<5)); /* PD5 сконфигурировать как вход, TSOP 1 */
DDRD &= (~(1<<6)); /* PD6 сконфигурировать как вход, TSOP 2 */
DDRD &= (~(1<<7)); /* PD7 сконфигурировать как вход, TSOP 3 */
/* PD0 */
PORTD |= (1<<1); /* PD1 установить "1", включаем подтягивающий резистор */
PORTD |= (1<<2); /* PD2 установить "1", включаем подтягивающий резистор */
PORTD |= (1<<3); /* PD3 установить "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) /* бесконечный цикл */
{
/
(Добавление)
* проверка TSOP 1 */
if( !(PIND & (1<<5)) ) /* проверить "0" на PD5 */
{ PORTB |= (1<<1);
PORTC |= (1<<1); // установить "1" на линии 1 порта C
PORTC &= (~(1<<2)); // установить "0" на линии 2 порта C
PORTC |= (1<<3);
_delay_ms(1000); } /* установить "1" на PB1 */
else
{ PORTB &= (~(1<<1));
PORTC &= (~(1<<1)); // установить "0" на линии 1 порта C
PORTC &= (~(1<<2)); // установить "0" на линии 2 порта C
PORTC &= (~(1<<3)); // установить "0" на линии 3 порта C
} /* установить "0" на PB1 */
/* проверка TSOP 2 */
if( !(PIND & (1<<6)) ) /* проверить "0" на PD6 */
{ PORTB |= (1<<2);
PORTC &= (~(1<<1)); // установить "0" на линии 1 порта C
PORTC |= (1<<2); // установить "1" на линии 2 порта C
PORTC &= (~(1<<3)); // установить "0" на линии 3 порта C
PORTC |= (1<<4);;
_delay_ms(1000);} // установить "1" на линии 4 порта C} /* установить "1" на PB2 */
else
{ PORTB &= (~(1<<2));
PORTC &= (~(1<<1)); // установить "0" на линии 1 порта C
PORTC &= (~(1<<2)); // установить "0" на линии 2 порта C
PORTC &= (~(1<<3)); // установить "0" на линии 3 порта C
PORTC &= (~(1<<4));} // установить "0" на линии 4 порта C} /* установить "1" на PB2 */ } /* установить "0" на PB2 */
/* проверка TSOP 3 */
if( !(PIND & (1<<7)) ) /* проверить "0" на PD7 */
{ PORTB |= (1<<3);
PORTC &= (~(1<<1)); // установить "0" на линии 0порта D
PORTC |= (1<<2); // установить "1" на линии 1 порта D
PORTC |= (1<<3);
_delay_ms(1000);} // установить "1" на линии 2 порта D
else
{ PORTB &= (~(1<<3));
PORTC &= (~(1<<1)); // установить "0" на линии 0порта D
PORTC &= (~(1<<2)); // установить "0" на линии 1 порта D
PORTC &= (~(1<<3));} // установить "0" на линии 2 порта D
} /* закрывающая скобка бесконечного цикла */
} /* закрывающая скобка основной программы *(Отредактировано автором: 07 Июня, 2010 - 13:11:54) |
|
|
|
Поиск в теме | Версия для печати |
Страниц (8): « 1 2 3 4 5 6 [7] 8 » |
« Делаем роботов » |
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
|
|
|
|
|