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

LTAscetik
http://www.open-tager.ru/forum/viewtopic.php?f=5&t=1565
Страница 35 из 532

Автор:  furhunter [ 07 авг 2012, 16:07 ]
Заголовок сообщения:  Re: LTAscetik

Это оно?
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

Автор:  Pingvin [ 07 авг 2012, 17:03 ]
Заголовок сообщения:  Re: LTAscetik

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 тысяч. :(
Раньше был у меня школьный, выкинул, наверно, нигде найти не могу.

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

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

Автор:  furhunter [ 07 авг 2012, 18:51 ]
Заголовок сообщения:  Re: LTAscetik

Ок. И схемку на старую версию подключения выложи.

Автор:  Pingvin [ 08 авг 2012, 08:34 ]
Заголовок сообщения:  Re: LTAscetik

Вот старые исходники
Функция передачи данных:
Код:
/*****************************************************************************
 * 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 тысяч в "Радиолюбителе", но получку надо ждать.

Автор:  Pingvin [ 08 авг 2012, 08:55 ]
Заголовок сообщения:  Re: LTAscetik

А это я на Атмеге пробую
Код:
#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;}

   }


}    


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

Автор:  Pingvin [ 08 авг 2012, 12:54 ]
Заголовок сообщения:  Re: LTAscetik

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

Автор:  Pingvin [ 08 авг 2012, 13:10 ]
Заголовок сообщения:  Re: LTAscetik

Заработала и на основной плате на одной ножке! :)
Фу...
Можно идти дальше! ;) :)

Автор:  Pingvin [ 08 авг 2012, 13:28 ]
Заголовок сообщения:  Re: LTAscetik

Подправил функцию передачи данных:
Код:
/*****************************************************************************
 * 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;
    }
}




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

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

Автор:  furhunter [ 08 авг 2012, 15:10 ]
Заголовок сообщения:  Re: LTAscetik

Бурные овации!
А звук стоит перенести на микросхему памяти. Иначе с программой не выкрутимся.
Вчера вытравил первые платки. Все чинно. Фоторезист рулит. Единственно, режим травления платы нужно выбрать очень точно, что бы не перетравить. Уж больно дорожки тонкие.

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

Автор:  furhunter [ 08 авг 2012, 15:27 ]
Заголовок сообщения:  Re: LTAscetik

Pingvin, как тебе тема http://inspect.com.ua/creative-work/83- ... ukami.html

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