Фрикер Клуб
 

Вернуться   Фрикер Клуб > Основной раздел > Статьи

Важная информация

Ответ
 
Опции темы Опции просмотра
Старый 13.01.2013, 21:27   #1
Valeron
Резидент клуба
 
Регистрация: 15.05.2011
Сообщений: 233
Post Исходники под ардуину

Здравствуйте читатели писатели наркоманы и так далее.
Это будет моя личная тема, здесь я буду нести свет в народные массы. Можно спрашивать вопросы и просить исходники.
В первую очередь мы замутим анализатор тоесть логер кодировок. Самая первая версия будет принимать старлайн и килок. Писать будем под ардуину.

Собственно исходник:

Код:
#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;
  }
}
Здесь можно наблюдать отсутствие камментариев в тексте, но ето даже хорошо, так как работает воображение !!1
Несмотря на некие упрощения в функциях приема, которые я сделал чтобы слабые мозгом внезапно не отъехали, данный исходник является вершиной фрикерской мысли и квинтэссенцией прекрасного (в нем все прекрасно).
В дальнейшем мы этот исходник усложним, и он станет еще более прекрасным. В следующем выпуске я объясню, как тут все работает, а после етого мы займемся выбросом посылок.

Добавлено через 4 минуты
А пока желающие могут отписать, что бы они хотели видеть в наших следующих выпусках:
-больше разных приемов всяческих кодировок (пишите какие имено)
-использование сс1101
-выброс посылок (пишите какие кодировки)
-реализации алгоритма килок
-присоединение LCD от нокии 3110
-USB кодграббер для компа с окошками и кнопками без регистрации без смс
Valeron вне форума   Ответить с цитированием
Старый 13.01.2013, 22:19   #2
harrier
Член клуба
 
Регистрация: 31.03.2012
Сообщений: 168
По умолчанию Re: Исходники под ардуину

Занятно. Особенно вот эта фраза на вывод :"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 общее количество бит пакета
harrier вне форума   Ответить с цитированием
Старый 14.01.2013, 03:25   #3
DIVER_SANT
Модератор
 
Аватар для DIVER_SANT
 
Регистрация: 27.03.2011
Сообщений: 2,313
По умолчанию Re: Исходники под ардуину

Цитата:
Здравствуйте читатели писатели наркоманы и так далее.

Здравствуй добрый человек!
Код знакомый,адаптирован под wiring вроде видел его на trashe....

Добавлено через 22 минуты
Ну если сказали про 3310,то просто напросто добавляем либу PCD8544 и можно уже на экранчик выводить имхо.
harrier -если ты сразу захотел на MSP 430-то варианта 2-адаптировать прием под Enrgia или ставить IAR и выше упомянутый код придеться переделывать на одну треть не менее..
DIVER_SANT вне форума   Ответить с цитированием
Старый 14.01.2013, 03:34   #4
DIVER_SANT
Модератор
 
Аватар для DIVER_SANT
 
Регистрация: 27.03.2011
Сообщений: 2,313
По умолчанию Re: Исходники под ардуину

Работает
Изображения
Тип файла: jpg huy.JPG (69.5 Кб, 1326 просмотров)
DIVER_SANT вне форума   Ответить с цитированием
Старый 14.01.2013, 07:52   #5
Valeron
Резидент клуба
 
Регистрация: 15.05.2011
Сообщений: 233
По умолчанию Re: Исходники под ардуину

Цитата:
Но на СИ можно не только под Аурдину кодить. Главное - алгоритм понять. Немного шаманства и есть код под MSP430. Верно?

Ну есесно.. на это и расчет. Правда ардуина вносит свои коррективы, что особенно заметно в плане отсчета времени - используются константы в единицах мкс и соответственно 4 байтные переменные, что на практике лишнее. 1мкс - слишком большое разрешение, я обычно делаю 25-30 (или 50), и соответственно везде обхожусь 1 байтными переменными.

Цитата:
#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 общее количество бит пакета

Первое - это минимальное количество импульсов преамбулы (положительные и отр полупериоды), необходимое для перехода к приему бит данных.
Старлайн пакеты бывают разной длительности - данный код принимает посылы длиной от 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
Valeron вне форума   Ответить с цитированием
Старый 14.01.2013, 12:02   #6
polli
Вступил в клуб
 
Регистрация: 04.07.2011
Сообщений: 31
По умолчанию Re: Исходники под ардуину

Отправил через граб tahion 2 раза по две пробных посылки, кроме того, что биты инвертированы ничего не понял. Откуда взялись посылки различной длины, и почему 64 битнях только 3, а не четыре? Расстояние между приёмником Arduino и передатчиком ~ 40см.

P/S: посылки хорошо контролировать на слух встроенным в комп тв тюнером (радио) настроенным на 433,92.
Изображения
Тип файла: jpg 123.JPG (58.4 Кб, 631 просмотров)
polli вне форума   Ответить с цитированием
Старый 14.01.2013, 12:41   #7
Valeron
Резидент клуба
 
Регистрация: 15.05.2011
Сообщений: 233
По умолчанию Re: Исходники под ардуину

Ты читать неумеешь? перечитай последни пост.
Биты инвертированы ))))00 вобще лол.
У меня правильный прием битов, истинно говорю, кто принимает (или передает) другим способом - наркоман, надоело повторять уже. правильный метод приема только один, и он у вас перед глазами.
Valeron вне форума   Ответить с цитированием
Старый 14.01.2013, 14:10   #8
DIVER_SANT
Модератор
 
Аватар для DIVER_SANT
 
Регистрация: 27.03.2011
Сообщений: 2,313
По умолчанию Re: Исходники под ардуину

Я радиосканирующим приемником на слух контролирую порой,а так конечно лучше сциллограму
DIVER_SANT вне форума   Ответить с цитированием
Старый 14.01.2013, 15:16   #9
tahion
Автор
 
Аватар для tahion
 
Регистрация: 13.05.2011
Сообщений: 1,308
По умолчанию Re: Исходники под ардуину

Что эта тема забыла в разделе "Статьи"???

Цитата:
Сообщение от Valeron
Это будет моя личная тема, здесь я буду нести свет в народные массы.

Личная тема? Тебе напомнить твой понос, которым ты всех тут полил? Свет он тут лить собрался...


Цитата:
Сообщение от Valeron
фрикеры нью генерейшн на ардуино мля ))) можно еще конструктор сделать из таких кубиков знаете, друг с другом сцепляются и получается девайс. типа "Юный фрикер-хуятор" для детей 6-12 лет

tahion вне форума   Ответить с цитированием
Старый 14.01.2013, 15:43   #10
Valeron
Резидент клуба
 
Регистрация: 15.05.2011
Сообщений: 233
По умолчанию Re: Исходники под ардуину

Небеспокойса, когда я сделаю конструктор из кубиков, я тебе лично один вручу )))
Valeron вне форума   Ответить с цитированием
Ответ
Опции темы
Опции просмотра

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.



Текущее время: 10:20. Часовой пояс GMT +3.


vBulletin 4.1.0 Перевод: zCarot
(C) www.phreakerclub.com