Easyelectronics.ru

Электроника для всех
Текущее время: 22 сен 2019, 13:22

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: Декодер манчестерского кода на ассемблере
СообщениеДобавлено: 17 мар 2016, 16:13 
Только пришел

Зарегистрирован: 18 май 2014, 11:17
Сообщения: 6
Введение:
Взял себе плату BeagleBone с процессором AM335x. У него на борту есть два реал-тайм ядра PRU (PRU0 и PRU1). Хочу через GPIO научить их обмениваться данными. Данный кодируются в манчестерском коде. У прушек свой компилятор - pasm.

Проблема:
Понятно, что алгоритм передачи написать не так сложно: сначала переводит байт в МК(манчестерский код), потом передаем бит за битом. Проблема в двух вещах: приеме и синхронизации. Бог с ней, с синхронизацией, её я домучаю позже. У меня замылились глаза на приеме. Вот код:
Код:
LISEN:                // прослушка линии
    QBEQ START, r9, 15    // если принято 16 бит, то выход
    MOV r2, 0                // обнуляем счетчик бит
    QBBC CLR0, IN        // проверка на 0-ь.
    QBBS SET1, IN        // проверка на 1-цу
CLR0:                // метка установки 0
    ADD r2, r2, 1        // счетчик длительности
    QBBC CLR0, IN        // проверяет текущий уровень
    QBGE CLR10, r2, 50   //  считаем, что  половина периода -  150 нс. Тогда переход на CLR10, если 0 уже больше 150
    CLR r5.t16                // устанавливаем 0
    LSR r5, r5, 1        // сдвигаем
    ADD r9, r9, 1        // счетчик принятых бит
    QBA LISEN        // возвращаемся на прослушку
CLR10:                // пришло два нуля
    CLR r5.t16        // устанавливаем и сдвигаем
    LSR r5, r5, 1       
    CLR r5.t16
    LSR r5, r5, 1
    ADD r9, r9, 2        // принято 2 бита
   // WBC IN           // для того, чтобы не записывать лишних значений из линии
    QBA LISEN        // возврат на прослушку
//--------------------------------------------------------------------------
SET1:                // метка установки 1
    ADD r2, r2, 1        // счетчик длительности
    QBBS SET1, IN        // проверяет текущий уровень
    QBGE SET01, r2, 50   //  считаем, что период 150 нс.
    SET r5.t16                // устанавливаем 1
    LSR r5, r5, 1        // сдвигаем
    ADD r9, r9, 1        // счетчик принятых бит
    QBA LISEN                // возвращаемся на прослушку
SET01:                // пришло две 1-ы
    SET r5.t16        // устанавливаем и сдвигаем
    LSR r5, r5, 1       
    SET r5.t16
    LSR r5, r5, 1
    ADD r9, r9, 2        // принято 2 бита
    // WBC IN         для того, чтобы не записывать лишних значений из линии
    QBA LISEN        // возврат на прослушку

Не могу придумать правильный алгоритм отсчета длительности. Командами WBC и WBS не получится это сделать (ну, т.е. я пока не представляю как). Тогда остается самому посчитать длительность фронта и делать проверку?
NOTE:
Использовать UART не получится, ибо нужно подключаться к уже работающей линии, а там все передается в МК.
Глоссарии:
WBC, WBS - команды ожидания 0 и 1.
SBCO - команда записи данных в память
QBBS, QBBC - команды перехода на метку, если 1 или 0
QBNE - переход на метку, пока не ровно.
QBGE - переход на метку, если больше.
UPD2103:
Есть недочеты: 1) это смешение от перехода к метке SET01 и CLR10. Это 9 тактов или 45 нс. 2) В метки SET01 и CLR10 добавил команды WBC и WBS для того, чтобы не записывать в регистры биты, когда на линии, после передачи одного байта, остается либо высокий, либо низкий уровень.


Последний раз редактировалось kowapuk 21 мар 2016, 11:23, всего редактировалось 3 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: T/R данных на BeagleBone
СообщениеДобавлено: 17 мар 2016, 19:13 
Старожил

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 1432
На первый, абсолютно дилетантский, взгляд на эти PRU - если забыть про WBC, WBS, а пользоваться только QBBS, QBBC в цикле, то можно считать длительность как кол-во циклов.
А вообще, название топика поменяйте на что-нибудь типа "программный декодер манчестера" и, возможно, будет больше и читателей, и предложений )


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: T/R данных на BeagleBone
СообщениеДобавлено: 18 мар 2016, 11:22 
Только пришел

Зарегистрирован: 18 май 2014, 11:17
Сообщения: 6
vt340 писал(а):
На первый, абсолютно дилетантский, взгляд на эти PRU - если забыть про WBC, WBS, а пользоваться только QBBS, QBBC в цикле, то можно считать длительность как кол-во циклов.
А вообще, название топика поменяйте на что-нибудь типа "программный декодер манчестера" и, возможно, будет больше и читателей, и предложений )

Спасибо за ответ.
Считать длительность, с помощью циклов можно, только для этого нужно знать половину периода передачи одного бита (так это видится мне). Просто хочется точно убедится, что это предпочтительнее, алгоритм через ожидания установки или сброса бита.
П.С. Благодарю за замечание. Ждал как раз такого совета, а то мучался с выбором названия)

UPD: сейчас проверю алгоритм, в котором я проверяю, раз в 10 нс, значение текущего бита. При каждой проверки значение счетчика увеличивается на единицу. Потом сравниванием значение с эталонным, и если он его превышает, то мы можем сказать, что у нас переход из 0 в 1-у или из 1-ы в 0, к примеру. Прим: 01 в МК - 0110.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: T/R данных на BeagleBone
СообщениеДобавлено: 06 апр 2016, 12:38 
Только пришел

Зарегистрирован: 18 май 2014, 11:17
Сообщения: 6
kowapuk писал(а):
Считать длительность, с помощью циклов можно, только для этого нужно знать половину периода передачи одного бита (так это видится мне). Просто хочется точно убедится, что это предпочтительнее, алгоритм через ожидания установки или сброса бита.


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Декодер манчестерского кода на ассемблере
СообщениеДобавлено: 11 апр 2016, 11:16 
Только пришел

Зарегистрирован: 18 май 2014, 11:17
Сообщения: 6
Передатчик можно написать, исходя из кода приемника. Это не самое трудное.
Код:
// приемник для передачи сигнала со скоростью 2 мегабита
.origin 0
.entrypoint PRE

#include "GPIOCTR.hp"
#include "TRSBNI.hp"

#define USR0 21            // led 0
#define USR1 22            // led 1
#define USR2 23            // led 2
#define USR3 24            // led 3
#define GPIO1 0x4804C000   // адресс регистров GPIO1
#define PRU1_ARM_INT 20      // значение прерывания от PRU1 to ARM


#define RAM0 C24      // Локальная память PRU1
#define RAM1 C25      // Локальная память PRU0
#define IN r31.t6      // входной GPIO

//Определим основные регистры
#define REQ r1          // в этот регистр будет помещаться информация от PRU0
#define COUNT r2      // считает колличество принятых байт
#define VALUE r3
//Приветствуем в программа приемника кода на PRU
PRE:
   MOV R4, 2
INIT:
   MOV REQ, 0
   MOV COUNT, 8
   MOV VALUE, 0
   LBCO REQ, RAM0, 0, 1      // выход из программы.
   QBEQ EXIT, REQ, 0
START:
// Знаем, что в линии, если ничего не приходит идет сигнал низкого уровня
// Длительность задержки 45 нс. Проверяющий сигнал между байтами равен 9 мкс
// Или 4.5 HIGH и 4.5 LOW. Для начала будем ждать сигнал от PRU0, что он начал передачу
   
   LBCO REQ, RAM0, 1, 1          // сюда помещаем разрешающее значения
   QBNE START, REQ, 0         // Пока не будет установлен 0, будет прыгать на старт.
   
// в начале посылки каждого байта будем получать переход из 1 в 0. Задержка кажого сигнала 4.5 мкс
   WBS IN      // ждем 4.5 мкс
   WBC IN      // после этого нужно поставить задержку, равную 100
   CDELAY 101   // компенсация задержки хоста 100+1. CDELAY 1 - 45 нс.
POOL:
   REC9 IN, VALUE, COUNT      //макрос приемника
   SBCO VALUE, RAM0, R4, 1      // запись в память
   ADD R4, R4, 1            // добавляем 1 в счетчик бит
   QBEQ EXIT, R4, 35
   QBA INIT
// Дальше начинают приходить биты с длительностью от 480 до 500 нс (-45 нс)
EXIT:            // Ждем прерывания от хоста и выключаем PRU
   MOV r31.b0, 20+16
   HALT


Синтаксис макроса REC9 (REC9 - это приемник с задержкой 9):
Код:
.macro REC9         // Макрос приема данных с задержкой 9         
.mparam IN, OUT, COUNT     // входные параметры: IN - вход GPIO; OUT - выходной регистр;
// COUNT - регистр, содержащий в себе число бит.
RECIVE:
   QBBS SET1X, IN   // проверяем 1 сейчас. Если нет, то сразу переход на 0
   QBEQ BACK, COUNT, 0
SET0X:
   WBC IN      // проверям, точно ли 0.
   CDELAY 9   // ждем 405 НС. До смены остается ещё 30 НС
   WBC IN      // вторая проверка. Debbug точка
   CDELAY 1   // после неё станет ясно, что пришло. Сигнал уже как 20 нс новый.
   QBBC SET00, IN  // пришел 0? Если нет, значит 1-ца. -25 нс.
SET01:         // ЗАписываем переход из 0 в 1
   CLR OUT.t1   // Записываем 01
   SET OUT.t0
   LSL OUT, OUT, 2   //смещаем. -45нс.
   CDELAY 9       // Сигналу осталось минимум 30 нс. -405-40+480
   SUB COUNT, COUNT, 2   // принято 2-а байта. 25 нс.
   CDELAY 1      // -20 нс нового сигнала
   QBA RECIVE      // возвращаемся на прием. -25
SET00:            //записываем переход из 0 в 0
   CLR OUT.t1
   CLR OUT.t0
   LSL OUT, OUT, 2
   CDELAY 9
   SUB COUNT, COUNT, 2
   CDELAY 1
   QBA RECIVE      // возвращаемся на прием -25
SET1X:         // для установки 1-ы и....
   WBS IN      // аналогично с нулем
   CDELAY 9
   WBS IN
   CDELAY 1
   QBBS SET11, IN
SET10:
   SET OUT.t1
   CLR OUT.t0
   LSL OUT, OUT, 2
   CDELAY 9
   SUB COUNT, COUNT, 2
   CDELAY 1
   QBA RECIVE   // переход на прием
SET11:
   SET OUT.t1
   SET OUT.t0
   LSL OUT, OUT, 2
   CDELAY 9
   SUB COUNT, COUNT, 2
   CDELAY 1
   QBA RECIVE    // переход на прием
BACK:         // метка записи значения
   LSR OUT, OUT, 2 // когда приходят последний 2 бита, то он сдвигаются влево. Это необходимо учесть

.endm


ТЕМУ МОЖНО ЗАКРЫТЬ!


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB