CODE:
#include <avr/io.h>
#include <util/delay.h>
int main(void) /* начало основной программы */
{
int i;
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", включаем подтягивающий резистор */
/* ***** расчет временной задержки *****
Mk 1 MHz TSOP 36 KHz
1000000 / 36000 = 28
ИК-светодиод светит |||||| 14 | 10 | 18 | 6 | 22
ИК-светодиод не светит ||| 14 | 18 | 10 | 22 | 6
28 * 20 = 560 задержка между пачками
----------------------------------------
Mk 1 MHz TSOP 38 KHz
1000000 / 38000 = 26
ИК-светодиод светит |||||| 13 | 10 | 16 | 7 | 19
ИК-светодиод не светит ||| 13 | 16 | 10 | 19 | 7
26 * 20 = 520 задержка между пачками
----------------------------------------
Mk 1 MHz TSOP 40 KHz
1000000 / 40000 = 25
ИК-светодиод светит |||||| 13 | 10 | 15 | 7 | 18
ИК-светодиод не светит ||| 12 | 15 | 10 | 18 | 7
25 * 20 = 500 задержка между пачками
************************************** */
while(1) /* бесконечный цикл */
{
/* формирование пачки для TSOP 1 */
for(i=0;i<20;i++) /* Цикл определяет длину пачки. В данном случае цикл выполняется 20 раз. Рекомендованное количество повторов цикла от 15 до 50 */
{
/* то как выполняется код приведенный ниже зависит от схемы подключения ИК-светодиода к микроконтроллеру */
_delay_us(14); /* временная задержка определяющая время в течении которого ИК-светодиод не светит */
PORTD &= (~(1<<6)); /* установить "0" на PD6, ИК-светодиод светит */
_delay_us(14); /* временная задержка определяющая время в течении которого ИК-светодиод светит */
PORTD |= (1<<6); /* установить "1" на PD6, ИК-светодиод не светит */
}
/* проверка TSOP 1 */
if ( !(PIND & (1<<5)) ) /* проверить "0" на PD5 */
{ PORTB |= (1<<3); } /* установить "1" на PB3 */
else
{ PORTB &= (~(1<<3)); } /* установить "0" на PB3 */
_delay_us(560); /* временная задержка между пачками */
/* формирование пачки для TSOP 2 */
for(i=0;i<20;i++) /* Цикл определяет длину пачки. В данном случае цикл выполняется 20 раз. Рекомендованное количество повторов цикла от 15 до 50 */
{
/* то как выполняется код приведенный ниже зависит от схемы подключения ИК-светодиода к микроконтроллеру */
_delay_us(14); /* временная задержка определяющая время в течении которого ИК-светодиод не светит */
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); /* временная задержка между пачками */
} /* закрывающая скобка бесконечного цикла */
} /* закрывающая скобка основной программы */
В комментариях к программе, вроде все, указал. Изменять можно длину пачки, время свечения ИК светодиода и/или время когда ИК светодиод не светится. Одновременное изменение последних двух параметров приводит к изменению частоты.
(Добавление)
Еще одна светлая мысль посетила меня
Проверьте схему. ИК светодиоды и TSOPы соответствуют друг другу? А то может светится ИК светодиод расположенный рядом с одним TSOPом, а проверяется сигнал на другом?(Отредактировано автором: 24 Мая, 2010 - 19:30:08) |