Без описания |
Поиск в теме | Версия для печати |
ОЛЕГ |
Отправлено: 25 Мая, 2010 - 02:07:50
|
Супермодератор
Сообщений всего: 1732
Дата рег-ции: Нояб. 2008
|
Я что-то как-то долго не мог понять суть обсуждаемой здесь проблемы, поэтому не встревал.
Заинтересовался скоростью света. Расчет верный, но не нужно игнорировать данные даташита. Там указана максимальная дальность действия TSOP, она составляет всего 30 метров.
По сути:
mihail, Ваш код верен, но, Вы абсолютно правы, он будет корректно работать только по прерываниям с TSOP. И там есть сложность с обработкой двух прерываний одновременно, т.к. они имеют разный приоритет.
Я предлагаю код на таймере:
CODE:
#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) //функция модуляции сигнала
{
TCNT0 = 0;
if(modulation<20) //длина пачки (можно менять)
{PORTB ^= 0b00000010;} //маска полезного меандра на порт В1 (хоть на какой)
else
{PORTB &= 0b00000000;} //когда пачка заканчивается- маска паузы
if(modulation<200) //для счета длины посылки
{modulation++;}
else
{modulation=0;}
}
void init_timer0 () //настройка таймера 0
{cli();
TCNT0 = 222;
TCCR0 = 1;
TIMSK = 1;
sei();
}
int main(void) //основная программа
{
DDRB = 0b11111111; // выход
PORTB = 0b00000000;
DDRD = 0b00000000; // вход
PORTD = 0b11111111;
DDRC = 0b00000000; // вход
PORTC = 0b11111111;
_delay_ms(100); //сброс ложного сигнала тсопа при включении (можно убрать)
init_timer0(); //инициализация таймера!!!
while(1)
{
//ЗДЕСЬ ВАШ КОД
//сначала опрашиваем оба фотоприемника одновременно,
//потом по отдельности каждый
//нагромождение команд будет мешать своевременному опросу фотоприемников- т.е.
//сначала опрашиваем, а потом все остальное
}
}
|
|
|
alex1991 |
Отправлено: 25 Мая, 2010 - 10:32:44
|
Генерал
Сообщений всего: 91
Дата рег-ции: Май 2010
|
снизу в программе можно сразу добать после while(1) свои код ?а то я добавил код и не чего работает
(Добавление)
или как поменять порт в строчке
if(modulation<20) //длина пачки (можно менять)
{PORTB ^= 0b00000010;} //маска полезного меандра на порт В1 (хоть на какой) например на В2
(Добавление)
вот как вставил код но он вообще не работает даже на пульт не реагирует наверно не правильно
#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) //функция модуляции сигнала
{
TCNT0 = 0;
if(modulation<20) //длина пачки (можно менять)
{PORTB ^= 0b0000001;} //маска полезного меандра на порт В1 (хоть на какой)
else
{PORTB &= 0b00000001;} //когда пачка заканчивается- маска паузы
if(modulation<20) //длина пачки (можно менять)
{PORTD ^= 0b0100000;} //маска полезного меандра на порт В1 (хоть на какой)
else
{PORTD &= 0b01000000;} //когда пачка заканчивается- маска паузы
if(modulation<200) //для счета длины посылки
{modulation++;}
else
{modulation=0;}
}
void init_timer0 () //настройка таймера 0
{cli();
TCNT0 = 222;
TCCR0 = 1;
TIMSK = 1;
sei();
}
int main(void) //основная программа
{
DDRB |= (1<<0); /* PB0 сконфигурировать как выход, ИК-диод 2 */
/* PB1 */
/* PB2 */
DDRB |= (1<<3); /* PB3 сконфигурировать как выход, индикаторный светодиод 1 */
DDRB |= (1<<4); /* PB4 сконфигурировать как выход, индикаторный светодиод 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 сконфигурировать как выход, ИК-диод 1 */
DDRD &= (~(1<<7)); /* PD7 сконфигурировать как вход, TSOP 2 */
/* 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", включаем подтягивающий резистор */
/* PD6 */
PORTD |= (1<<7); /* PD7 установить "1", включаем подтягивающий резистор */
_delay_ms(100); //сброс ложного сигнала тсопа при включении (можно убрать)
init_timer0(); //инициализация таймера!!!
while(1)
{if ( !(PIND & (1<<5)) ) /* проверить "0" на PD5 */
{ PORTB |= (1<<3); } /* установить "1" на PB3 */
else
{ PORTB &= (~(1<<3)); } /* установить "0" на PB3 */
if ( !(PIND & (1<<7)) ) /* проверить "0" на PD7 */
{ PORTB |= (1<<4); } /* установить "1" на PB4 */
else
{ PORTB &= (~(1<<4)); } /* установить "0" на PB4 */
/* проверка TSOP 1 */
if ( !(PIND & (1<<5)) ) /* проверить "0" на PD5 */
{ PORTB |= (1<<3); } /* установить "1" на PB3 */
else
{ PORTB &= (~(1<<3)); } /* установить "0" на PB3 */
_delay_us(560); /* временная задержка между пачками */
PORTB &= (~(1<<0)); /* установить "0" на PD6, ИК-светодиод светит */
_delay_us(14); /* временная задержка определяющая время в течении которого ИК-светодиод светит */
PORTB |= (1<<0); /* установить "1" на PD6, ИК-светодиод не светит */
}
/* проверка TSOP 2 */
if ( !(PIND & (1<<7)) ) /* проверить "0" на PD7 */
{ PORTB |= (1<<4); } /* установить "1" на PB4 */
else
{ PORTB &= (~(1<<4)); } /* установить "0" на PB4 */
_delay_us(560); /* временная задержка между пачками */
} |
|
|
ОЛЕГ |
Отправлено: 25 Мая, 2010 - 13:50:37
|
Супермодератор
Сообщений всего: 1732
Дата рег-ции: Нояб. 2008
|
mihail пишет:nest ОЛЕГ
нет слов
Спасибо!
Пост принял.
alex1991, итак:
Тактируем МК частотой 8 МГц.
ИК-светодиоды логичнее подключить к одной ноге МК через транзисторный ключ. Это целесообразно по всем соображениям, но не критично.
Вообще я придерживаюсь мнения, что лучше всегда сначала продумать использование портов, а не припаивать куда припаялось, а потом ломать голову и путаться в программе.
Да, согласен, есть сложные проекты, где это невозможно. Но на стадии разработки лучше все-таки не мудрить.
Вот к примеру, у Вас есть:
1. светодиоды, ИК-светодиоды. Повесьте их на порт В.
2. радиоуправление, фотоприемники- на порт С, к примеру.
3. управление драйвером- порт D.
Увидите, насколько Вам будет проще и удобнее. А когда программа заработает как ей положено- можно уже усложнять. Это так, мысли вслух.
Если делать как Вы хотите, то нужно так:
CODE:SIGNAL(SIG_OVERFLOW0) //функция модуляции сигнала
{
TCNT0 = 0;
if(modulation<100) //длина пачки (можно менять)
{PORTB ^= 0b0000001;
PORTD ^= 0b01000000;} //маска полезного меандра на порт В0 и D6
else
{PORTB &= 0b00000000;
PORTD &= 0b000000000;} //когда пачка заканчивается- маска паузы на порт В0 и D6
if(modulation<5000) //для счета длины посылки
{modulation++;}
else
{modulation=0;}
}
Инициализацию портов я глянул мельком- не везде включена подтяжка резисторами.
Затем:
CODE:if ( !(PIND & (1<<5)) ) /* проверить "0" на PD5 */
{ PORTB |= (1<<3); } /* установить "1" на PB3 */
else
{ PORTB &= (~(1<<3)); } /* установить "0" на PB3 */
if ( !(PIND & (1<<7)) ) /* проверить "0" на PD7 */
{ PORTB |= (1<<4); } /* установить "1" на PB4 */
else
{ PORTB &= (~(1<<4)); } /* установить "0" на PB4 */
/* проверка TSOP 1 */
if ( !(PIND & (1<<5)) ) /* проверить "0" на PD5 */
{ PORTB |= (1<<3); } /* установить "1" на PB3 */
else
{ PORTB &= (~(1<<3)); } /* установить "0" на PB3 */
Здесь я вообще не понял. Я же писал, что сначала мы проверяем TSOPы, а только потом делаем все остальное.
Зачем вот это:
CODE:_delay_us(560); /* временная задержка между пачками */
PORTB &= (~(1<<0)); /* установить "0" на PD6, ИК-светодиод светит */
_delay_us(14); /* временная задержка определяющая время в течении которого ИК-светодиод светит */
PORTB |= (1<<0); /* установить "1" на PD6, ИК-светодиод не светит */ ?
Все пачки и временные задержки мы делаем вот тут:
CODE:SIGNAL(SIG_OVERFLOW0) //функция модуляции сигнала .
(Добавление)
Кстати, возможно, Ваш код реагирует на лентяйку от телевизора. Только Вы не видите этого.
Подумайте, почему?
(Добавление)
А зачем Вам два ИК-светодиода на разных портах? |
|
|
alex1991 |
Отправлено: 25 Мая, 2010 - 15:33:39
|
Генерал
Сообщений всего: 91
Дата рег-ции: Май 2010
|
есть, кажется я разобрался просто нужно было разобратся в программе
включается светодиод с расстояния 5см больше принципе мне не надо горят светодиоды не совсем ярко может частоту точнее в программе надо подбирать если что я оставлю код его так и так надо доработать
P.S хочу выразить огромную благодарность mihail , nest и олегу
#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) //функция модуляции сигнала
{
TCNT0 = 0;
if(modulation<20) //длина пачки (можно менять)
{PORTB |= (1<<0); /* PB0 сконфигурировать как выход, ИК-диод 2 */
} //маска полезного меандра на порт В1 (хоть на какой)
else
{PORTB &= (~(1<<0));} /* PB0 сконфигурировать как выход, ИК-диод 2 */ //когда пачка заканчивается- маска паузы
if(modulation<20) //длина пачки (можно менять)
{PORTD |= (1<<6) ;} //маска полезного меандра на порт В1 (хоть на какой)
else
{PORTD &= (~(1<<6));} //когда пачка заканчивается- маска паузы
if(modulation<200) //для счета длины посылки
{modulation++;}
else
{modulation=0;}
}
void init_timer0 () //настройка таймера 0
{cli();
TCNT0 = 222;
TCCR0 = 1;
TIMSK = 1;
sei();
}
int main(void) //основная программа
{
DDRB |= (1<<0); /* PB0 сконфигурировать как выход, ИК-диод 2 */
/* PB1 */
/* PB2 */
DDRB |= (1<<3); /* PB3 сконфигурировать как выход, индикаторный светодиод 1 */
DDRB |= (1<<4); /* PB4 сконфигурировать как выход, индикаторный светодиод 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 сконфигурировать как выход, ИК-диод 1 */
DDRD &= (~(1<<7)); /* PD7 сконфигурировать как вход, TSOP 2 */
/* 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", включаем подтягивающий резистор */
/* PD6 */
PORTD |= (1<<7); /* PD7 установить "1", включаем подтягивающий резистор */
_delay_ms(100); //сброс ложного сигнала тсопа при включении (можно убрать)
init_timer0(); //инициализация таймера!!!
while(1)
{if ( !(PIND & (1<<5)) ); /* проверить "0" на PD5 */
if ( !(PIND & (1<<7)) ); /* проверить "0" на PD7 */
/* проверка TSOP 1 */
if ( !(PIND & (1<<5)) ) /* проверить "0" на PD5 */
{ PORTB |= (1<<3); } /* установить "1" на PB3 */
else
{ PORTB &= (~(1<<3)); } /* установить "0" на PB3 */
/* проверка TSOP 2 */
if ( !(PIND & (1<<7)) ) /* проверить "0" на PD7 */
{ PORTB |= (1<<4); } /* установить "1" на PB4 */
else
{ PORTB &= (~(1<<4)); } /* установить "0" на PB4 */
}
} |
|
|
ОЛЕГ |
Отправлено: 25 Мая, 2010 - 17:07:25
|
Супермодератор
Сообщений всего: 1732
Дата рег-ции: Нояб. 2008
|
alex1991, я не понимаю, зачем Вы что-то спрашиваете, если Вы не читаете то что Вам отвечают и делаете все по-своему.
alex1991 пишет:просто нужно было разобратся в программе
Для этого мы тут и общаемся.
alex1991 пишет:включается светодиод с расстояния 5см
Потому что он подключен напрямую к МК. С транзистором будет больше.
alex1991 пишет:может частоту точнее в программе надо подбирать
Не надо. Частота составляет 36036 Гц (в моем варианте, в Вашем- не знаю). Точнее не получится.
alex1991 пишет:горят светодиоды не совсем ярко
Потому что программа, приведенная Вами выше работает не так, как Вам кажется. То есть, не работает. |
|
|
|
Поиск в теме | Версия для печати |
Страниц (8): « 1 2 3 [4] 5 6 7 8 » |
« Делаем роботов » |
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
|
|
|
|
|