Без описания |
Поиск в теме | Версия для печати |
ОЛЕГ |
Отправлено: 28 Мая, 2010 - 13:54:19
|
Супермодератор
Сообщений всего: 1732
Дата рег-ции: Нояб. 2008
|
nest пишет:там около килоома нужно, вроде бы, что б не такой дальнобойный был.
Да, килоомный будет оптимально.
Только не вместо 220 Ом, а последовательно с ним.
Иначе если Вы нечаянно выкрутите килоомный подстроечник в ноль и не будет постоянного резистора ом на 220, светодиоды могут сгореть.
alex1991 пишет:не пойму почему с этом куском работает а с моим нет
Ваш кусок просто подает 1 на порты, а потом 0.
Мой кусок, как бы, одевает на порт маску (как в фотошопе) и на включаемый порт (куда записана 1) подается меандр, который отсчитывается таймером.
Это вот если на пальцах, как я это понимаю.
Если Вы обратите внимание, написание совершенно разное. При чем дело даже не в том, что мне удобнее пользоваться бинарной системой, хотя это менее принято.
Потом не забывайте, что это специализированная функция SIGNAL(SIG_OVERFLOW), обработчик прерываний таймера. Не я ее придумал.
Nest, не мог бы ты осветить этот вопрос более научно?
Если я прав, то речь идет о побитовых логических операциях. |
|
|
ОЛЕГ |
Отправлено: 28 Мая, 2010 - 17:34:24
|
Супермодератор
Сообщений всего: 1732
Дата рег-ции: Нояб. 2008
|
Несколько не так.
Программа работает следующим образом.
Мы с Вами взяли timer0, который находится внутри МК и настроили его таким образом, чтобы он переполнялся 36 000 раз в секунду. Вру, 72 000.
Есть тактовый генератор, который тикает со скоростью 8 МГц. Чтобы получить частоту 36 КГц, нам нужно менять уровень сигнала на выходе МК с частотой 72 КГц. 8 МГц / 72 КГц = 111,11.
То есть, каждые 111 тиков генератора таймер должен переполняться.
Так и запишем: TCNT0 = 111;
TCCR0 - это предделитель. Таймер0- 8 битный и он не умеет считать больше 256. То есть наш делитель должен быть меньше 256, что не всегда подходит. Предделитель служит предварительным коэффициентом деления и может принимать значения 1(как у нас с Вами), 8, 64, 256. Это будет соответствовать условным обозначениям 1, 2, 3, 4. То есть, TCCR0 может быть равен 1, 2, 3, 4.
Получается, что если бы нам была нужна частота, скажем, 10 Кгц (то есть, уровни бы менялись с частотой 20 КГц), то 8000000/20000=400. Нам это не подходит, если мы используем таймер0 (есть и другие). Мы должны найти такой предделитель, на который бы 8000000 делилось нацело. Пусть 8. TCCR0=2; 8000000/8/20000=50. TCNT0 = 50; Частота мигания светодиода 10 КГц.
Наш код:
CODE:void init_timer0 ()
{cli(); //запретить все прерывания (чтобы таймер досчитал до конца)
TCNT0 = 111; //делитель
TCCR0 = 1; //предделитель
TIMSK = 1; //разрешение прерывания по переполнению
sei();} //разрешение прерывания (таймер уже досчитал)
Вот и получается, что когда таймер переполняется, происходит прерывание выполнения основной программы и вызывается функция обработчика прерывания SIGNAL(SIG_OVERFLOW0), в которой мы и меняем состояние порта с той частотой, на которую мы настроили наш таймер.
Если я в чем-то не прав, поправьте, пожалуйста.
А о побитовых логических операциях, мне кажется, Nest расскажет лучше меня. Я в них не очень. |
|
|
alex1991 |
Отправлено: 31 Мая, 2010 - 18:59:53
|
Генерал
Сообщений всего: 91
Дата рег-ции: Май 2010
|
есть один вопрос можно убрать один tsop в этой схеме.
просто я думаю сделать вот так
1 ик-посылает к примеру длина пачки if(modulation<20) зажигается 1 светодиод
2 ик-посылает к примеру длина пачки if(modulation<40) зажигается 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) //функция модуляции сигнала
{
if(modulation<20) //длина пачки
{
PORTB ^= 0b00000001;
PORTD ^= 0b01000000;
}
else
{
PORTB &= 0b00000000;
PORTD &= 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 сконфигурировать как выход, ИК-диод 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)
/* проверка 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 */
}
}
}
я думаю так сделать потому что части по бокам ик-бампера (ик-светодиод и тсоп) мешают друг другу я пытался изолировать друг от друга но они серавно мешают
и если убрать один тсоп то они будет устойчиво работать |
|
|
alex1991 |
Отправлено: 01 Июня, 2010 - 00:44:22
|
Генерал
Сообщений всего: 91
Дата рег-ции: Май 2010
|
то есть, к примеру, если есть препятствие и сигнал определенной длины волны с первого ик-светодиода, то есть генерированного с такой длиной волны, чтобы тсоп воспринимал эту частоту, как первый ик-светодиод, а если поступил сигнал на второй ик-светодиод с другой длиной волны, он воспринимал бы, как второй ик-светодиод
чтобы было понятнее, приведу пример с пультом тв:
при нажатии на кнопку 1 у пульта, пульт генерирует пачку частот которая поступает на (к примеру тсоп) у тв и он воспринимал и включает 1 канал у тв
при нажатии на кнопку 2 у пульта, пульт генерирует пачку частот которая поступает на (к примеру тсоп) у тв и он воспринимал и включает 2 канал у тв |
|
|
|
Поиск в теме | Версия для печати |
Страниц (8): « 1 2 3 4 5 [6] 7 8 » |
« Делаем роботов » |
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
|
|
|
|
|