реклама на сайте
подробности

 
 
> Передача информации с помощью ИК, необходимо передавать 4 команды с одного контроллера на другой
eugmai86
сообщение Mar 20 2011, 15:15
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 20-03-11
Пользователь №: 63 737



Доброго времени суток.
Пытаюсь передавать 4 команды от одного контроллера к другому. МК 1 Трансивер Tiny 13, приемник tiny2313. Передать одну команду(внешнее прерывание в тини) не проблема, все работает. А вот никак не могу разобраться с алгоритмом и его реализацией для нескольких команд.
Для передатчика использую следующий алгоритм:
Если нажата кнопка 1
-передаю 5 раз 20 импульсов с паузой 260мкс после каждого импульса
Если нажата кнопка 2
-передаю 10 раз 20 импульсов с паузой 260мкс после каждого импульса
...
Если нажата кнопка 4
-передаю 20 раз 20 импульсов с паузой 260мкс после каждого импульса


Приемник должен гонять таймер с частотой самого длинного импульса, в моем случае 26мкс(время 1 импульса)*20(кол-во пульсаций)*20(раз передается импульс)+260мкс(задержка после каждой пачки импульсов)*20(пачек импульсов)=15,6 мс. Что равно 64 Гц (если я не ошибаюсь).

В момент когда нажата кнопка на передатчике, на приемнике срабатывает внешнее прерывание

interrupt [EXT_INT0] void ext_int0_isr(void)
{
TCNT0=0xF0; //запускаем таймер 64 Гц, время самого длинного импульса
TCCR0B=0x04;

}

И в этот момент мне нужно посчитать сколько же было послано пачек 5,10, 15, или 20. Как не знаю. Застрял. Помогите. Может быть есть стандартные библиотеки для МК на этот случай.
Пишу в CVAVR
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
eugmai86
сообщение Mar 20 2011, 16:40
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 20-03-11
Пользователь №: 63 737



Дело в том, что у тини 13 нет UART

Т.е. если есть внешнее прерывание вызывается ф-ция обработки, она же считает сколько было изменений на ноге контроллера.
А как правильно таймер запустить чтоб он стартовал с начала сигнала и останавливался по переполнению, а не стартовал при каждом прерывании как у меня. Только не отправляйте в даташит, читал много раз и внимательно. Просто некому один раз в живую объяснить. Спасибо
char tick=0;
interrupt [EXT_INT0] void ext_int0_isr(void)
{
TCNT0=0xF0; //запускаем таймер 64 Гц, время самого длинного импульса
TCCR0B=0x04;
tick++;
}
void tick_calc (void)
{
if (0<<=5)
{
//do smth1
TCNT0=0x00; //останавливаю таймер
TCCR0B=0x00;
tick=0;//сбрасываю тики
}
...
if (15<tick<=20)
{
//do smth4
TCNT0=0x00; //останавливаю таймер
TCCR0B=0x00;
tick=0;
}
}
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 08:19
Рейтинг@Mail.ru


Страница сгенерированна за 0.01286 секунд с 7
ELECTRONIX ©2004-2016