www.open-tager.ru http://www.open-tager.ru/forum/ |
|
LTAscetik http://www.open-tager.ru/forum/viewtopic.php?f=5&t=1565 |
Страница 252 из 532 |
Автор: | tommy [ 08 апр 2013, 12:10 ] |
Заголовок сообщения: | Re: LTAscetik |
Pingvin писал(а): Либо используем ШИМ для формирования несущей (переделываем схему). хоть и не принимаю участия в разработке, но всячески плюсую ну или в 112КГц прерывании только инвертировать ногу и больше ничего не делать. |
Автор: | Jumpy [ 08 апр 2013, 13:38 ] |
Заголовок сообщения: | Re: LTAscetik |
25.02.2013 был пост от вас. Цитата: Попробовал отключать прерывания - вроде получается! Пуляет и ловит пули (на 36 000). На 56 000 надо ТСОП искать. Но надо аккуратно все перепроверить - багов можно наделать... Если эт как то поможет. (204 страница) |
Автор: | Pingvin [ 08 апр 2013, 14:27 ] |
Заголовок сообщения: | Re: LTAscetik |
Фу. Все нормально. Ложная тревога, но порядок надо навести. Пробовал ставить кварц на 18 МГц - девайс вроде запускается, но как только ставлю в свойствах проекта 18000000 - фигня какая то творится. Короче - пока играем на 53300 Гц. Вроде чувствительность хорошая - зажимал датчик в руке и пробивает. Светодиод без тубуса. |
Автор: | hexFF [ 08 апр 2013, 22:23 ] |
Заголовок сообщения: | Re: LTAscetik |
не успевает прерывание отработать, тут гадать не надо. компилятор на прерывание минимум 70-80 тактов хоронит, на сохранение и восстановление РОН. на ассемблере- самое оно, тактов 25-30 вместе с уходом на вектор и возвратом. |
Автор: | Pingvin [ 09 апр 2013, 05:42 ] |
Заголовок сообщения: | Re: LTAscetik |
hexFF писал(а): не успевает прерывание отработать, тут гадать не надо. компилятор на прерывание минимум 70-80 тактов хоронит, на сохранение и восстановление РОН. на ассемблере- самое оно, тактов 25-30 вместе с уходом на вектор и возвратом. А помочь сможете? Я в AVR-овском ассемблере ни бум-бум... Как то же ещё значения из переменных в регистры передать надо. Вот, собственно, код прерывания Код: /**************************************************************************************
* Обработчик прерываний таймера ***************************************************************************************/ ISR(TIMER2_COMP_vect){ static volatile uint8_t prt; prt = TSOP_IN&TSOP_PIN; if (prt==0) //На ножке ИК-приемника низкий уровень сигнала (пойман сигнал несущей) { low_level_counter++;//Увеличиваем счетчик длительности низкоуровнего сигнала на ножке ИК-приемника } else //На ножке ИК-приемника высокий уровень сигнала (пойман сигнал несущей) { high_level_counter++;///Увеличиваем счетчик длительности высокоуровнего сигнала на ножке ИК-приемника if((start_bit_received)&&(high_level_counter > IR_ZERO*8)) {//Фиксируем окончание приема по таймауту start_bit_received = false; //отменяем прием rx_event = RX_COMPLETE; //Генерим событие "принят пакет" receiver_on = false;//выключаем приемник if (ir_transmitter_on==false) TIMSK &=~_BV(OCIE2); //если передача не ведётся - выключаем прерывания } if((high_level_counter > IR_ZERO*8)&&(ir_transmitter_on==false)) { receiver_on = false;//выключаем приемник TIMSK &=~_BV(OCIE2); } } if (ir_transmitter_on==true) {//Если передача разрешена if (ir_pulse_counter > 0) //необходимая длительность пачки импульсов { //ещё не достигнута, "мигаем" дальше IR_LED_INVERT; //необходимая длительность пачки ir_pulse_counter--; } else //пачка импульсов была отправлена, { IR_LED_OFF; //тушим ИК-диод if ( ir_space_counter > 0) //проверим, выдержан ли промежуток между импульсами { //нет, промежуток не выдержан IR_LED_OFF; //тушим ИК-диод ir_space_counter--; //уменьшаем обратный счетчик паузы на один "тик" } else //Пакет импульсов и промежуток между битами переданы { //нужно формировать следующую пачку (передаваемый бит) if (data_packet.data[cursor_position]!=0) //если указатель указывает не на пустую ячейку { ir_pulse_counter =data_packet.data[cursor_position++] ; //передадим импульс указанной длительностью ir_space_counter = IR_SPACE; //и про паузу не забудем } else //Все данные переданы (элемент, на который ссылается указатель, равен 0) { ir_transmitter_on=false; //выключаем передатчик FIRE_LED_OFF; display_bullets_update_now++; // если if (!receiver_on) //если нет приема пакета { TIMSK &=~_BV(OCIE2); // Запрещаем прерывания по захвату/сравнению } } } } } else {//Если передача запрещена } } |
Автор: | Pingvin [ 09 апр 2013, 08:39 ] |
Заголовок сообщения: | Re: LTAscetik |
Возникла мысль (идея подсказана LTagKirov) - измерять длительность принятых пачек от другого таймера - который 8000 Гц молотит. Тем самым разгрузим прерывание, формирующее несущую! 8000 Гц это 125 микросекунд на период. То есть "нолику" (600 микросекунд по протоколу) должно соответствовать 4 тика. "Единичке" (1200 микросекунд по протоколу) - 9 тиков. Старт-биту (2400 микросекунд по протоколу) - 19 тиков. Надо попробовать. |
Автор: | tommy [ 09 апр 2013, 09:02 ] |
Заголовок сообщения: | Re: LTAscetik |
а может ещё и входящий сигнал убрать совсем из прерывания, хотяб. вход же на инт0 висит - там свои прерывания есть. |
Автор: | Pingvin [ 09 апр 2013, 09:51 ] |
Заголовок сообщения: | Re: LTAscetik |
tommy писал(а): а может ещё и входящий сигнал убрать совсем из прерывания, хотяб. вход же на инт0 висит - там свои прерывания есть. Убрал. Вынес прием в другое прерывание. Сократил передающий обработчик до такого состояния Код: /************************************************************************************** * Обработчик прерываний таймера ***************************************************************************************/ ISR(TIMER2_COMP_vect){ if (ir_transmitter_on==true) {//Если передача разрешена if (ir_pulse_counter > 0) //необходимая длительность пачки импульсов { //ещё не достигнута, "мигаем" дальше IR_LED_INVERT; //необходимая длительность пачки ir_pulse_counter--; } else //пачка импульсов была отправлена, { IR_LED_OFF; //тушим ИК-диод if ( ir_space_counter > 0) //проверим, выдержан ли промежуток между импульсами { //нет, промежуток не выдержан ir_space_counter--; //уменьшаем обратный счетчик паузы на один "тик" } else //Пакет импульсов и промежуток между битами переданы { //нужно формировать следующую пачку (передаваемый бит) if (data_packet.data[cursor_position]!=0) //если указатель указывает не на пустую ячейку { ir_pulse_counter =data_packet.data[cursor_position++] ; //передадим импульс указанной длительностью ir_space_counter = IR_SPACE; //и про паузу не забудем } else //Все данные переданы (элемент, на который ссылается указатель, равен 0) { ir_transmitter_on=false; //выключаем передатчик FIRE_LED_OFF; display_bullets_update_now++; TIMSK &=~_BV(OCIE2); // Запрещаем прерывания по захвату/сравнению } } } } else {//Если передача запрещена } } Похрен. Дальше жать - только на ассемблер переходить. Может, где то математика подводит? |
Автор: | Pingvin [ 09 апр 2013, 10:01 ] |
Заголовок сообщения: | Re: LTAscetik |
Точно!!!!! Математика!!!!!! Считаем! Код: #define IR_START (IR_START_BIT_DURATION*2*IR_F0)/1000000 //Длительность заголовка //выраженная в "тиках" таймера 2400*2*56000/1000000=268!!!!!!! Разумеется, 268 в байт не помещается!!!! 2400*2*53300/1000000=255! Деление целочисленное! Старт-бит не влазиет. Твою дивизию!!! Как обойти ограничение? Какие идеи? Понял как - старт бит не ложим в буфер передатчика, а передаем отдельно. Решаемо! |
Автор: | Jumpy [ 09 апр 2013, 10:24 ] |
Заголовок сообщения: | Re: LTAscetik |
Ура ? |
Страница 252 из 532 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |