Страница 1 из 1

Помогите разобрать поток данных

Добавлено: Вс фев 23, 2014 09:06:32
AlexK
Здравствуйте помогите пожалуйста как реализовать перехват 163 Битового потока опыта в программирование для AVR можно сказать нет никакого но С знаю.
Как я понимаю мне нужно делать все через прерывания если нет то поправьте пожалуйста)
О потоке сначала идет 16 бит (нечего незначащих единичек можно использовать как начало пакета данных) , 4 бита (нечего незначащих), 11 бит (стартовый бит 0 8 бит нужной информации и две стоповой 1) итак 13 раз по 11 бит.
bits: 16 4 11 11 11 11 11 11 11 11 11 11 11 11 11

Re: Помогите разобрать поток данных

Добавлено: Вс фев 23, 2014 10:57:48
BOB51
Можно набрать "страничку" произвольной информации (поток данных) в накопителе (ОЗУ), затем отсортировать участки с одинаковыми начальными и конечными фрагментами и/или привязкой к начальной последовательности и длине пакета. Или тема "сигнатурный анализатор"...
:)

Re: Помогите разобрать поток данных

Добавлено: Вс фев 23, 2014 12:42:27
uk8amk
разобрать поток данных
...
как реализовать перехват 163 Битового потока
Вы определитесь для начала, что вы хотите сделать: перехватить/записать или разобрать готовый?
Скорость какая? На высоких скоростях может оказаться AVR непригодным.
Передача синхронная или асинхронная?
Вобщем информации бы побольше.

Re: Помогите разобрать поток данных

Добавлено: Вс фев 23, 2014 14:52:16
AlexK
uk8amk писал(а):
разобрать поток данных
...
как реализовать перехват 163 Битового потока
Вы определитесь для начала, что вы хотите сделать: перехватить/записать или разобрать готовый?
Скорость какая? На высоких скоростях может оказаться AVR непригодным.
Передача синхронная или асинхронная?
Вобщем информации бы побольше.
Поток данных идет со скоростью 122 бит/сек
Время периода сигнала составляет ~8.192 миллисекунды
в потоке меняются только последние 153 бита за исключением стартовых битов 0 и стоповых двух единичек
передача данных синхронная и как я понял синхронизацию надо производить по первым 16 битам которые постоянно равны 1

Re: Помогите разобрать поток данных

Добавлено: Вт фев 25, 2014 19:02:55
alex2103
Видимо надо что-то с радиоканала перехватить :)
Надо 1 таймер и одно внешнее прерывание. Единички вначале нужны для того чтоб приемник по ним синхронизировал таймслоты. 1 и 0 как кодируются? Может быть длительностью между импульсами, может быть манчестер... В общем нужен сам сигнал посмотреть.

Re: Помогите разобрать поток данных

Добавлено: Ср фев 26, 2014 04:18:19
AlexK
alex2103 писал(а):Видимо надо что-то с радиоканала перехватить :)
Надо 1 таймер и одно внешнее прерывание. Единички вначале нужны для того чтоб приемник по ним синхронизировал таймслоты. 1 и 0 как кодируются? Может быть длительностью между импульсами, может быть манчестер... В общем нужен сам сигнал посмотреть.
Не это поток данных от эбу автомобиля. сегодня попробую записать осциллограмму потока.

Re: Помогите разобрать поток данных

Добавлено: Пт фев 28, 2014 13:52:54
AlexK
Изображение

Лог 0=0В Длительностью 8 mS
Лог 1=5В Длительностью 8 mS

Re: Помогите разобрать поток данных

Добавлено: Пт фев 28, 2014 15:23:23
uk8amk
Вероятно что-то из серии K-line, L-line или их аналогов.
Вам стоит написать производителя и марку ЭБУ, чтобы знающие люди могли подсказать интерфейс и методы кодирования данных.

Re: Помогите разобрать поток данных

Добавлено: Пт фев 28, 2014 19:21:29
AlexK
uk8amk писал(а):Вероятно что-то из серии K-line, L-line или их аналогов.
Вам стоит написать производителя и марку ЭБУ, чтобы знающие люди могли подсказать интерфейс и методы кодирования данных.
Что то подобное K-line только здесь без запрос ответа это протокол старых Toyaota до 1998 года информации по которому нет кроме которой я написал выше и программы для ПК которая опрашивает флаговый вход ком порта и грузит проц компа на ~100% вот и решил сделать на МК чтобы данные выводились через UART так как опыта программирования для МК нет обращаюсь к вам за помощью. Поправьте что не так/
1) Настраиваю таймер для определения длительности уровня логического 0 или 1
Частота таймера счетчика = Тактовая частота/Делитель = 8000000/256= 31250Гц
Длительность периода( тика ) = 1/31250= 32 мкс
Но тут проблема никак не могу понять как перевести 1 тик таймера в миллисекунды постоянно получается число которое никак не может быть длительностью. считаю по формуле
t=TCNT0*32;
2) Настраиваю прерывание по любой смене логического состояния
3) Настраиваю Uart на скорость 115200 бод

Код: Выделить всё

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <stdlib.h>
#include <stdio.h>


#define TIMER_DIV 32 //us
volatile int fr;
volatile bool sinhr;

int uart_putchar(char c, FILE *stream);
FILE uart_str=FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);

int uart_putchar(char c, FILE *stream)
{
  if(c=='\n') uart_putchar('\r', stream);
  loop_until_bit_is_set(UCSRA, UDRE);
  UDR=c;
  return 0;
}

ISR(INT0_vect)
{
  unsigned char len;
  
  len=TCNT0; //Значение тиков таймера

  printf("%lu\n\r", len);

//Синхронизация происходит по первым 16 битам которые всегда равны лог 1
if (len>120) && (len<136) && (!sinhr)  //Синхронизация где 120mS длительность 15 бит, 136mS  длительность импульса 17 бит  
{
   sinhr=true;
   return;
}

if (fr==0) 
 {
	 fr=1;
 }
  else
  {
	fr=0;
  }
  TCNT1=0; //Сброс таймера  
}


 
int main(void)
{
  fr=1;
//Таймер
  TCCR0 = (1<<CS02)|(0<<CS01)|(0<<CS00); 
  TIMSK = 0;
  TCNT0 = 0;   
  
//Прерывание
  GICR=(1<<INT0);
  MCUCR=(0<<ISC01)|(1<<ISC00);

//Uart
  UCSRA=0x02;
  UCSRB=0x08;
  UCSRC=0x86;
  UBRRH=0x00;
  UBRRL=0x08;

  stdout=&uart_str;

  sei();

  while(1)
  {
 
  }
  return 0;
}

Re: Помогите разобрать поток данных

Добавлено: Сб мар 01, 2014 10:43:13
uk8amk
1) 1мкс в тысячу раз меньше 1 мс. --> 32мкс = 0.032мс.
И для определения длительности не обязятельно считать в миллисекундах или переводить в какие-либо другие величинах. Можно оставить в тиках(TCNT0).

Re: Помогите разобрать поток данных

Добавлено: Пт мар 14, 2014 20:28:04
AlexK
Ясно спасибо разобрался!!! :)