www.open-tager.ru

открытый лазертаг форум
Текущее время: 22 ноя 2024, 10:38

Часовой пояс: UTC + 3 часа [ Летнее время ]


Реклама

Правила форума


В разделе запрещены - обсуждение оборудования не поддерживающего открытых протоколов, реклама и ссылки на готовые продукты лазертага, обсуждение политики производителей и самих производителей. Виден всем.



Начать новую тему Ответить на тему  [ Сообщений: 71 ]  На страницу Пред.  1, 2, 3, 4, 5, 6 ... 8  След.
Автор Сообщение
СообщениеДобавлено: 22 сен 2011, 13:11 
Не в сети
Местный

Зарегистрирован: 09 июн 2011, 11:32
Сообщений: 366
Откуда: Шахты
tommy писал(а):
jong73 писал(а):
Как варик можно в протеусе погонять

А железко на DX покупал вот бы ссылу или хоть примерные координаты где ты выкладывал ссылки, а то у меня цифровик то есть но в качестве запоминающего он работает как то стремно. Тут как бы анализатор рулит.
чёт я туплю и слабо въехал, что тут написано. но, да - как вариант, можно и в протеусе прогнать. брал здесь - http://www.aliexpress.com/product-gs/40 ... alers.html


Спасибо. Просто попросил ссылу на магазин где ты брал устройство и пожалался на свой цифровой осцил

_________________
Неважно откуда у тебя растут руки если они золотые.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 22 сен 2011, 13:16 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
jong73 писал(а):
Pingvin писал(а):
Теперь понял! :) Вы предлагаете работать на уровне бит. Я и такой вариант рассматривал, но пока не стал реализовывать, так как в прерывании придется крутить-вертеть битами, а это дополнительное процессорное время, что для прерывания не есть хорошо.
Но я и это вариант не исключаю ни коем образом. Сперва именно так и хотел сделать. Поживем - увидим. Пока делаю как проще (лично для меня).
Что касается хранения установок eeprom - разумеется! Так и будет, дайте срок.
И меняться значения будут по команде через COM-порт и/или посредством кнопок управления.
Пока нужно сделать основные вещи - обеспечит транспортный уровень (прием/передача), потом и до остального доберёмся.


Не бит а байт :oops: и ничего крутить не надо. Передаем в прерывание сначала байт с id_gamer ( это данные в буфере передатчика по индексу 0 ) последовательно сдвигая вправа а затем точно так же байт с цветом команды и ущербом. Время нахождение в прерывании равно толко времени инициаллизации передачи одного бита и установки идентификатора окончания передачи. У меня это около 8-10 циклов. Ниже написана процедура отправки бита в прерывание.



for( count_byte = 0; count_byte < length; ++count_byte )
{
for( count_bit = 0; count_bit < 8; ++count_bit )
{
if( bufer_ir_tx[count_byte] & 0x80 )
// передаю 1 ( в прерывании )
else // передаю 0
bufer_ir_tx[count_byte] <<= 1;
++count_bit;
while( // ожидание передачи бита )
}
}



Что значит
Цитата:
// передаю 1 ( в прерывании )
?
Как прерывание реализовано тогда?
Вы прерыванию по биту "скармливаете"?
Ну, на вкус и цвет ...
Я просто обнуляю курсор и разрешаю передачу, прерывание само все сделает.

_________________
Ваше оружие становиться значительно эффективней, если его снять с предохранителя!


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 22 сен 2011, 13:20 
Не в сети
Местный

Зарегистрирован: 09 июн 2011, 11:32
Сообщений: 366
Откуда: Шахты
to Pingvin

так будет выглядеть тело процедуры передачи произвольного числа бит ( задается аргументом length )

void send_ir_data( unsigned char length )
{
for( count_bit = 0,count_bit_change_byte = 0; count_bit < length; ++count_bit,++count_bit_change_byte )
{
if( count_bit_change_byte == 8 )
{
count_bit_change_byte = 0
++coun_byte;
}
if( bufer_ir_tx[count_byte] & 0x80 )
// передаю 1 ( в прерывании )
else // передаю 0
bufer_ir_tx[count_byte] <<= 1;
++count_bit;
while( // ожидание передачи бита )
}
count_byte = 0;
}

_________________
Неважно откуда у тебя растут руки если они золотые.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 22 сен 2011, 13:24 
Не в сети
Местный

Зарегистрирован: 09 июн 2011, 11:32
Сообщений: 366
Откуда: Шахты
в прерывании по совпадению таймера я считаю количество совпадений и когда досчитал устанавливаю флаг что закончил передачу и осстанавливаю таймер

bit end_interval_ir; // Флаг окончания формирования интервала
unsigned char count_interval; // Значение определяющее интервал в количестве совпадений в режиме СТС


// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
// Place your code here
if( --count_interval == 0 ) // Обратный счет совпадений и если совпало
end_interval_ir = 1; // устанавливаю флаг окончания передачи интервала
}


void ir_send_data( unsigned char length )
{
unsigned char coun_bit,count_change_bit,count_byte;
// Пока не переданы все биты увеличиваю счетчик бит для перехода на следующий байт и исполняю тело
for( coun_byte = 0,count_bit = 0,count_bit_change_byte = 0; count_bit < length; ++count_bit,++count_bit_change_byte )
{
// Когда байт побитно передан целиком
if( count_bit_change_byte == 8 )
{
count_bit_change_byte = 0 // сбрасываю счетчик бит в байте ( это не маразм )
++coun_byte; // и увеличиваю счетчик индекса байт
}
// Если старший бит в байте по индексу [count_byte] равен 1
if( bufer_ir_tx[count_byte] & 0x80 )

TCCR1A=0x40; // Настраиваю таймер Т1 в режим СТС чтобы дрыгать ногой с интервалом 13,88 мкс
TCCR1B=0x09;
OCR1AL=0x6F;
count_interval = 43; // Задаю сколько раз надо дрыгнуть для интервала 1200мкс
end_interval_ir = 0; // сбрасываю флаг окончания передачи интервала
while( !end_interval_ir ); // Ожидаю установки флага окончания ( см. прерывание )

TCCR1A=0x00; // Настраиваю таймер в режим СТС но ножку отключаю
TCCR1B=0x09;
OCR1AL=0x6F;
PORTB.1 = 0; // Устанавливаю 0 на выходе ОС1A ( обязательно а то гавкнется СИД )
count_interval = 21; // Задаю кол-во совпадений соответствующее паузе ( 600мкс )
end_interval_ir = 0; // Сбрасываю флаг окончания интервала
while( !end_interval_ir ); // Ожидаю флаг окончания иинтервала

// Иначе. старший бит 0 делаю как и для передачи 1 только с другим количеством дрыганий OC1A ( соотв 0 )
else
{
TCCR1A=0x40;
TCCR1B=0x09;
OCR1AL=0x6F;
count = 6;
end_interval_ir = 0;
while( !end_interval_ir );
PORTB.1 = 0;
TCCR1A=0x00;
TCCR1B=0x09;
OCR1AL=0x6F;
count = 3;
end_interval_ir = 0;
while( !end_interval_ir );
}
bufer_ir_tx[count_byte] <<= 1;
++count_bit;
while( // ожидание передачи бита )
}
TCCR1A=0x00; // Сбрасываю настройки таймера
TCCR1B=0x00;
OCR1AL=0x00;
}



Код написан только что потому как сам работаю с манчестером а не NEC так что возможно надо подправить но идея должна быть понятна. Если нет отмечаем отвечу.

_________________
Неважно откуда у тебя растут руки если они золотые.


Последний раз редактировалось jong73 22 сен 2011, 13:56, всего редактировалось 4 раз(а).

Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 22 сен 2011, 13:26 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
jong73 писал(а):
to Pingvin

так будет выглядеть тело процедуры передачи произвольного числа бит ( задается аргументом length )

void send_ir_data( unsigned char length )
{
for( count_bit = 0,count_bit_change_byte = 0; count_bit < length; ++count_bit,++count_bit_change_byte )
{
if( count_bit_change_byte == 8 )
{
count_bit_change_byte = 0
++coun_byte;
}
if( bufer_ir_tx[count_byte] & 0x80 )
// передаю 1 ( в прерывании )
else // передаю 0
bufer_ir_tx[count_byte] <<= 1;
++count_bit;
while( // ожидание передачи бита )
}
count_byte = 0;
}

Точно так я и планировал первоначально! Только делать это в прерывании хотел. :)
Да у Вас уже все реализовано а я "велосипед" изобретаю. :)
Ваш проект - закрытый?

_________________
Ваше оружие становиться значительно эффективней, если его снять с предохранителя!


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 22 сен 2011, 13:46 
Не в сети
Местный

Зарегистрирован: 09 июн 2011, 11:32
Сообщений: 366
Откуда: Шахты
Pingvin писал(а):
jong73 писал(а):
to Pingvin

так будет выглядеть тело процедуры передачи произвольного числа бит ( задается аргументом length )

void send_ir_data( unsigned char length )
{
for( count_bit = 0,count_bit_change_byte = 0; count_bit < length; ++count_bit,++count_bit_change_byte )
{
if( count_bit_change_byte == 8 )
{
count_bit_change_byte = 0
++coun_byte;
}
if( bufer_ir_tx[count_byte] & 0x80 )
// передаю 1 ( в прерывании )
else // передаю 0
bufer_ir_tx[count_byte] <<= 1;
++count_bit;
while( // ожидание передачи бита )
}
count_byte = 0;
}

Точно так я и планировал первоначально! Только делать это в прерывании хотел. :)
Да у Вас уже все реализовано а я "велосипед" изобретаю. :)
Ваш проект - закрытый?


Чуть выше глянь там и прерывание есть. Как видиш в теле прервания только сравнения с заданым кол-вом интервало а процедура send_ir_data вызывается по событиям программы ну скажем нажатия на курок.

Проект не закончен потому как леплю манчестер закончу поделюсь конечно.

_________________
Неважно откуда у тебя растут руки если они золотые.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 22 сен 2011, 13:55 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
jong73 писал(а):
в прерывании по совпадению таймера я считаю количество совпадений и когда досчитал устанавливаю флаг что закончил передачу и осстанавливаю таймер

bit end_interval_ir; // Флаг окончания формирования интервала
unsigned char count_interval; // Значение определяющее интервал в количестве совпадений в режиме СТС


// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
// Place your code here
if( --count_interval == 0 ) // Обратный счет совпадений и если совпало
end_interval_ir = 1; // устанавливаю флаг окончания передачи интервала
}


void ir_send_data( unsigned char length )
{
// Пока не переданы все биты увеличиваю счетчик бит для перехода на следующий байт и исполняю тело
for( coun_byte = 0,count_bit = 0,count_bit_change_byte = 0; count_bit < length; ++count_bit,++count_bit_change_byte )
{
// Когда байт побитно передан целиком
if( count_bit_change_byte == 8 )
{
count_bit_change_byte = 0 // сбрасываю счетчик бит в байте ( это не маразм )
++coun_byte; // и увеличиваю счетчик индекса байт
}
// Если старший бит в байте по индексу [count_byte] равен 1
if( bufer_ir_tx[count_byte] & 0x80 )

TCCR1A=0x40; // Настраиваю таймер Т1 в режим СТС чтобы дрыгать ногой с интервалом 13,88 мкс
TCCR1B=0x09;
OCR1AL=0x6F;
count_interval = 43; // Задаю сколько раз надо дрыгнуть для интервала 1200мкс
end_interval_ir = 0; // сбрасываю флаг окончания передачи интервала
while( !end_interval_ir ); // Ожидаю установки флага окончания ( см. прерывание )

TCCR1A=0x00; // Настраиваю таймер в режим СТС но ножку отключаю
TCCR1B=0x09;
OCR1AL=0x6F;
PORTB.1 = 0; // Устанавливаю 0 на выходе ОС1A ( обязательно а то гавкнется СИД )
count_interval = 21; // Задаю кол-во совпадений соответствующее паузе ( 600мкс )
end_interval_ir = 0; // Сбрасываю флаг окончания интервала
while( !end_interval_ir ); // Ожидаю флаг окончания иинтервала

// Иначе. старший бит 0 делаю как и для передачи 1 только с другим количеством дрыганий OC1A ( соотв 0 )
else
{
TCCR1A=0x40;
TCCR1B=0x09;
OCR1AL=0x6F;
count = 6;
end_interval_ir = 0;
while( !end_interval_ir );
PORTB.1 = 0;
TCCR1A=0x00;
TCCR1B=0x09;
OCR1AL=0x6F;
count = 3;
end_interval_ir = 0;
while( !end_interval_ir );
}
bufer_ir_tx[count_byte] <<= 1;
++count_bit;
while( // ожидание передачи бита )
}
TCCR1A=0x00; // Сбрасываю настройки таймера
TCCR1B=0x00;
OCR1AL=0x00;
}



Код написан только что потому как сам работаю с манчестером а не NEC так что возможно надо подправить но идея должна быть понятна. Если нет отмечаем отвечу.



Спасибо, понятно, Ваши замечания принял к сведению. Надеюсь, будем дискуссировать и впредь. :)

_________________
Ваше оружие становиться значительно эффективней, если его снять с предохранителя!


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 22 сен 2011, 14:07 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
tommy писал(а):
jong73 писал(а):
Как варик можно в протеусе погонять

А железко на DX покупал вот бы ссылу или хоть примерные координаты где ты выкладывал ссылки, а то у меня цифровик то есть но в качестве запоминающего он работает как то стремно. Тут как бы анализатор рулит.
чёт я туплю и слабо въехал, что тут написано. но, да - как вариант, можно и в протеусе прогнать. анализатор брал здесь - http://www.aliexpress.com/product-gs/40 ... alers.html

То есть сигнал снят с реального "железа"?
Фактически - осциллограмма?
Спасибо! Круто!
Хочу такой же!!! :x

_________________
Ваше оружие становиться значительно эффективней, если его снять с предохранителя!


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 22 сен 2011, 14:10 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
jong73 писал(а):
Pingvin писал(а):
jong73 писал(а):
to Pingvin

так будет выглядеть тело процедуры передачи произвольного числа бит ( задается аргументом length )

void send_ir_data( unsigned char length )
{
for( count_bit = 0,count_bit_change_byte = 0; count_bit < length; ++count_bit,++count_bit_change_byte )
{
if( count_bit_change_byte == 8 )
{
count_bit_change_byte = 0
++coun_byte;
}
if( bufer_ir_tx[count_byte] & 0x80 )
// передаю 1 ( в прерывании )
else // передаю 0
bufer_ir_tx[count_byte] <<= 1;
++count_bit;
while( // ожидание передачи бита )
}
count_byte = 0;
}

Точно так я и планировал первоначально! Только делать это в прерывании хотел. :)
Да у Вас уже все реализовано а я "велосипед" изобретаю. :)
Ваш проект - закрытый?


Чуть выше глянь там и прерывание есть. Как видиш в теле прервания только сравнения с заданым кол-вом интервало а процедура send_ir_data вызывается по событиям программы ну скажем нажатия на курок.

Проект не закончен потому как леплю манчестер закончу поделюсь конечно.


А как относитесь к варианту 2 в 1.
И Милес и Манчестер в одном флаконе? ;)

_________________
Ваше оружие становиться значительно эффективней, если его снять с предохранителя!


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 22 сен 2011, 14:18 
Не в сети
Местный

Зарегистрирован: 09 июн 2011, 11:32
Сообщений: 366
Откуда: Шахты
Я подумаю только у меня мега48 4 кило памяти программ. Боюсь не помещюсь

вот полный текст с заголовком закинутый в компилятор и с исправленным синтаксисом. Требует дальнейшей оптимизации в виде процедуры запуска таймера что бы не делать одно и тоже несколько раз

#include <mega48.h>

void send_ir_data( unsigned char );

unsigned char count_interval,bufer_ir_tx[20];
bit end_interval_ir;

// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
// Place your code here
if( --count_interval == 0 )
end_interval_ir = 1;
}

// Declare your global variables here

void main(void)
{
// Инит PIN OC1A OUT
DDRB=0x02;
// Timer/Counter 1 Interrupt(s) initialization
TIMSK1=0x02;
// Global enable interrupts
#asm("sei")

while (1)
{
// Как только ножка 0 порта D окажетса в 0
if( PIND.0 == 0 )
send_ir_data( 14 ); // Передаю 14 бит из буфера который надо предварительно заполнить
};
}

void send_ir_data( unsigned char length )
{
unsigned char count_bit,count_bit_change_byte,count_byte;

// Передаю стартовый импульс
TCCR1A=0x40; // Настраиваю таймер Т1 в режим СТС чтобы дрыгать ногой с интервалом 13,88 мкс
TCCR1B=0x09;
OCR1AL=0x6F;
count_interval = 86; // Задаю сколько раз надо дрыгнуть для интервала 2400 мкс
end_interval_ir = 0; // сбрасываю флаг окончания передачи интервала
while( !end_interval_ir ); // Ожидаю установки флага окончания ( см. прерывание )

TCCR1A=0x00; // Настраиваю таймер в режим СТС но ножку отключаю
TCCR1B=0x09;
OCR1AL=0x6F;
PORTB.1 = 0; // Устанавливаю 0 на выходе ОС1A ( обязательно а то гавкнется СИД )
count_interval = 21; // Задаю кол-во совпадений соответствующее паузе ( 600мкс )
end_interval_ir = 0; // Сбрасываю флаг окончания интервала
while( !end_interval_ir ); // Ожидаю флаг окончания иинтервала


// Пока не переданы все биты увеличиваю счетчик бит для перехода на следующий байт и исполняю тело
for( count_byte = 0,count_bit = 0,count_bit_change_byte = 0; count_bit < length; ++count_bit,++count_bit_change_byte )
{
// Когда байт побитно передан целиком
if( count_bit_change_byte == 8 )
{
count_bit_change_byte = 0; // сбрасываю счетчик бит в байте ( это не маразм )
++count_byte; // и увеличиваю счетчик индекса байт
}
// Если старший бит в байте по индексу [count_byte] равен 1
if((bufer_ir_tx[count_byte] & 0x80) > 0 )
{
TCCR1A=0x40; // Настраиваю таймер Т1 в режим СТС чтобы дрыгать ногой с интервалом 13,88 мкс
TCCR1B=0x09;
OCR1AL=0x6F;
count_interval = 43; // Задаю сколько раз надо дрыгнуть для интервала 1200мкс
end_interval_ir = 0; // сбрасываю флаг окончания передачи интервала
while( !end_interval_ir ); // Ожидаю установки флага окончания ( см. прерывание )

TCCR1A=0x00; // Настраиваю таймер в режим СТС но ножку отключаю
TCCR1B=0x09;
OCR1AL=0x6F;
PORTB.1 = 0; // Устанавливаю 0 на выходе ОС1A ( обязательно а то гавкнется СИД )
count_interval = 21; // Задаю кол-во совпадений соответствующее паузе ( 600мкс )
end_interval_ir = 0; // Сбрасываю флаг окончания интервала
while( !end_interval_ir ); // Ожидаю флаг окончания иинтервала

}
// Иначе. старший бит 0 делаю как и для передачи 1 только с другим количеством дрыганий OC1A ( соотв 0 )
else
{
TCCR1A=0x40;
TCCR1B=0x09;
OCR1AL=0x6F;
count_interval = 21;
end_interval_ir = 0;
while( !end_interval_ir );
PORTB.1 = 0;
TCCR1A=0x00;
TCCR1B=0x09;
OCR1AL=0x6F;
count_interval = 21;
end_interval_ir = 0;
while( !end_interval_ir );
}
}
TCCR1A=0x00; // Сбрасываю настройки таймера
TCCR1B=0x00;
OCR1AL=0x00;
}

_________________
Неважно откуда у тебя растут руки если они золотые.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 71 ]  На страницу Пред.  1, 2, 3, 4, 5, 6 ... 8  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на форуме

Сейчас этот форум просматривают: Google [Bot] и гости: 35


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB