www.open-tager.ru

открытый лазертаг форум
Текущее время: 25 апр 2024, 23:17

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


Реклама

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


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



Начать новую тему Ответить на тему  [ Сообщений: 5319 ]  На страницу Пред.  1 ... 32, 33, 34, 35, 36, 37, 38 ... 532  След.
Автор Сообщение
 Заголовок сообщения: Re: LTAscetik
СообщениеДобавлено: 07 авг 2012, 16:07 
Не в сети
Старожил
Аватар пользователя

Зарегистрирован: 31 май 2012, 23:29
Сообщений: 507
Откуда: Украина, Энергодар
Это оно?
http://zps-electronics.com/docs/wiegand ... eader_avr/
а вот здесь http://radioparty.ru/index.php/device-a ... uch-memory тоже ключ по одному проводу

а вот описывают якобы живую схему http://radio-hobby.org/modules/news/art ... oryid=1016

_________________
Точно попавшая в цель стрела - есть результат тысячи промахов.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: LTAscetik
СообщениеДобавлено: 07 авг 2012, 17:03 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
furhunter писал(а):
Это оно?
http://zps-electronics.com/docs/wiegand ... eader_avr/
а вот здесь http://radioparty.ru/index.php/device-a ... uch-memory тоже ключ по одному проводу

а вот описывают якобы живую схему http://radio-hobby.org/modules/news/art ... oryid=1016


Да у меня "живой" девайс на msp430f149 лежит и всё нормально считывает.
Исходники для этого девайса пытаюсь на Атмегу переташить (функции для работы с ТачМемори)!
Но в старом девайсе я к земле притягивал отдельным портом через транзистор.
Другой порт считывал данные.
На Атмеге всё делает один порт.
Вроде импульс присутствия контроллер считывает.
Далее должен отослать команду "считать из ОЗУ" (0x33) потом считывается серийный номер устройства, а затем несколько байт данных и crc.
При считывании почему то считываются все "1". :( :?
То ли команду не понимает TM ключ, то ли контроллер считать не может, то ли ещё что мешает... :?
Осциллограф бы, глянуть что там твориться, но нету!
В магазине только один за 20 тысяч. :(
Раньше был у меня школьный, выкинул, наверно, нигде найти не могу.

Попробую на макетке собрать и с нуля начать.
"В слепую" всё же неудобно...

Куски кода выложу, может ошибка где затесалась.

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: LTAscetik
СообщениеДобавлено: 07 авг 2012, 18:51 
Не в сети
Старожил
Аватар пользователя

Зарегистрирован: 31 май 2012, 23:29
Сообщений: 507
Откуда: Украина, Энергодар
Ок. И схемку на старую версию подключения выложи.

_________________
Точно попавшая в цель стрела - есть результат тысячи промахов.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: LTAscetik
СообщениеДобавлено: 08 авг 2012, 08:34 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
Вот старые исходники
Функция передачи данных:
Код:
/*****************************************************************************
 * tm_send
 *
 * Отправка байта.
 */
static void tm_send( unsigned char byte )
{
    static unsigned char i,b;
    b=byte;
    for( i = 0; i < 8; i++ )
    {
        unsigned char pulldown_time, recovery_time;

        if( b & 1 )
        {
            /* write-one time slot */
            pulldown_time = 10;
            recovery_time = 80;
        }
        else
        {
            /* write-zero time slot */
            pulldown_time = 70;
            recovery_time = 20;
        }
        dint();
        TM_TX_PULLDOWN();
        tm_delay( pulldown_time );
        TM_TX_RELEASE();
        eint();
        tm_delay( recovery_time );
        b >>= 1;
    }
}


Функция приема данных:
Код:
/*****************************************************************************
 * tm_read
 *
 * Приём байта.
 */
static unsigned char tm_read()
{
    static unsigned char i, ret = 0;

    for( i = 0; i < 8; i++ )
    {
        unsigned char in;

        dint();
        TM_TX_PULLDOWN();
        tm_delay( 5 );
        TM_TX_RELEASE();
        tm_delay( 5 );
        in = TM_RX_IN;
        eint();
        ret >>= 1;
        if( in & TM_RX_PIN )
            ret |= BIT7;
        /* release & recovery */
        tm_delay( 200);
    }
    return ret;
}


Подсчёт crc:

Код:
/*****************************************************************************
 * new_crc8
 *
 * Вычисление нового значения CRC8.
 */
static unsigned char new_crc8( unsigned char crc8, unsigned char byte )
{
    unsigned char i;

    for( i = 0; i < 8; i++ )
    {
        if( (crc8 ^ byte) & 1 )
            crc8 = ((crc8 ^ 0x18) >> 1) | 0x80;
        else
            crc8 >>= 1;
        byte >>= 1;
    }
    return crc8;
}


Ну и функция чтения номера ключа:

Код:
/*****************************************************************************
 * read_serial_number
 *
 * Чтение кода ключа и запись события в очередь главной задачи.
 */
static void read_serial_number()
{       
    static unsigned char k;
    read_attempts = 240;
    tm_event=no_tm_event;
    k=0;
    while( read_attempts-- )
    {

    static unsigned char n, crc8;

        /* задержка через каждые 16 попыток */
        if( (read_attempts & 15) == 0 )
            {
             timer_3=0;
             while(timer_3 < 3);
            }

        tm_delay(512);
        /* reset */
        TM_TX_PULLDOWN();
        tm_delay( 480 );  /* tRSTL > 480us */

        /* завершаем импульс сброса, проверяем уровень, должен быть высокий */
        dint();
        TM_TX_RELEASE();
        tm_delay( 7 );   /* 15us minimum tPDH */
        if( (TM_RX_IN & TM_RX_PIN) == 0 )
        {
            /* вероятно, вход просто закорочен */
            eint();
            continue;
        }

        /* контролируем presence pulse */
        tm_delay(80);  /* 60us minimum tPDL */
        n = TM_RX_IN;
        eint();
        if( n & TM_RX_PIN )
            /* что-то не так, уровень должен оставаться низким */
            continue;

        /* ожидаем завершения presence pulse */

        tm_delay(240); /* tPDL */
        if( !(TM_RX_IN & TM_RX_PIN) )
            /* таймаут */
            continue;


        /* выдерживаем высокий уровень tRSTH */
        tm_delay( 480 );

        /* посылаем команду Read ROM */
        tm_send( 0x33 );

        /* читаем тип устройства */
        n = tm_read();
        if( 0 == n )
        /* тип устройства не может быть нулевым */
        continue;
       
        crc8 = new_crc8( 0, n );

        /* читаем код */
        for( n = 0; n < 6; n++ )
        {
            unsigned char code = tm_read();
            tm_code[ n ] = code;
            crc8 = new_crc8( crc8, code );
        }

        /* читаем crc8 и проверяем */
        if( tm_read() != crc8 )
           {
            tm_event=tm_crc_error;
            continue;
           }
        else { tm_event=tm_crc_ok;  return;}
           
    }
}


На msp430F149 все это отлично работает!
Вроде всё то же пытаюсь на Атмеге повторить - ни чего не выходит! :? :(
Читаются одни "1" - то есть все прочитанные байты = 255. :(
Чего надо? :?
Уже мозг кипит! :evil:
Уже на отдельной плате собрал и с транзистором для подтяжки - не хочет работать.
Может и ошибка то где то на поверхности, но "не поглазам"! :(
Осциллограф мог бы прояснить ситуацию, уже нашел за 5 тысяч в "Радиолюбителе", но получку надо ждать.

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: LTAscetik
СообщениеДобавлено: 08 авг 2012, 08:55 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
А это я на Атмеге пробую
Код:
#define TM_TX_PULLDOWN()   PORTA|=(1<<7)
#define TM_TX_RELEASE()   PORTA&=~(1<<7)    



/*************************************************************************
 delay loop for small accurate delays: 16-bit counter, 4 cycles/loop
*************************************************************************/
static inline void _delayFourCycles(unsigned int __count)
{
    if ( __count == 0 )   
        __asm__ __volatile__( "rjmp 1f\n 1:" );    // 2 cycles
    else
        __asm__ __volatile__ (
           "1: sbiw %0,1" "\n\t"                 
           "brne 1b"                              // 4 cycles/loop
           : "=w" (__count)
           : "0" (__count)
          );
}


/*************************************************************************
delay for a minimum of <us> microseconds
the number of loops is calculated at compile-time from MCU clock frequency
*************************************************************************/
#define delay(us)  _delayFourCycles( ( ( 1*(F_CPU/4000) )*us)/1000 )



volatile  unsigned char ch;
volatile unsigned char crc8;
volatile unsigned char code;
volatile unsigned char in;
volatile unsigned char tm_code[6]; //считанный код ключа Touch_memory

/**************************************************************************************
* Функция выполняет настройку внешних прерываний вывода INT1
***************************************************************************************/
void init_tm(void){

DDRD &=~(1<<3);             //Настраиваем вывод INT1 как вход
PORTD&=~(1<<3);               //Выключаем подтягивающий резистор
DDRA|=(1<<7);
PORTA&=~(1<<7);


}



/*****************************************************************************
 * tm_send
 *
 * Отправка байта.
 */
void tm_send( unsigned char byte )
{
    unsigned char i,b;
    b=byte;
    for( i = 0; i < 8; i++ )
    {
        volatile unsigned char pulldown_time, recovery_time;

        if( b & 1 )
        {
            /* write-one time slot */
            pulldown_time = 10;
            recovery_time = 80;
        }
        if (b&1==0)
        {
            /* write-zero time slot */
            pulldown_time = 70;
            recovery_time = 20;
        }
        TM_TX_PULLDOWN();
      
        delay( pulldown_time );
        TM_TX_RELEASE();
        delay( recovery_time );
        b >>= 1;
    }
}


/*****************************************************************************
 * tm_read
 *
 * Приём байта.
 */
unsigned char tm_read()
{
    unsigned char i, ret = 0;

    for( i = 0; i < 8; i++ )
    {

        TM_TX_PULLDOWN();
        delay( 5 );
        TM_TX_RELEASE();
      delay(5);

        in =  (PIND) & (1<<3);
        ret >>= 1;
        if(in)
            ret |= (1<<7);
        /* release & recovery */
        delay( 200);
    }
    return ret;
}


/*****************************************************************************
 * new_crc8
 *
 * Вычисление нового значения CRC8.
 */
unsigned char new_crc8( unsigned char crc8, unsigned char byte )
{
    unsigned char i;

    for( i = 0; i < 8; i++ )
    {
        if( (crc8 ^ byte) & 1 )
            crc8 = ((crc8 ^ 0x18) >> 1) | 0x80;
        else
            crc8 >>= 1;
        byte >>= 1;
    }
    return crc8;
}




void tm_read_serial_number()
{       

uint8_t read_attempts = 1;
while( read_attempts-- )
    {
      delay(512);




      /* reset */
      TM_TX_PULLDOWN();
      delay(480);  /* tRSTL > 480us */
      /* завершаем импульс сброса, проверяем уровень, должен быть высокий */
      TM_TX_RELEASE();

      delay(7);   /* 15us minimum tPDH */
       if( (PIND&(1<<3)) == 0 )
        {
            /* вероятно, вход просто закорочен */
            continue;
        }
          /* контролируем presence pulse */
       
      delay(80);  /* 60us minimum tPDL */

      if( PIND&(1<<3) )
            /* что-то не так, уровень должен оставаться низким */
            continue;

      /* ожидаем завершения presence pulse */

        delay(240); /* tPDL */
        if( !(PIND&(1<<3)) )
            /* таймаут */
            continue;

      /* выдерживаем высокий уровень tRSTH */
        delay( 480 );
      
        /* посылаем команду Read ROM */
        tm_send( 0x33 );

 /* читаем тип устройства */
     
      ch = tm_read();
        if( 0 == ch)
        /* тип устройства не может быть нулевым */

       
        continue;

      

       crc8 = new_crc8( 0, ch );


 /* читаем код */
        for( ch = 0; ch < 6; ch++ )
        {
            code = tm_read();
            tm_code[ ch ] = code;
            crc8 = new_crc8( crc8, code );
        }
 /* читаем crc8 и проверяем */
        ch = tm_read();
      if( ch != crc8 )
         continue;
   
        else { return;}

   }


}    


Извиняюсь за "портянку".

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: LTAscetik
СообщениеДобавлено: 08 авг 2012, 12:54 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
И всё-таки на макетке я ТачМемори запустил! :)
Не думал, что столько геморроя с ним будет! :shock:
У знакомого взял осциллограф, достал из загашника свой старый девайс, попытался сравнить импульсы - толком не получилось, так как старый девайс одноразово опрашивал ключ и успокаивался на этом - фиг чего разглядишь.
Пришлось вспоминать, как программировать msp430, подправить прошивку, чтобы ключ опрашивался в цикле.
В итоге выяснилось, что при передачи данных ключу тайминги раза в два больше.
Ключ просто не мог правильно считать команду.
Пришлось "в ручную и на глаз" подбирать значение задержек.
Почему тут теория разошлась с практикой - не знаю... :( :?

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: LTAscetik
СообщениеДобавлено: 08 авг 2012, 13:10 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
Заработала и на основной плате на одной ножке! :)
Фу...
Можно идти дальше! ;) :)

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: LTAscetik
СообщениеДобавлено: 08 авг 2012, 13:28 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
Подправил функцию передачи данных:
Код:
/*****************************************************************************
 * tm_send
 *
 * Отправка байта.
 */
void tm_send( unsigned char byte )
{
    unsigned char i,b;
    b=byte;
    for( i = 0; i < 8; i++ )
    {
        volatile unsigned char pulldown_time, recovery_time;

        if( b & 1 )
        {
         /* write-one */
         TM_TX_PULLDOWN();
           TM_TX_RELEASE();
         delay( 80 );   
        }
        if ((b&1)==0)
        {
          /* write-zero */
            TM_TX_PULLDOWN();
         delay( 70 );
           TM_TX_RELEASE();
             delay( 20 );             
        }

        b >>= 1;
    }
}




Вроде и не сильно то подправил!
Ну слава Богу и осциллографу!
А то я было уже приуныл... :)

Осталась проблема нехватки памяти - я же звуки уже "порезал", чтобы с ТМ попробовать. :(

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: LTAscetik
СообщениеДобавлено: 08 авг 2012, 15:10 
Не в сети
Старожил
Аватар пользователя

Зарегистрирован: 31 май 2012, 23:29
Сообщений: 507
Откуда: Украина, Энергодар
Бурные овации!
А звук стоит перенести на микросхему памяти. Иначе с программой не выкрутимся.
Вчера вытравил первые платки. Все чинно. Фоторезист рулит. Единственно, режим травления платы нужно выбрать очень точно, что бы не перетравить. Уж больно дорожки тонкие.

Я упростил одну платку. Убрал МАХ232 и оставил прямые выводы TX и RX. Прикинул, некоторым оно без надобности. У меня, к примеру, вот такое в багаже имеется http://easyelectronics.ru/preobrazovate ... 232rl.html

_________________
Точно попавшая в цель стрела - есть результат тысячи промахов.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: LTAscetik
СообщениеДобавлено: 08 авг 2012, 15:27 
Не в сети
Старожил
Аватар пользователя

Зарегистрирован: 31 май 2012, 23:29
Сообщений: 507
Откуда: Украина, Энергодар
Pingvin, как тебе тема http://inspect.com.ua/creative-work/83- ... ukami.html

_________________
Точно попавшая в цель стрела - есть результат тысячи промахов.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 5319 ]  На страницу Пред.  1 ... 32, 33, 34, 35, 36, 37, 38 ... 532  След.

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


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11


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

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