Вопрос к drivers. По поводу организации приема манчестера.
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено mapic 11 ноября 2004 г. 14:35

Пожалуйста обясните более подробно. Именно интересует начальная синхронизация?? И прием в начале. Что значит Если меньше 1/2 короткого импульса - начинать прием сначала, если от 1/2 до 3/2 короткого импульса то считать что принят короткий импульс, если от 3/2 до 5/2 то считать что принят длинный импульс , если длиннее то начать прием сначала.??? Что такое короткий импульс?? И как быть если высокий уровень а если низкий.
Дело в том что планируется передача манчестера в будущем по ИК или радио-каналу, где присутсвует множество помех.
В Вашем алгоритме не ясно также что делать если в следствии какой то помехи приемник потеряет синхронизацию с приемником , просто не примет два три бита??

Я пока что использую другой алгоритм и пока что нечего не получается. В общих чертах алгоритм следующий. Организовано все в подпрограмме прерывания от таймера. Сначала жду появления перепада. В каждом прерывании жду перепада 1/2 бит тайма если получаю перепад загружаю в таймер 75% бит времени. Код 0х55 нужен для синхронизации, точнее вывода времени прерывания точно в точку смены уровня (+/-25%). Потом жду синхробайта 0хЕ6. Если получаю даный байт записываю все следующие байты в сдвиговый регистр. Вот ниже конкретная подпрограмма приемника для ПИК может быть Вы найдете ошибки?? Извените без пояснений.

#include
#include
#define led_1 RB7
#define led_2 RB6 //Светодиоды
#define rx_data RA0 //Вход

bit old_data=0;
bit flag_sinxro=0;
bit flag_rx=0;
unsigned char Rx[6]={0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char rx_bayt, count_bit, count_bayt;

/*Слово конфигурации микроконтроллера (PIC16F627/628)*/
__CONFIG (XT&DATUNPROT&UNPROTECT&BOREN&MCLRDIS&PWRTEN &WDTDIS&LVPDIS);

void interrupt InterFunc(void); /*Обработчик прерываний по переполнению TMR0*/
void init(void); /*Подпрограмма инициализации микроконтроллера*/

void main (void)
{
unsigned char adr,i;
init();
//led_2=0;
for(;;)
{
if(flag_sinxro==1) led_2=0;
else led_1=1;
if(flag_rx==1)
{
adr=0x01;
led_1=0;
led_2=0;
GIE=0;
for(i=0;i<6;i++)
{
EEPROM_WRITE(adr,Rx[i]);
adr++;
}
asm("sleep");
}
}
}


void interrupt InterFunc(void)
{
if(flag_rx==1) goto fine;
if(rx_data==1) old_data=1;
else old_data=0;

while(TMR0<125)
{
if (old_data==rx_data){ asm("nop");}
else {goto to_jmp;}
}

flag_sinxro=0;
goto fine;
to_jmp:
led_1=0; //Обрабатываем перепад
rx_bayt=rx_bayt>>1;
if(old_data==0) rx_bayt=rx_bayt|0b10000000;

if(flag_sinxro==1) goto y_sinxro;

if(rx_bayt==0xe6) //E6=0b11100110
{
flag_sinxro=1;
count_bit=0; //также очищаем счетчики
count_bayt=0;
}
goto fine;

y_sinxro:
count_bit++;
if(count_bit==8) goto next_bayt;
goto fine;

next_bayt:
count_bit=0;
Rx[count_bayt]=rx_bayt;
count_bayt++;
if(count_bayt==6){flag_rx=1; flag_sinxro=0;}

fine:
TMR0=69;
T0IF=0;
led_1=1;
}

void init(void) //Инициализация
{
CMCON=0xff;
TRISA=0b00000001;
PORTA=0xff;
TRISB=0x00;
PORTB=0xff;
OPTION=0b10000001;
INTCON=0b10100000;

}

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru