![]() |
![]() |
#1 |
Резидент клуба
Регистрация: 15.05.2011
Сообщений: 233
|
![]()
Здравствуйте читатели писатели наркоманы и так далее.
Это будет моя личная тема, здесь я буду нести свет в народные массы. Можно спрашивать вопросы и просить исходники. В первую очередь мы замутим анализатор тоесть логер кодировок. Самая первая версия будет принимать старлайн и килок. Писать будем под ардуину. Собственно исходник: Код:
#define RX 2 volatile byte level=255; volatile unsigned long last, len; byte p_level; unsigned long p_len, p_len_prev; struct { byte state; unsigned long TE; byte pre_count, data[8], dat_bit; } keeloq; struct { byte state; byte pre_count, data[8], dat_bit; } starline; void setbit(byte *data, byte n) { data[n/8]|=1<<(n%8); } #define KL_MIN_PRE_COUNT 4 #define KL_MAX_TE 500 #define KL_MIN_TE 300 #define KL_MAX_BITS 64 void process_keeloq() { switch(keeloq.state) { case 0: if(p_level) break; keeloq.state=1; keeloq.pre_count=0; break; case 1: //pre+hdr if(p_len>=KL_MIN_TE && p_len<=KL_MAX_TE) keeloq.pre_count++; else if(!p_level && p_len>=KL_MIN_TE*10 && p_len<=KL_MAX_TE*10 && keeloq.pre_count>=KL_MIN_PRE_COUNT) { keeloq.TE=p_len/10; keeloq.state=2; keeloq.dat_bit=0; keeloq.data[0]=0x00; keeloq.data[1]=0x00; keeloq.data[2]=0x00; keeloq.data[3]=0x00; keeloq.data[4]=0x00; keeloq.data[5]=0x00; keeloq.data[6]=0x00; keeloq.data[7]=0x00; } else { keeloq.state=0; break; } break; case 2: //dat if(!p_level) break; if(p_len<keeloq.TE/2 || p_len>keeloq.TE*3) { keeloq.state=0; break; } if(p_len<=keeloq.TE+keeloq.TE/2) setbit(keeloq.data, keeloq.dat_bit); if(++keeloq.dat_bit==KL_MAX_BITS) keeloq.state=100; break; } } #define SL_MIN_PRE_COUNT 4 #define SL_MAX_PRE 1150 #define SL_MIN_PRE 850 #define SL_MAX_ZERO 350 #define SL_MIN_ZERO 100 #define SL_MAX_ONE 700 #define SL_MIN_ONE 400 #define SL_MIN_BITS 16 #define SL_MAX_BITS 64 void process_starline() { byte b; switch(starline.state) { case 0: if(p_level) break; starline.state=1; starline.pre_count=0; break; case 1: //pre if(p_len>=SL_MIN_PRE && p_len<=SL_MAX_PRE) starline.pre_count++; else if(p_len<SL_MIN_PRE && starline.pre_count>=SL_MIN_PRE_COUNT) { starline.state=2; starline.dat_bit=0; starline.data[0]=0x00; starline.data[1]=0x00; starline.data[2]=0x00; starline.data[3]=0x00; starline.data[4]=0x00; starline.data[5]=0x00; starline.data[6]=0x00; starline.data[7]=0x00; } else { starline.state=0; break; } break; case 2: //dat if(p_level) break; if(p_len_prev>=SL_MIN_ONE && p_len_prev<=SL_MAX_ONE && p_len>=SL_MIN_ONE && p_len<=SL_MAX_ONE) b=1; else if(p_len_prev>=SL_MIN_ZERO && p_len_prev<=SL_MAX_ZERO && p_len>=SL_MIN_ZERO && p_len<=SL_MAX_ZERO) b=0; else { if(starline.dat_bit>=SL_MIN_BITS) starline.state=100; else starline.state=0; break; } if(b) setbit(starline.data, starline.dat_bit); if(++starline.dat_bit==SL_MAX_BITS) starline.state=100; break; } } void dump_hex(byte *buf, byte bits) { byte a; for(a=0; a<(bits+7)/8; a++) { if(buf[a]<=0x0f) Serial.print('0'); Serial.print(buf[a], HEX); Serial.print(" "); } Serial.println(""); } void rx_int() { if(level!=255) return; len=micros()-last; last=micros(); if(digitalRead(RX)==HIGH) level=0; else level=1; } void setup() { attachInterrupt(0, rx_int, CHANGE); Serial.begin(115200); while(!Serial); Serial.println("MEGA OVERFUCK ARDUINO LOGGER BY HUY FOR NARKOMANS"); Serial.println(""); interrupts(); } byte a; void loop() { if(level!=255) { noInterrupts(); p_level=level; p_len=len; len=0; level=255; interrupts(); process_keeloq(); process_starline(); p_len_prev=p_len; } if(keeloq.state==100) { Serial.print("KEELOQ: "); dump_hex(keeloq.data, 64); keeloq.state=0; } if(starline.state==100) { Serial.print("STARLINE["); Serial.print(starline.dat_bit); Serial.print("]: "); dump_hex(starline.data, starline.dat_bit); starline.state=0; } } Несмотря на некие упрощения в функциях приема, которые я сделал чтобы слабые мозгом внезапно не отъехали, данный исходник является вершиной фрикерской мысли и квинтэссенцией прекрасного (в нем все прекрасно). В дальнейшем мы этот исходник усложним, и он станет еще более прекрасным. В следующем выпуске я объясню, как тут все работает, а после етого мы займемся выбросом посылок. Добавлено через 4 минуты А пока желающие могут отписать, что бы они хотели видеть в наших следующих выпусках: -больше разных приемов всяческих кодировок (пишите какие имено) -использование сс1101 -выброс посылок (пишите какие кодировки) -реализации алгоритма килок -присоединение LCD от нокии 3110 -USB кодграббер для компа с окошками и кнопками без регистрации без смс |
![]() |
![]() |
![]() |
#2 |
Член клуба
Регистрация: 31.03.2012
Сообщений: 168
|
![]()
Занятно. Особенно вот эта фраза на вывод :"MEGA OVERFUCK ARDUINO LOGGER BY HUY FOR NARKOMANS" :-)))
Но на СИ можно не только под Аурдину кодить. Главное - алгоритм понять. Немного шаманства и есть код под MSP430. Верно? Добавлено через 2 минуты Керниган и Ричи мне в помощь ![]() Добавлено через 5 минут А это, видимо тайминги по старлайну? #define SL_MIN_PRE_COUNT 4 счетчик? #define SL_MAX_PRE 1150 прембула макс знач мкс #define SL_MIN_PRE 850 прембула мин знач мкс #define SL_MAX_ZERO 350 ноль макс знач мкс #define SL_MIN_ZERO 100 ноль мин знач мкс #define SL_MAX_ONE 700 единица макс знач мкс #define SL_MIN_ONE 400 единица мин знач мкс #define SL_MIN_BITS 16 счетчик? #define SL_MAX_BITS 64 общее количество бит пакета |
![]() |
![]() |
![]() |
#3 | |||||||||||||||||||
Модератор
Регистрация: 27.03.2011
Сообщений: 2,322
|
![]()
Здравствуй добрый человек! Код знакомый,адаптирован под wiring вроде видел его на trashe.... Добавлено через 22 минуты Ну если сказали про 3310,то просто напросто добавляем либу PCD8544 и можно уже на экранчик выводить имхо. harrier -если ты сразу захотел на MSP 430-то варианта 2-адаптировать прием под Enrgia или ставить IAR и выше упомянутый код придеться переделывать на одну треть не менее.. |
|||||||||||||||||||
![]() |
![]() |
![]() |
#4 |
Модератор
Регистрация: 27.03.2011
Сообщений: 2,322
|
![]()
Работает
|
![]() |
![]() |
![]() |
#5 | ||||||||||||||||||||||||||||||||||||||
Резидент клуба
Регистрация: 15.05.2011
Сообщений: 233
|
![]()
Ну есесно.. на это и расчет. Правда ардуина вносит свои коррективы, что особенно заметно в плане отсчета времени - используются константы в единицах мкс и соответственно 4 байтные переменные, что на практике лишнее. 1мкс - слишком большое разрешение, я обычно делаю 25-30 (или 50), и соответственно везде обхожусь 1 байтными переменными.
Первое - это минимальное количество импульсов преамбулы (положительные и отр полупериоды), необходимое для перехода к приему бит данных. Старлайн пакеты бывают разной длительности - данный код принимает посылы длиной от SL_MIN_BITS до SL_MAX_BITS бит. Остальное правильно обозначено. Насчет изменения кода под мсп.. я этот код таскаю между pic, avr, msp430 и везде меняю только одно - отлов длительности импульса (т.е прерывание от приемника и таймер). Все остальное не трогаю вобще. Добавлено через 37 минут Еще небольшое дополнение. Может показаться, что прием старлайн херовый, потому что все 64 бита порой принимаются пару раз из 10 посылок в пачке )) Ето не так (прием не херовый), просто стоит обратить внимание на проверку длительностей при приеме бит: Код:
if(p_level) break; if(p_len_prev>=SL_MIN_ONE && p_len_prev<=SL_MAX_ONE && p_len>=SL_MIN_ONE && p_len<=SL_MAX_ONE) b=1; else if(p_len_prev>=SL_MIN_ZERO && p_len_prev<=SL_MAX_ZERO && p_len>=SL_MIN_ZERO && p_len<=SL_MAX_ZERO) b=0; else { if(starline.dat_bit>=SL_MIN_BITS) starline.state=100; else starline.state=0; break; } тут мы пропускаем импульсы положительной полярности, и срабатываем на отрицательном импульсе. в этот момент у нас в p_len лежит длительность этого отр импульса, а в p_len_prev - соответственно длительность предыдущего, положительного импульса. проверяем их оба, чтобы они попадали в границы, обозначеные дефайнами. но такие дела, почему-то из брела часто летит весьма корявый сигнал с затянутыми\непропорционал ными таймингами.. короче имеет смысл проверять только положительную часть периода - комментируем лишнее: Код:
if(p_len_prev>=SL_MIN_ONE && p_len_prev<=SL_MAX_ONE/* && p_len>=SL_MIN_ONE && p_len<=SL_MAX_ONE*/) b=1; else if(p_len_prev>=SL_MIN_ZERO && p_len_prev<=SL_MAX_ZERO/* && p_len>=SL_MIN_ZERO && p_len<=SL_MAX_ZERO*/) b=0; else Код:
MEGA OVERFUCK ARDUINO LOGGER BY HUY FOR NARKOMANS STARLINE[64]: E5 60 FF 94 A8 E0 22 26 STARLINE[64]: E5 60 FF 94 A8 E0 22 26 STARLINE[64]: E5 60 FF 94 A8 E0 22 26 STARLINE[64]: E5 60 FF 94 A8 E0 22 26 STARLINE[64]: E5 60 FF 94 A8 E0 22 26 STARLINE[64]: E5 60 FF 94 A8 E0 22 26 STARLINE[64]: E5 60 FF 94 A8 E0 22 26 STARLINE[64]: E5 60 FF 94 A8 E0 22 26 STARLINE[64]: E5 60 FF 94 A8 E0 22 26 STARLINE[64]: E5 60 FF 94 A8 E0 22 26 |
||||||||||||||||||||||||||||||||||||||
![]() |
![]() |
![]() |
#6 |
Вступил в клуб
Регистрация: 04.07.2011
Сообщений: 31
|
![]()
Отправил через граб tahion 2 раза по две пробных посылки, кроме того, что биты инвертированы ничего не понял. Откуда взялись посылки различной длины, и почему 64 битнях только 3, а не четыре? Расстояние между приёмником Arduino и передатчиком ~ 40см.
P/S: посылки хорошо контролировать на слух встроенным в комп тв тюнером (радио) настроенным на 433,92. |
![]() |
![]() |
![]() |
#7 |
Резидент клуба
Регистрация: 15.05.2011
Сообщений: 233
|
![]()
Ты читать неумеешь? перечитай последни пост.
Биты инвертированы ))))00 вобще лол. У меня правильный прием битов, истинно говорю, кто принимает (или передает) другим способом - наркоман, надоело повторять уже. правильный метод приема только один, и он у вас перед глазами. |
![]() |
![]() |
![]() |
#8 |
Модератор
Регистрация: 27.03.2011
Сообщений: 2,322
|
![]()
Я радиосканирующим приемником на слух контролирую порой,а так конечно лучше сциллограму
|
![]() |
![]() |
![]() |
#9 | ||||||||||||||||||||||||||||||||||||||||||||||
Автор
Регистрация: 13.05.2011
Сообщений: 1,308
|
![]()
Что эта тема забыла в разделе "Статьи"???
Личная тема? Тебе напомнить твой понос, которым ты всех тут полил? Свет он тут лить собрался...
|
||||||||||||||||||||||||||||||||||||||||||||||
![]() |
![]() |
![]() |
#10 |
Резидент клуба
Регистрация: 15.05.2011
Сообщений: 233
|
![]()
Небеспокойса, когда я сделаю конструктор из кубиков, я тебе лично один вручу )))
|
![]() |
![]() |
![]() |
|
Опции темы | |
Опции просмотра | |
|
|