Фрикер Клуб
 

Вернуться   Фрикер Клуб > Основной раздел > Песочница-2

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

Ответ
 
Опции темы Опции просмотра
Старый 22.11.2014, 18:22   #11
access
Вступил в клуб
 
Регистрация: 22.10.2014
Сообщений: 23
По умолчанию Re: управление с обратной связью на базе брелока старлайн

Друзья разжуйте подробно прием старлайна пожалуйста, как принять и обработать пакет игнорируя все кроме серийника и кнопки? что то я совсем слаб в программировании.
access вне форума   Ответить с цитированием
Старый 22.11.2014, 19:50   #12
Paul74s
Резидент клуба
 
Аватар для Paul74s
 
Регистрация: 16.11.2012
Сообщений: 584
По умолчанию Re: управление с обратной связью на базе брелока старлайн

Если кратко, то для приема старлайна слушаем эфир и ищем преамбулу, по длине между фронтов сигнала 1000 мкс, как только пошли сигналы с длиной 250 или 500 - записываем, в соответствии с их длиной, биты посылки, как приняли все 64 бита (8 байт) передаем данные в прогу для обработки.
Пакет нужно принимать полностью, а затем из полученной посылке вытаскивать серийник и кнопку, а затем выполнять свои действия.
Paul74s вне форума   Ответить с цитированием
Старый 24.11.2014, 09:50   #13
access
Вступил в клуб
 
Регистрация: 22.10.2014
Сообщений: 23
По умолчанию Re: управление с обратной связью на базе брелока старлайн

Цитата:
Сообщение от Paul74s
Если кратко, то для приема старлайна слушаем эфир

Как я понял из вашей программы это как раз прием старлайна:
Цитата:
Код:
#include <mega168.h>
#include <delay.h>

#define FCPU 8

#define RX_AM  PIND.2 // АМ-приемник (4)
#define TX_AM  PORTD.4 // AM передатчик (6)

#define TIMER_DIV 32 // фиксированный интервал для расчета времени импульсов 
                     // частота таймера 0 - 31250Гц или 32мксек на такт

// это кодировки обрабатываемые программой
#define STARLINE   2*4*1 // 0-STARline 1-starLINE

unsigned char pulse_am;
unsigned char code_signal[16]; // 0-type, 1-dat_bit, 2-16-data
unsigned char send_signal[16];

// STARLINE ///// 32бит.шифр.части + 32бит.открытой.части /////////////////////////////////
// преамбула - 1000в + 1000н
// ноль - 250в + 250н
// единица - 500в + 500н
volatile struct { unsigned char state, pre_count, data[12], dat_bit, type; } starline;
#define SL_MIN_PRE_COUNT 4
#define SL_MAX_PRE (1200/TIMER_DIV)
#define SL_MIN_PRE ( 800/TIMER_DIV)
#define SL_MAX_BITS 64+32
#define SL_MAX_1 (650/TIMER_DIV)
#define SL_MIN_1 (360/TIMER_DIV)
#define SL_MAX_0 (350/TIMER_DIV)
#define SL_MIN_0 (150/TIMER_DIV)
void process_starline (unsigned int p_len) {
  unsigned char a;
  // в зависимости от текущего состояния производим разные действия
  switch (starline.state) {
    case 0: // начальное состояние
      // проверяем какой фронт пришел. Если RX_AM (выход приемника) равно 0, 
      // значит было прерывание по спадающему фронту, 
      // и p_len - длина положительного импульса
      if (!RX_AM) break; //дальше работаем только с положительным импульсом, 
      // т.е после возрастающего фронта.
      // переходим в состояние 1, и обнуляем счетчик преамбулы
      starline.state=1;
      starline.pre_count=0;
      break;

    case 1: //принимаем преамбулу
      // проверяем импульс на соответствие параметрам, если не подходит - переходим в сост. 0.
      if (p_len<SL_MIN_PRE || p_len>SL_MAX_PRE) { 
        // проверяем на наличие битов данных
        //if (!RX_AM && p_len>SL_MIN_0 && p_len<SL_MAX_1) {
        if (p_len>=SL_MIN_0 && p_len<=SL_MAX_1) {
          //проверяем счетчик преамбулы, чтобы был не меньше SL_MIN_PRE_COUNT
          if (starline.pre_count<SL_MIN_PRE_COUNT) { starline.state=0; break; }
          //обнуляем массив с данными и переходим в состояние 2
          for(a=0; a<12; a++) starline.data[a]=0;
          starline.state=2;
          if (!RX_AM) {
            if (p_len>=SL_MIN_1 && p_len<=SL_MAX_1) starline.data[0]=1;
            starline.dat_bit=1; starline.type=0; // 10
          } else {
            starline.dat_bit=0; starline.type=1; // 01
          }
          break;
        } else { starline.state=0; break; }
      } 
      //увеличиваем счетчик преамбулы, пока не встретим хедер
      starline.pre_count++;
      break;

    case 2: //прием битов данных
      // длина импульса, как 1 так и 0 должна находиться в неких пределах, 
      // если вышли за них - сбой приема, переходим в сост. 0.
      if (p_len<SL_MIN_0 || p_len>SL_MAX_1) { 
        //if ( p_len>=SL_MIN_PRE && p_len<=SL_MAX_PRE  && starline.dat_bit>16 && starline.dat_bit%8==0 ) {
        if ( p_len>=SL_MIN_PRE && starline.dat_bit>16 ) {
          starline.state=3; break;
        } else {
          starline.state=0;
        }
        break;
      }
      // работать дальше будем только если был спадающеий фронт 
      // (и p_len соответственно - длина предыдущего положительного импульса).
      if (RX_AM) { break; }
      // проверяем длительность положительного импульса. 
      // если он в пределах от SL_MIN_1 до SL_MAX_1, то это соотв. бит данных 1,
      // запишем его в массив.
      if (p_len>=SL_MIN_1 && p_len<=SL_MAX_1) starline.data[starline.dat_bit/8]|=(1<<(starline.dat_bit%8));
      // если он в пределах от SL_MIN_0 до SL_MAX_0, то это соотв. бит данных 0,
      // записывать не надо, т.к массив и так обнулен.
      // конструкция справа от условия записывает бит 1 в массив data[] в позицию dat_bit.
      // if (p_len>SL_MIN_0 && p_len<SL_MAX_0) starline.data[starline.dat_bit/8]|=(1<<(starline.dat_bit%8));
      // увеличиваем счетчик принятых битов, и если приняли 64 бит - переходим в состояние 3 (прием окончен)
      //// вставка импульса между положительными пиками сигнала
      //starline.dat_bit++;
      if (++starline.dat_bit==SL_MAX_BITS) { starline.state=3; }
      break;

    case 3: //ничего не делаем, просто ждем пока из основной программы  принудительно не изменим состояние на 0, после вывода дампа в терминал.
      break;
  }
}

а вот где взять сам подключаемый библиотеку старлайна если я не ошибся (#define STARLINE 2*4*1 // 0-STARline 1-starLINE)

То есть по этой части МК должен принять пакет брелока, а далее я должен пакет разложить и вычленить серийник и кнопку?

Добавлено через 45 минут
далее записанный из массива пакет я сравниваю по серийнику и коду кнопки и выполняю дальнейшее необходимое действие?

Последний раз редактировалось Саша; 24.11.2014 в 21:37.
access вне форума   Ответить с цитированием
Старый 24.11.2014, 11:13   #14
Paul74s
Резидент клуба
 
Аватар для Paul74s
 
Регистрация: 16.11.2012
Сообщений: 584
По умолчанию Re: управление с обратной связью на базе брелока старлайн

Подключение библиотек это #include <mega168.h>, а #define STARLINE 2*4*1 это определяемые значения, которые при компиляции программы (STARLINE) заменяются на значения (8), просто в моей проге много кодировок и чтобы проще было компилить проект под конкретные кодировки (иногда приходится отцеплять часть кодировок для освобождения места под другие эксперименты) и чтобы знать какая кодировка посылки пришла.
Когда starline.state=3 в массиве starline.data лежит посылка длиной starline.dat_bit.
Дальше проверяеш чтобы starline.dat_bit был равен 64, и если он равен, то в массиве starline.data ([4] [5] [6]) лежит серийник, а в starline.data[7] лежит кнопка.
Чтобы прием продолжился необходимо обнулить starline.state.
Paul74s вне форума   Ответить с цитированием
Старый 24.11.2014, 11:51   #15
access
Вступил в клуб
 
Регистрация: 22.10.2014
Сообщений: 23
По умолчанию Re: управление с обратной связью на базе брелока старлайн

вот здесь уже сильно поплыл без примера, в частности из Вашей программы этот кусок тот что я вырезал это полный цикл приема ?
Цитата:
////// процедуры передачи сигнала Starline
void send_starline(unsigned char ts, unsigned char kb) {
unsigned char sp, sb;
#asm("cli")
RX_OFF;
for (sb=0; sb<10; sb++) {
for (sp=0; sp<8; sp++) {
if (ts==1) {
TX_AM=1; delay_ms(1); TX_AM=0; delay_ms(1); // 10
} else {
delay_ms(1); TX_AM=1; delay_ms(1); TX_AM=0; // 01
}
}
for (sp=0; sp<kb; sp++) {
if ( ((send_signal[sp/8]>>(sp%8))&1)==0 ) {
if (ts==1) {
TX_AM=1; delay_us(250); TX_AM=0; delay_us(250-70); // 10
} else {
delay_us(250-70); TX_AM=1; delay_us(250); TX_AM=0; // 01
}
} else {
if (ts==1) {
TX_AM=1; delay_us(500); TX_AM=0; delay_us(500-70); // 10
} else {
delay_us(500-70); TX_AM=1; delay_us(500); TX_AM=0; // 01
}
}
}
}
RX_ON;
#asm("sei")
}

данный код как я понял уже идет к отсылке полученого пакета?
access вне форума   Ответить с цитированием
Старый 24.11.2014, 13:11   #16
Paul74s
Резидент клуба
 
Аватар для Paul74s
 
Регистрация: 16.11.2012
Сообщений: 584
Thumbs up Re: управление с обратной связью на базе брелока старлайн

process_starline - это процедура приема пакета, работает по прерываниям по изменению сигнала на ножке приемника.
send_starline - это процедура передачи сигнала в формате старлайна.

Процедура просто посылает сигнал записанный в массиве send_signal[] в кол-ве бит (kb).
То есть если в этот массив переписать данные из массива starline.data, и запустить эту процедуру, то в эфир полетит посылка брелка, а для того чтобы тебе послать обратку на твой брел нужно сделать следующее
send_signal[0]=starline.data[4];
send_signal[1]=starline.data[5];
send_signal[2]=0xFF; - данные для отображения на экране
send_signal[3]=0xFF; - данные для отображения на экране
send_signal[4]=0xFF; - данные для отображения на экране
send_signal[5]=0xFF; - данные для отображения на экране
и отправка обратки
send_starline(48);

Вообще процу можно упростить до одного стандартного формата

Код:
////// процедуры передачи сигнала Starline
void send_starline(unsigned char kb) {
unsigned char sp, sb;
#asm("cli")
// RX_OFF; // выключение приемника
// цикл повторения посылки
for (sb=0; sb<10; sb++) {
  // отправка преамбулы
  for (sp=0; sp<8; sp++) { TX_AM=1; delay_ms(1); TX_AM=0; delay_ms(1); }
  // отправка посылки
  for (sp=0; sp<kb; sp++) {
    if ( ((send_signal[sp/8]>>(sp%8))&1)==0 ) { TX_AM=1; delay_us(250); TX_AM=0; delay_us(250); } 
    else { TX_AM=1; delay_us(500); TX_AM=0; delay_us(500); }
  }
}
// RX_ON; // включение приемника
#asm("sei")
}
RX_ON и RX_OFF - нужно убрать, у меня питание приемника управляется ногой МК.
Paul74s вне форума   Ответить с цитированием
Старый 20.12.2014, 10:15   #17
access
Вступил в клуб
 
Регистрация: 22.10.2014
Сообщений: 23
По умолчанию Re: управление с обратной связью на базе брелока старлайн

Все, всем спасибо, все получилось, благодаря моему коллеге, за что ему отдельное спасибо!
access вне форума   Ответить с цитированием
Старый 20.12.2014, 10:35   #18
DIVER_SANT
Модератор
 
Аватар для DIVER_SANT
 
Регистрация: 27.03.2011
Сообщений: 2,347
По умолчанию Re: управление с обратной связью на базе брелока старлайн

Цитата:
Сообщение от access
Все, всем спасибо, все получилось, благодаря моему коллеге, за что ему отдельное спасибо!

Если не затруднит то код дадите посмотреть?
__________________
Правильно поставленный вопрос-на половину полученный ответ;)
++++++++++++++++++++++++++++++++++++++
[url]http://www.youtube.com/watch?v=ktnn-s3ebzw[/url]
DIVER_SANT вне форума   Ответить с цитированием
Старый 21.12.2014, 18:33   #19
ark
Член клуба
 
Регистрация: 24.05.2011
Сообщений: 185
По умолчанию Re: управление с обратной связью на базе брелока старлайн

А если возможно, то напишите статью или опубликуйте код. Или этот код только для закрытого раздела?
ark вне форума   Ответить с цитированием
Старый 23.12.2014, 18:02   #20
DIVER_SANT
Модератор
 
Аватар для DIVER_SANT
 
Регистрация: 27.03.2011
Сообщений: 2,347
По умолчанию Re: управление с обратной связью на базе брелока старлайн

Цитата:
Сообщение от Paul74s
Подключение библиотек это #include <mega168.h>, а #define STARLINE 2*4*1 это определяемые значения, которые при компиляции программы (STARLINE) заменяются на значения (8), просто в моей проге много кодировок и чтобы проще было компилить проект под конкретные кодировки (иногда приходится отцеплять часть кодировок для освобождения места под другие эксперименты) и чтобы знать какая кодировка посылки пришла.
Когда starline.state=3 в массиве starline.data лежит посылка длиной starline.dat_bit.
Дальше проверяеш чтобы starline.dat_bit был равен 64, и если он равен, то в массиве starline.data ([4] [5] [6]) лежит серийник, а в starline.data[7] лежит кнопка.
Чтобы прием продолжился необходимо обнулить starline.state.

Я так понимаю-надо из трех переменных [4] [5] [6] данные вложитьв одну переменную и потом ее проверять ?Или проверять последовательно каждую переменную?Объясните как
__________________
Правильно поставленный вопрос-на половину полученный ответ;)
++++++++++++++++++++++++++++++++++++++
[url]http://www.youtube.com/watch?v=ktnn-s3ebzw[/url]
DIVER_SANT вне форума   Ответить с цитированием
Ответ

Опции темы
Опции просмотра

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

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



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


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