Без описания |
Поиск в теме | Версия для печати |
mihail |
Отправлено: 23 Мая, 2010 - 17:59:05
|
Гуру
Сообщений всего: 1065
Дата рег-ции: Март 2010
|
Со светодиодом нужно смотреть, чтобы ток через него не превышал возможности микроконтроллера.
Я ничего из подключенного к микроконтроллеру не забыл?
Если нет, то впуть
Первая проверочная программа
CODE:
#include<avr/io.h>
#include <util/delay.h>
#define F_CPU 8000000UL /* частота в герцах, для кварцевого резонатора 8 MHz */
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", включаем подтягивающий резистор */
/* ***** расчет временной задержки *****
1 / 36000 * 1000000 / 2 = 14
1 / 36000 * 1000000 * 20 = 555
************************************** */
while(1)
{
PORTB |= (1<<3); /* установить "1" PB3 */
PORTB &= (~(1<<4)); /* установить "0" на PB4 */
_delay_ms(1000); /* временная задержка */
PORTB |= (1<<4); /* установить "1" на PB4 */
PORTB &= (~(1<<3)); /* установить "0" на PB3 */
_delay_ms(1000); /* временная задержка */
} /* закрывающая скобка бесконечного цикла */
} /* закрывающая скобка основной программы */
Работает программе так: одну секунду горит один индикаторный светодиод, а другую - другой и так пока есть ток (Отредактировано автором: 23 Мая, 2010 - 18:03:21) |
|
|
mihail |
Отправлено: 23 Мая, 2010 - 21:52:37
|
Гуру
Сообщений всего: 1065
Дата рег-ции: Март 2010
|
Измените Makefile
F_CPU = 1000000
CODE:
#include<avr/io.h>
#include <util/delay.h>
/* #define F_CPU 8000000UL частота в герцах, для кварцевого резонатора 8 MHz */
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", включаем подтягивающий резистор */
/* ***** расчет временной задержки *****
1 / 36000 * 1000000 / 2 = 14
1 / 36000 * 1000000 * 20 = 555
************************************** */
while(1)
{
PORTB |= (1<<3); /* установить "1" PB3 */
PORTB &= (~(1<<4)); /* установить "0" на PB4 */
_delay_ms(1000); /* временная задержка */
PORTB |= (1<<4); /* установить "1" на PB4 */
PORTB &= (~(1<<3)); /* установить "0" на PB3 */
_delay_ms(1000); /* временная задержка */
} /* закрывающая скобка бесконечного цикла */
} /* закрывающая скобка основной программы */
Сколько времени светит один светодиод? |
|
|
mihail |
Отправлено: 23 Мая, 2010 - 22:50:06
|
Гуру
Сообщений всего: 1065
Дата рег-ции: Март 2010
|
Манипуляции с фьюзами требуют хорошего понимания того, что делаешь, иначе ничем хорошим это не закончится.
Установите в Makefile частоту 1 Мгц
Попробуйте так
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", включаем подтягивающий резистор */
/* ***** расчет временной задержки *****
1 / 36000 * 1000000 / 2 = 14
1 / 36000 * 1000000 * 20 = 555
************************************** */
while(1)
{
PORTB |= (1<<3); /* установить "1" PB3 */
PORTB &= (~(1<<4)); /* установить "0" на PB4 */
_delay_ms(1000); /* временная задержка */
PORTB |= (1<<4); /* установить "1" на PB4 */
PORTB &= (~(1<<3)); /* установить "0" на PB3 */
_delay_ms(1000); /* временная задержка */
} /* закрывающая скобка бесконечного цикла */
} /* закрывающая скобка основной программы */
Для ИК-бампера на TSOPах очень важно точно определять время. |
|
|
mihail |
Отправлено: 24 Мая, 2010 - 01:59:11
|
Гуру
Сообщений всего: 1065
Дата рег-ции: Март 2010
|
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", включаем подтягивающий резистор */
/* ***** расчет временной задержки *****
1 MHz
1 / 36000 * 1000000 / 2 = 14
1 / 36000 * 1000000 * 20 = 555
8 MHz
1 / 36000 * 8000000 / 2 = 111
1 / 36000 * 8000000 * 20 = 4444
************************************** */
while(1)
{
/* формирование пачки для TSOP 1 */
for(i=0;i<20;i++) /* цикл выполняется 20 раз */
{
PORTD |= (1<<6); /* установить "1" на PD6 */
_delay_us(14); /* временная задержка */
PORTD &= (~(1<<6)); /* установить "0" на PD6 */
_delay_us(14); /* временная задержка */
}
_delay_us(555); /* временная задержка */
/* формирование пачки для TSOP 2 */
for(i=0;i<20;i++) /* цикл выполняется 20 раз */
{
PORTB |= (1<<0); /* установить "1" на PB0 */
_delay_us(14); /* временная задержка */
PORTB &= (~(1<<0)); /* установить "0" на PB0 */
_delay_us(14); /* временная задержка */
}
_delay_us(555); /* временная задержка */
} /* закрывающая скобка бесконечного цикла */
} /* закрывающая скобка основной программы */
Эта программа должна мигать ИК-светодиодами. Мигать они должны очень быстро. Чтобы увидеть их свет нужно воспользоваться цифровым фотоаппаратом (даже с мобильного телефона сгодится). Заодно проверьте мои расчеты по задержкам. |
|
|
mihail |
Отправлено: 24 Мая, 2010 - 02:29:55
|
Гуру
Сообщений всего: 1065
Дата рег-ции: Март 2010
|
Вот собственно и вся программа для ИК бампера на TSOP. Я надеюсь
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
1 / 36000 * 1000000 / 2 = 14
1 / 36000 * 1000000 * 20 = 555
Mk 8 MHz TSOP 36 KHz
1 / 36000 * 8000000 / 2 = 111
1 / 36000 * 8000000 * 20 = 4444
************************************** */
while(1)
{
/* формирование пачки для TSOP 1 */
for(i=0;i<20;i++) /* цикл выполняется 20 раз */
{
_delay_us(14); /* временная задержка */
PORTD |= (1<<6); /* установить "1" на PD6 */
_delay_us(14); /* временная задержка */
PORTD &= (~(1<<6)); /* установить "0" на PD6 */
}
/* проверка TSOP 1 */
if ( !(PIND & (1<<5)) ) /* проверить "0" на PD5 */
{ PORTB |= (1<<3); } /* установить "1" на PB3 */
else
{ PORTB &= (~(1<<3)); } /* установить "0" на PB3 */
_delay_us(555); /* временная задержка */
/* формирование пачки для TSOP 2 */
for(i=0;i<20;i++) /* цикл выполняется 20 раз */
{
_delay_us(14); /* временная задержка */
PORTB |= (1<<0); /* установить "1" на PB0 */
_delay_us(14); /* временная задержка */
PORTB &= (~(1<<0)); /* установить "0" на PB0 */
}
/* проверка TSOP 2 */
if ( !(PIND & (1<<7)) ) /* проверить "0" на PD7 */
{ PORTB |= (1<<4); } /* установить "1" на PB4 */
else
{ PORTB &= (~(1<<4)); } /* установить "0" на PB4 */
_delay_us(555); /* временная задержка */
} /* закрывающая скобка бесконечного цикла */
} /* закрывающая скобка основной программы */
Если к бамперу приближать белый лист бумаги, то индикаторные светодиоды должны на него реагировать.(Отредактировано автором: 24 Мая, 2010 - 02:44:01) |
|
|
|
Поиск в теме | Версия для печати |
Страниц (8): « 1 [2] 3 4 5 6 7 8 » |
« Делаем роботов » |
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
|
|
|
|
|