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. Чего надо? Уже мозг кипит! Уже на отдельной плате собрал и с транзистором для подтяжки - не хочет работать. Может и ошибка то где то на поверхности, но "не поглазам"! Осциллограф мог бы прояснить ситуацию, уже нашел за 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 |
И всё-таки на макетке я ТачМемори запустил! Не думал, что столько геморроя с ним будет! У знакомого взял осциллограф, достал из загашника свой старый девайс, попытался сравнить импульсы - толком не получилось, так как старый девайс одноразово опрашивал ключ и успокаивался на этом - фиг чего разглядишь. Пришлось вспоминать, как программировать 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/ |