www.open-tager.ru
http://www.open-tager.ru/forum/

Проект - точка доминирования с таймером (старт)
http://www.open-tager.ru/forum/viewtopic.php?f=5&t=2204
Страница 2 из 4

Автор:  mail_robot [ 17 ноя 2013, 18:23 ]
Заголовок сообщения:  Re: Проект - точка доминирования с таймером (старт)

да я как то думаю что итак хватит )) наши одобрямс дали, а для меня это главное. Кто захочет сделать под себя - исходники будут в открытом доступе. Хоть олимпийское табло туда вкорячить можно при желании

снайпер кстати в прицел отлично разглядит индикатор и передаст по рации если попросят. У нас все с рациями бегают. Игрок без связи - анахронизм. И команды без связи обычно в лузерах. Ну оно и понятно - координации на поле нет

Автор:  zverev.perm [ 17 ноя 2013, 19:48 ]
Заголовок сообщения:  Re: Проект - точка доминирования с таймером (старт)

Тем более что для статус-бара придется еще что то наколхаживать, ног МК для управления не хватит.

Автор:  Pingvin [ 17 ноя 2013, 21:40 ]
Заголовок сообщения:  Re: Проект - точка доминирования с таймером (старт)

zverev.perm писал(а):
Тем более что для статус-бара придется еще что то наколхаживать, ног МК для управления не хватит.

Так вот и дорастем до "Аскета"! :lol: :lol: :lol:
"Созреем", так сказать! ;) :)
Чуток бы времени свободного побольше - показал бы, как можно и с 4 и 10 дисплеями работать + светодиодные линейки + звук + ... сами продолжите!
Не точка будет - новогодняя ёлка! ;) :lol:

Автор:  mail_robot [ 23 ноя 2013, 10:51 ]
Заголовок сообщения:  Re: Проект - точка доминирования с таймером (старт)

Один раз эту елку пнут и вешай новые игрушки ))))

Автор:  Pingvin [ 23 ноя 2013, 11:46 ]
Заголовок сообщения:  Re: Проект - точка доминирования с таймером (старт)

mail_robot писал(а):
Один раз эту елку пнут и вешай новые игрушки ))))

Ну пнуть что угодно можно!
Дурак и вашу точку поламает, не сомневайтесь.

Автор:  mail_robot [ 24 ноя 2013, 06:58 ]
Заголовок сообщения:  Re: Проект - точка доминирования с таймером (старт)

Первое правило надежности - чем меньше деталей, тем надежнее девайс. Мой надо будет попинать чуть подольше )))

Автор:  mail_robot [ 08 дек 2013, 10:40 ]
Заголовок сообщения:  Re: Проект - точка доминирования с таймером (старт)

дописал таки толковую функцию приема байта по ИК каналу, которая не чувствительна к длине пакета и достаточно простая и компактная. Но работать будет только на PIC16F886, потому как задействует ресурсы железа для разгрузки программной части

для отработки прерываний по фронту и срезу использован модель CCP1 процессора, чтобы не заморачиваться с прерываниями на портах. Для счета соответственно таймер TMR1, который работает автоматически. То есть управляется внешним сигналом GATE, от TSOPа. Как только сигнал падает в ноль, таймер начинает считать сам, потом по прерыванию от ССP он свое значение защелкивает в его регистры хранения (все это железка сама делает). Нам остается только считать его показания, переключить модуль CCP на прерывание теперь уже по фронту и просто сидеть и ждать следующего события. Каждый бит принятый при активном сигнале TSOP сохраняется в массиве. А каждое значение длинны паузы проверяется на соответствие и в случае превышения длинны паузы фиксируется битый пакет. Отработка конца передачи производится в основном цикле программы по обычному таймауту. 0,035 сек примерно

Код:
if (CCP1IF)
    {
        CCP_buf = CCPR1;                // save CCPR1
        CCP1IF = 0;                     // clear interrupt flag
        TMR1 = 0x0000;                  // clear TMR1

        if (CCP1M0)                     // if last interrupt on rising
        {
            T1GINV = 1;                 // rising count enable
            CCP1M0 = 0;                 // next interrupt on falling
        }
        else
        {
            T1GINV = 0;                 // falling count enable
            CCP1M0 = 1;                 // next interrupt on rising
        }

        // bit receive handler
        if (RX_START)
        {
            if (!CCP1M0)                // after each rising edge
            {
                _input[packet_counter] = CCP_buf; // recieve bit without encoding
                packet_counter ++;              // increment bit counter
            }
           
            // error recieving handler
            if (CCP1M0 && CCP_buf > 1300 || CCP_buf <1100)       // if bit too long or too short, then error
            {
                RX_START = 0;                   // stop recieve
                RX_END = 0;                     // clear flags
                packet_counter = 0;             // and counters
            }
        }

        // start bit handler
        if (RX_START == 0 && CCP1M0 == 0 && CCP_buf > 4700 && CCP_buf < 4900)           // start packet receiving if header detect
        {
            RX_START = 1;                                             // detect start bit
        }   
    }


в код основного цикла пишем то что ниже, для отработки конца пакета

Код:
while (1)
{
// end of packet handler
if (TMR1IF) EndOfPacketHndl(); 
}

// end of packet handler
void EndOfPacketHndl(void)
{
    TMR1IF = 0;                         // clear interrupt flag
    T1GINV = 0;                         // switch count on falling
    TMR1 = 0x0000;                      // clear Timer 1
    CCP1M0 = 0;                         // reset next interrupt on falling

    if (packet_counter > 10)            // packet received succsessful
        {
            RX_START = 0;               // reset RX flag
            RX_END = 1;                 // set end flag
            packet_counter = 0;         // clear counter
        }
        else                            // packet corrupt
        {
            RX_START = 0;               // reset RX flag
            RX_END = 0;                 // ERROR
            packet_counter = 0;         // clear counter
        }
}


тут я немножко упростил проверки, и битость пакета проверяется просто по длине. Врятли придет сразу 10 помех, да еще и с правильными паузами. Поэтому если пакет короче ожидаемого, то просто гасим его да и все как ошибочный.
а дальше с массивом _input[] можно делать все что угодно. Я забил на декодирование, так как мне нужен только цвет команды

все значения в массиве будут иметь размер ровно вдвое больше, чем предполагаемый бит, потому как разрешение счетчика 0,5 мкс
к примеру если нолик у нас равен по длинне 600 мс, то его значение в массиве будет примерно 1200 (плюс минус)
единичка соответственно вдвое длиннее, то есть 2400 в десятичном измерении

Автор:  Pacifist [ 08 дек 2013, 10:53 ]
Заголовок сообщения:  Re: Проект - точка доминирования с таймером (старт)

А на проверки длительностей импульсов тоже "забили" ? ;)
К примеру
Код:
 if (RX_START == 0 && CCP1M0 == 0 && CCP_buf > 4000)
- любой импульс с длительностью больше 2мс будет считаться стартовым?

Длительности пауз вообще не проверяете?
Код:
if (CCP1M0 && CCP_buf > 1800)       // if bit too long, then error
если больше 900мкс - тогда ошибка. А если 100мкс, тогда все норм?

Автор:  mail_robot [ 08 дек 2013, 10:59 ]
Заголовок сообщения:  Re: Проект - точка доминирования с таймером (старт)

да, любой импульс больше 2 мс будет стартовым
длительность пауз проверяю, остальное нет. Потому как эту проверку можно будет сделать потом при разборе пакета. Просто если длина битов будет выходить за рамки допуска (К примеру какой то окажется 800) весь пакет браковать да и все

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

Автор:  mail_robot [ 08 дек 2013, 11:03 ]
Заголовок сообщения:  Re: Проект - точка доминирования с таймером (старт)

зато получилось очень компактно и ресурсы проца почти не жрет лишними прерываниями
у того же Пингвина в коде я заметил, что счетчик импульсов обновляется по каждому (!) прерыванию таймера 2. А это вообще то затратно по ресурсам. Может я что не так понял конечно, но прочитал так

Страница 2 из 4 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/