реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Прочитать передачу
micronano
сообщение Aug 2 2011, 09:50
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 13-10-10
Пользователь №: 60 133



Добрый день!

Кто-нибудь может подсказать как прочитать передачу некоего интерфейса?
Известна его его скорость и структура.

Пытаюсь по первому биту запускать таймер, и с частотой раз в бит увожу контроллер в прерывание, где считываю значение порта.
Но огромное количество ошибок самого разного плана: сдвиг, чтение 1 вместо 0, чтение 0 вместо 1... Не знаю что делать.

Сигнал прямоугольный, так что дело к коде.

Есть программные алгоритмы приема?

Сообщение отредактировал micronano - Aug 2 2011, 09:58
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Aug 2 2011, 09:57
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



По идее надо читать несколько раз за бит, а уровень бита определять по большему числу выборок (или требовать чтобы все выборки были одинаковыми)

А так ничего особо сложного вроде бы нету...
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 2 2011, 10:01
Сообщение #3


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(micronano @ Aug 2 2011, 15:50) *
Пытаюсь по первому биту запускать таймер, и с частотой раз в бит увожу контроллер в прерывание, где считываю значение порта.


По первому фронту(или спаду) надо запускать на пол-бита, чтоб попасть в середину. А уже все последующие - через целый бит.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
kovigor
сообщение Aug 2 2011, 10:02
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(micronano @ Aug 2 2011, 12:50) *
Кто-нибудь может подсказать как прочитать передачу некоего интерфейса?


Формат посылки известен ? Если совершенно точно известно, как устроены посылки, известна скорость, на которой работает интерфейс, и проч., то выберите подходящий аппаратный интерфейс, входящий в состав вашего МК, и на нем все сделайте. Если такого итерфейса у вашего МК нет, то поищите МК с необходимым вам интерфейсом. Если такого МК нет, то придется имитировать этот интерфейс программно (если интерфейс медленный) или используя ПЛИС (если он быстрый). А если формат посылки точно не известен, то придется захватывать посылки, например, хорошим осциллографом или лог. анализатором, а затем изучать их вручную.

P.S. Из вашего сообщения ничего нельзя понять. Неужели так трудно изложить свои мысли яснее ?
Go to the top of the page
 
+Quote Post
micronano
сообщение Aug 2 2011, 10:07
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 13-10-10
Пользователь №: 60 133



Непомнящий Евгений
Да, спасибо, как вариант.

AHTOXA, это не влияет. и фо фронту пробовал, и в середине бита.

kovigor, если бы такой интерфейс бы был, я бы не пытался прочитать его столь извращенно.
И если бы был такой МК с таким интерфейсом, то я бы взял его.
Формат известен!

Цитата
Есть программные алгоритмы приема?
- я пришел к тому же выводу, что и вы, и сразу задал такой вопрос! =) Минуя очевидные вещи.
Go to the top of the page
 
+Quote Post
kovigor
сообщение Aug 2 2011, 10:11
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(micronano @ Aug 2 2011, 13:07) *
Формат известен!

- я пришел к тому же выводу, что и вы, и сразу задал такой вопрос! =) Минуя очевидные вещи.


Тогда и говорить не о чем - делайте программно, если скорость позволяет. А алгоритм зависи от того, что это за интерфейс. Одно дело - UART, и совсем другое - I2C или SPI ...
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Aug 2 2011, 10:17
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата
Но огромное количество ошибок самого разного плана: сдвиг, чтение 1 вместо 0, чтение 0 вместо 1... Не знаю что делать.


Выдайте на ножку момент выборки, а на другую - ее результат, сравните это с реальным входом.
Возможно у вас какая-то ошибка в программе, и вы не в то время проверяете порт...
Go to the top of the page
 
+Quote Post
micronano
сообщение Aug 2 2011, 10:21
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 13-10-10
Пользователь №: 60 133



Вот я и прошу подсказать существующие алгоритмы!! Т.к. мне нужно сделать это программно! И это не UART, не I2С, не SPI!!!
kovigor, вы не чувствуете, что ничем не помогли, а просто проконстатировали то, что я и так уже написал? Не можете помочь алгоритмом - не отвечайте, можете - я буду вам очень благодарен!

Непомнящий Евгений
Цитата
Выдайте на ножку момент выборки, а на другую - ее результат, сравните это с реальным входом.
Возможно у вас какая-то ошибка в программе, и вы не в то время проверяете порт...

выдайте на ножку момент выборки - не понял)
на другую - её результат - тоже не понял =)
И что такое реальных вход?

что есть что?=)

Ммм сложно представить, как прерывание по сравнению может считывать не в тот момент...=)
Или я что- то не понимаю..
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Aug 2 2011, 10:25
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



В момент, когда читаете вход, инвертируйте некоторый выход МК.
Потом берете осциллограф и сравниваете реальный входной сигнал и моменты его считывания вашей программой.
Go to the top of the page
 
+Quote Post
micronano
сообщение Aug 2 2011, 10:29
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 13-10-10
Пользователь №: 60 133



Теперь понял.
Цитата
Потом берете осциллограф и сравниваете реальный входной сигнал и моменты его считывания вашей программой.

А что мне это даст? ошибки от этого никуда не денутся и их причину я не пойму... Я увижу тоже самое, что и видел до этого! =)
Просто например бывает что вместо сообщения (порядка 60 бит выборки), мне приходят 60 "1"... (состояние на линии без передачи - "1")

Логика окончания приема сообщения - пауза в 50 бит перед следующим сообщением, состоящая из "1"

Сообщение отредактировал micronano - Aug 2 2011, 10:31
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Aug 2 2011, 10:32
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Ну как что даст - отсечете какие-то виды ошибок...

Потом еще что-нить попробуете, еще какие-то ошибки отсечете. И так до победного

Возможно у вас не в те моменты срабатывает прерывание - например другие прерывания слишком тяжелые. Или просто в программе ошибка. Да мало-ли что может быть...
Go to the top of the page
 
+Quote Post
SSerge
сообщение Aug 2 2011, 10:33
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Даже если битовая скорость известна, то никто не обещал что тактовая частота приёмника точно совпадает с тактовой частотой передатчика.
Со временем неизбежно накапливается ошибка.
Нужно подстраивать свою скорость приёма под скорость следования битов в принимаемом сигнале.
В зависимости от способа кодирования это можно делать по-разному, обычно это некая разновидность цифровой ФАПЧ, которая синхронизируется по фронтам сигнала.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
micronano
сообщение Aug 2 2011, 10:36
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 13-10-10
Пользователь №: 60 133



Других прерываний нет =)
В программе кроме считывания передачи и отправки пакетов на компорт, ничего нет...

Ошибки конечно есть, но какого плана...

Цитата
Даже если битовая скорость известна, то никто не обещал что что тактовая частота приёмника точно совпадает с тактовой частотой передатчика.
Со временем неизбежно накапливается ошибка.
Нужно подстраивать свою скорость прима под скорость следования битов в принимаемом сигнале.
В зависимости от способа кодирования это можно делать по-разному, обычно это некая разновидность цифровой ФАПЧ которая синхронизируется по фронтам сигнала.


каждое сообщение (порядка 60 бит), таймер запускаю заново по фронту первого бита, т.ч. врятли за 60 бит накапливается ошибка... Тем более что иногда (очень редко) приходит то, что надо!
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Aug 2 2011, 10:36
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Сделайте без прерываний ради интереса.

На самом деле все должно быть очень просто. Вероятно какая-то тупая ошибка sm.gif

Приведите здесь код, если его немного. Может кто-нить сразу увидит в чем дело
Go to the top of the page
 
+Quote Post
micronano
сообщение Aug 2 2011, 10:43
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 13-10-10
Пользователь №: 60 133



#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <util/delay.h>
#include "uart_i2c.h"

volatile int i = 0, pause = 0, uart = 0; // i - length of telegramm, pause - length of pause after telegramm
char s[64];

#define F_CPU 1843200L

// I/O ports init
void init_io_ports()
{ DDRA =(1<< DDA0)|(1<< DDA1)|(1<< DDA2)|(1<< DDA3)|(1<< DDA4)|(1<< DDA5)|(1<< DDA6)|(1<< DDA7);
DDRB =(1<< DDB0)|(1<< DDB1)|(1<< DDB2)|(1<< DDB3)|(1<< DDB4)|(1<< DDB5)|(1<< DDB6)|(1<< DDB7);
DDRC =(0<< DDC0)|(0<< DDC1)|(1<< DDC2)|(1<< DDC3)|(1<< DDC4)|(1<< DDC5)|(1<< DDC6)|(1<< DDC7);
DDRD =(1<< DDD0)|(1<< DDD1)|(1<< DDD2)|(1<< DDD3)|(1<< DDD4)|(1<< DDD5)|(1<< DDD6)|(1<< DDD7);

PORTA =(0<< PA0)|(0<< PA1)|(0<< PA2)|(0<< PA3)|(0<< PA4)|(0<< PA5)|(0<< PA6)|(0<< PA7);
PORTB =(0<< PB0)|(0<< PB1)|(0<< PB2)|(0<< PB3)|(0<< PB4)|(0<< PB5)|(0<< PB6)|(0<< PB7);
PORTC =(1<< PC0)|(1<< PC1)|(0<< PC2)|(0<< PC3)|(0<< PC4)|(0<< PC5)|(0<< PC6)|(0<< PC7);
PORTD =(0<< PD0)|(0<< PD1)|(0<< PD2)|(0<< PD3)|(0<< PD4)|(0<< PD5)|(0<< PD6)|(0<< PD7);
}


//************************************* Timer ****************************************************
// Timer0 8bit init, no prescaler, CTC mode
void init_timer()
{ TCCR0 = (0<< FOC0)|(0<< WGM00)|(0<< COM01)|(0<< COM00)|(1<< WGM01)|(0<< CS02)|(0<< CS01)|(1<< CS00);
TIMSK = (1<< OCIE0); // enable interrupts
sei(); // enable interrupts
SREG = (1<< 7); // enable interrupts
OCR0 = 192; // 1.8432Mhz of Xtal / 9600Hz = 192
}

//******************************** Interrupt Vector ************************************************
ISR(TIMER0_COMP_vect) // interrupt vector
{
if (i <= 64) // while telegramm is ON 64
{

if((PINC & (1 << PC0)) == 1)
{s[i] = '0';} // write "0" in s[i]
else
{s[i] = '1';} // write "1" in s[i]
i++;
}

else
{
if ((PINC & (1 << PC0)) == 0) //waiting the end of pause
{pause++;}
else
{pause = 0;}
}

}

//**************************************** MAIN ****************************************************
int main(void)
{
init_io_ports();
init_uart();

while (1)
{
i = 0;
pause = 0;
uart = 0;
if((PINC & (1 << PC0)) == 1) // waiting first "0" in Transmition on PC0

{
_delay_ms(0.010);
init_timer();
TCCR2 = 254;
while (pause <= 50) // pause after telegramm = 50 bit
{}
TCCR2 = 0; // stop timer TCNT2
putstr(s);
}

}


return 0;
}

Цитата
Сделайте без прерываний ради интереса.

На самом деле все должно быть очень просто. Вероятно какая-то тупая ошибка sm.gif

Приведите здесь код, если его немного. Может кто-нить сразу увидит в чем дело

без прерываний как?

Глупы ошибки это да... =)

Сообщение отредактировал micronano - Aug 2 2011, 10:44
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 4th July 2025 - 06:21
Рейтинг@Mail.ru


Страница сгенерированна за 0.01495 секунд с 7
ELECTRONIX ©2004-2016