Фрикер Клуб
 

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

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

Ответ
 
Опции темы Опции просмотра
Старый 14.01.2013, 18:50   #21
DIVER_SANT
Модератор
 
Аватар для DIVER_SANT
 
Регистрация: 27.03.2011
Сообщений: 2,313
По умолчанию Re: Исходники под ардуину

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

Добавлено через 11 минут
Понимаю так что надо самому каждую строчку кода комментировать так как сам понимаю,а уже автор поправит что не так или типа алгоритма нарисовать парралельно коду.
DIVER_SANT вне форума   Ответить с цитированием
Старый 14.01.2013, 19:35   #22
Valeron
Резидент клуба
 
Регистрация: 15.05.2011
Сообщений: 233
По умолчанию Re: Исходники под ардуину

Как раз нет. надо комментировать не по строчкам, а наоборот - понять общую структуру.. чуть попозже займусь объяснением что там к чему.
Valeron вне форума   Ответить с цитированием
Старый 14.01.2013, 22:22   #23
harrier
Член клуба
 
Регистрация: 31.03.2012
Сообщений: 168
По умолчанию Re: Исходники под ардуину

Цитата:
Сообщение от Valeron
Как раз нет. надо комментировать не по строчкам, а наоборот - понять общую структуру.. чуть попозже займусь объяснением что там к чему.

ИМХО, как я понял, прога состоит из следующих блоков (кирпичиков, если угодно).

Служебные вещи: какой МК работает, какой трансивер используется
Настройка трансивера на прием
Функция приема пакета
Сохранение пакета где-либо (ОЗУ, ПЗУ, регистры)
Индикация, что приняли пакет (если нужно)
Настройка трансивера на передачу
Формирование пакета для выброса
Выброс пакета

Ну, а дальше реализация каждой из этих функций возможна несколькими путями.
Тут дело вкуса/привычки/как рука набита у программиста.

Но без четкого представления, как формируется каждый пакет той или иной кодировки далеко не уедешь.
harrier вне форума   Ответить с цитированием
Старый 15.01.2013, 07:48   #24
DIVER_SANT
Модератор
 
Аватар для DIVER_SANT
 
Регистрация: 27.03.2011
Сообщений: 2,313
По умолчанию Re: Исходники под ардуину

Вот на просторах форума нашел код по посылкам keeloq -автор Lion -примерно понятно как самому сформулировать посылку,но задача в том чтоб послать код который мы перехватили и уложили или в память или в буфер.А так же как правильно замечено правильно оформить пакет так сказать и послать его
Код:
#include <tiny2313.h>
#include <delay.h>  




// Declare your global variables here

  void send_keeloq1(unsigned char *dat1)
  {  unsigned char a=0, b, c=0,data;
   
  
    //преамбула и хедер
   for(a=0; a<11; a++)
    {
     PORTB.0=1;
      delay_us(600);
      PORTB.0=0;
      delay_us(600);
    }
    PORTB.0=0;
   delay_us(5400);
 
    //передача данных. а - счетчик битов.
  for(a=0; a<64; a++ )
   { 
   data=dat1[a/8]; 
   data^=0b11111111;
   b=data&(1<<c); 
   
      PORTB.0=1;
      delay_us(600);
    if (b==0) PORTB.0=0;

     delay_us(600);
      PORTB.0=0;
      delay_us(600);
           c++;
       if (c>7) c=0;  
       
    }
    // 2 байта батарея и повтор посылки (почти во всех случаях лучше передать 0) 
      PORTB.0=1;
      delay_us(600);
     PORTB.0=1;
     delay_us(600);
      PORTB.0=0;
      delay_us(600); 
      PORTB.0=1;
      delay_us(600);
     PORTB.0=1;
     delay_us(600);
      PORTB.0=0;
      delay_us(600);
    
   //Guard
   delay_ms(8000);
  }
       unsigned char dat1[9]={0x21,0x8f, 0x57, 0xeb, 0xcc, 0xd0, 0x64,0x83};
void main(void)
{
// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port A initialization
// Func2=In Func1=In Func0=Out 
// State2=T State1=T State0=0 
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTB=0x00;
DDRB=0x01;

// Port D initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Universal Serial Interface initialization
// Mode: Disabled
// Clock source: Register & Counter=no clk.
// USI Counter Overflow Interrupt: Off
USICR=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;

    delay_ms(50);
 
       
          send_keeloq1(dat1);
    
    while (1)
      {
      // Place your code here

      };
}
Вот в avr как то проще кажется тайминги ставить..

Последний раз редактировалось Саша; 15.01.2013 в 11:57.
DIVER_SANT вне форума   Ответить с цитированием
Старый 15.01.2013, 21:59   #25
harrier
Член клуба
 
Регистрация: 31.03.2012
Сообщений: 168
По умолчанию Re: Исходники под ардуину

Лично мне пока полностью не ясны две функции: прием пакета и фомирование и выброс его. Поэтому я и начал с хана. ИМХО там проще сформировать и выбросить пакет. Вот и ковыряю/ковыляю пока именно в этом направлении.
harrier вне форума   Ответить с цитированием
Старый 25.01.2013, 08:21   #26
DIVER_SANT
Модератор
 
Аватар для DIVER_SANT
 
Регистрация: 27.03.2011
Сообщений: 2,313
По умолчанию Re: Исходники под ардуину

Valeron что то тема подзатиха-дай еще пищи для ума....
DIVER_SANT вне форума   Ответить с цитированием
Старый 25.01.2013, 14:16   #27
Valeron
Резидент клуба
 
Регистрация: 15.05.2011
Сообщений: 233
По умолчанию Re: Исходники под ардуину

Извиняюсь, что наобещал и тяну.. тут дел пресс вобще, надо глобальные вопросы решать (бухло телки кокс), постараюсь сегодня вечером накатать пост об общей структуре программы.
Valeron вне форума   Ответить с цитированием
Старый 26.01.2013, 16:34   #28
DIVER_SANT
Модератор
 
Аватар для DIVER_SANT
 
Регистрация: 27.03.2011
Сообщений: 2,313
По умолчанию Re: Исходники под ардуину

Процитирую песню-"Мы против наркотиков-Мы за Дротики!"
DIVER_SANT вне форума   Ответить с цитированием
Старый 26.01.2013, 18:27   #29
Valeron
Резидент клуба
 
Регистрация: 15.05.2011
Сообщений: 233
По умолчанию Re: Исходники под ардуину

Вот врожде накатал очередную бессмысленную простыню )))0
Собственно пара слов о общей структуре программы.
На словах это выглядит так:

Имеется:
1) функция main()
2) функция обработки прерываний
3) функция приема кодировки

В функции main() крутится бесконечный цикл (у ардуино это функция Loop() внутри которой собственно тело цикла).
В этом цикле производятся следующие действия:
1) проверяется отлов нового интервала. Если новый интервал принят - выполняем действия:
1.1) копируем параметры интервала - длительность и уровень из временных в рабочие переменные (далее скажу, зачем это), и разрешаем отлов следующего интервала.
1.2) вызываем функции-обработчики интервалов. Собственно в этих функциях (preocess_keeloq(), ..) и происходит прием.
2) Проверяется состояние приема каждой кодировки. Если имеется выставленый флаг окончания, т.е. все данные приняты - работаем с ними как нам требуется. После работы можно перевести прием в начальное состояние, и ожидать приема следующего пакета.
3) далее действия не относящиеся напрямую к приему - обработка кнопок и пр. вещи.

Задача функции обработки прерывания - отлов интервалов с радиоприемника. Интервал - это импульс 0 или 1 уровня, нам надо определить его длительность и собственно уровень.
Функция обработки прерывания должна вызываться каждый раз при смене уровня на входе МК, к которому подключен приемник. У нас это нога INT0, а прерывание настроено на срабатывание как по положительному так и отрицательному перепаду (фронту).
Еще раз, для закрепления - наша функция-обработчик будет автоматически вызываться на каждом фронте сигнала с приемника.
Для вычисления длительности - нам надо запоминать время последнего срабатывания прерывания, и при очередном срабатывании - вычитать из текущего времени, последнее записаное. Разность и будет длительность интервала между фронтами.
Собственно у ардуины в фоне тикает таймер, который непрерывно считает микросекунды с момента включения, нам этот таймер прекрасно подойдет.

программа обощенно выглядит так:


Код:
/*
прерывание от перепада уровня.

работаем с тремя переменными: len, level, last
1. в переменную len мы помещаем вычисленную длительность интервала
2. в переменную level - уровень этого интервала. Определяем его кстати просто- если после срабатывания прерывания (т.е. после фронта) на этом входе висит 0, значит до срабатывания там был 1, т.е. мы поймали положительный импульс.
зачем тут level сравнивается с 255 - будет показано далее.
3. а переменная last нам нужна чтобы смотреть время последнего отлова фронта, чтобы высчитать длину.
*/
void rx_int()
{
  if(level!=255) return;
  
  len=micros()-last;
  last=micros();
  
  if(digitalRead(CC_RX)==HIGH) level=0;
    else level=1; 
}

/*
функция приема.

эту функцию мы вызываем каждый раз после отлова очередного интервала, не важно какого - 0 или 1 (использовать надо все). Описание способа приема (ну тоесть как использовать эти интервалы, чтобы в конце концов принять данные) будет в ледущем посте, сейчас мы про общую структуру говорим.
*/
void process_starline()
{
 
}

void setup()
{
  //тут нам надо настроить прерывания, порты и так далее.
  //прерывание настраиваем так, чтобы по его срабатыванию вызывалась функция rx_int()
}

//собственно главный цикл
void loop()
{ 
  //если level равен 0 или 1 - значит приняли интервал, надо его обработать
  if(level!=255)
  {
    /*
    копируем параметры импульса в отдельные (рабочие) переменные, и присваиваем level значение 255
    У нас в прерывании переменная level сравнивается с этим значением, и если там не 255 то прерывание ничего не делает, т.е не измеряет длительность и уровень, потому что мы еще прошлое значение не скопировали в рабочие переменные.
    */
    p_level=level;
    p_len=len;
    len=0;
    level=255;
    
    //ну и вызываем функцию обработки принятого интервала. Причем эта функция работает с переменными p_level и p_len, в которые мы копировали значения, а не с теми, которые используются в прерывании. Это сделано чтобы в ходе работы функции переменные внезапно не поменялись прерыванием.
    process_starline();
    
    //в ходе приема удобно использовать так же длину предыдущего интервала, поэтому сохраняем ее тут
    p_len_prev=p_len;
  }
  
  //проверяем, а не выставлен ли флаг окончания приема. Если он выставлен (я использую значение 100 для его обозначения), то выводим посылку в терминал, а далее сбрасываем прием в 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;
  }
}
Там в коде имеются подробные коменты. Лучше скопировать этот код куда-нибудь, и смотреть в большом окошке.
Я хз как объяснить лучше, у меня нет таланта объяснять. Но вроде бы тут написано все что надо. теперь можете задавать вопросы )).
Valeron вне форума   Ответить с цитированием
Старый 26.01.2013, 18:42   #30
harrier
Член клуба
 
Регистрация: 31.03.2012
Сообщений: 168
По умолчанию Re: Исходники под ардуину

Вот! Наконец-то просто и понятно объяснил про прием! А говоришь, что не умеешь объяснять. Спасибо за подробные коменты!
Теперь у меня сложилась цельная картина функции приема. А то куски кода как в калейдоскопе крутились, а общий смысл все время ускользал...
harrier вне форума   Ответить с цитированием
Ответ
Опции темы
Опции просмотра

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

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



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


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