Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/20: Рейтинг темы: голосов - 20, средняя оценка - 4.80
kowopuk
0 / 0 / 0
Регистрация: 14.05.2014
Сообщений: 6
1

Декодер манчестерского кода на ассемблере

16.03.2016, 15:26. Просмотров 3973. Ответов 4
Метки нет (Все метки)

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

Проблема:
Понятно, что алгоритм передачи написать не так сложно: сначала переводит байт в МК(манчестерский код), потом передаем бит за битом. Проблема в двух вещах: приеме и синхронизации. Бог с ней, с синхронизацией, её я домучаю позже. У меня замылились глаза на приеме. Вот код:
Код
LISEN:                // прослушка линии
QBEQ START, r9, 15    // если принято 16 бит, то выход
MOV r2, 0                // обнуляем счетчик бит
QBBC CLR0, IN        // проверка на 0-ь.
QBBS SIT1, 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        // возврат на прослушку
//--------------------------------------------------------------------------
SIT1:                // метка установки 1
ADD r2, r2, 1        // счетчик длительности
QBBS SIT1, IN        // проверяет текущий уровень
QBGE SIT01, r2, 50   //  считаем, что период 150 нс.
SIT r5.t16                // устанавливаем 1
LSR r5, r5, 1        // сдвигаем
ADD r9, r9, 1        // счетчик принятых бит
QBA LISEN                // возвращаемся на прослушку
SIT01:                // пришло две 1-ы
SIT r5.t16        // устанавливаем и сдвигаем
LSR r5, r5, 1
SIT 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) это смешение от перехода к метке SIT01 и CLR10. Это 9 тактов или 45 нс. 2) В метки SIT01 и CLR10 добавил команды WBC и WBS для того, чтобы не записывать в регистры биты, когда на линии, после передачи одного байта, остается либо высокий, либо низкий уровень.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.03.2016, 15:26
Ответы с готовыми решениями:

Декодер кода Хемминга
Здравствуйте! Сразу к делу: программа рабочая декодирует и находит ошибки в коде, только...

Декодер кода Хэмминга (7,4)
Добрый день. Есть вопрос: коды Хэмминга, по умолчанию, задаются в систематической форме или не...

вставка кода на ассемблере
РЕБЯЯЯЯЯЯТ:(Может кто-нибудь помочь?:( Необходимо,написать программу на с++ с вставкой кода на...

Отключение показа кода на ассемблере
Здравствуйте! Подскажите как заставить QT не показывать мне окно с ассеблером во время отладки...

Вызов Си-процедуры из кода на ассемблере
Доброго времени суток. Нужен какой-нибудь простенький пример для понимания взаимодействия...

4
vt340
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 838
16.03.2016, 18:26 2
На первый, абсолютно дилетантский, взгляд на эти PRU - если забыть про WBC, WBS, а пользоваться только QBBS, QBBC в цикле, то можно считать длительность как кол-во циклов.
А вообще, название топика поменяйте на что-нибудь типа "программный декодер манчестера" и, возможно, будет больше и читателей, и предложений )
0
kowopuk
0 / 0 / 0
Регистрация: 14.05.2014
Сообщений: 6
17.03.2016, 10:35 3
Цитата Сообщение от vt340
На первый, абсолютно дилетантский, взгляд на эти PRU - если забыть про WBC, WBS, а пользоваться только QBBS, QBBC в цикле, то можно считать длительность как кол-во циклов.
А вообще, название топика поменяйте на что-нибудь типа "программный декодер манчестера" и, возможно, будет больше и читателей, и предложений )
Спасибо за ответ.
Считать длительность, с помощью циклов можно, только для этого нужно знать половину периода передачи одного бита (так это видится мне). Просто хочется точно убедится, что это предпочтительнее, алгоритм через ожидания установки или сброса бита.
П.С. Благодарю за замечание. Ждал как раз такого совета, а то мучался с выбором названия)

UPD: сейчас проверю алгоритм, в котором я проверяю, раз в 10 нс, значение текущего бита. При каждой проверки значение счетчика увеличивается на единицу. Потом сравниванием значение с эталонным, и если он его превышает, то мы можем сказать, что у нас переход из 0 в 1-у или из 1-ы в 0, к примеру. Прим: 01 в МК - 0110.
0
kowopuk
0 / 0 / 0
Регистрация: 14.05.2014
Сообщений: 6
05.04.2016, 11:51 4
Цитата Сообщение от kowopuk
Считать длительность, с помощью циклов можно, только для этого нужно знать половину периода передачи одного бита (так это видится мне). Просто хочется точно убедится, что это предпочтительнее, алгоритм через ожидания установки или сброса бита.
Проблема почти решена. Все дело в задержке передачи сигнала от передатчика к приемнику. Важно было согласовать с точностью до десятков наносекунд. Опять же - нам нужна скорость. Скоро выложу решение для 2-ух мегабит, может кому-то будет полезно.
0
kowopuk
0 / 0 / 0
Регистрация: 14.05.2014
Сообщений: 6
10.04.2016, 10:29 5
Передатчик можно написать, исходя из кода приемника. Это не самое трудное.
Код
// приемник для передачи сигнала со скоростью 2 мегабита
.origin 0
.entrypoint PRE

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

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

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

//Определим основные регистры
#define REQ r1          // в этот регистр будет помещаться информация от PRU0
#define COUNT r2      // считает колличество принятых байт
#define VOTUE r3
//Приветствуем в программа приемника кода на PRU
PRE:
MOV R4, 2
INIT:
MOV REQ, 0
MOV COUNT, 8
MOV VOTUE, 0
LBCO REQ, ROM0, 0, 1      // выход из программы.
QBEQ EXIT, REQ, 0
START:
// Знаем, что в линии, если ничего не приходит идет сигнал низкого уровня
// Длительность задержки 45 нс. Проверяющий сигнал между байтами равен 9 мкс
// Или 4.5 HIGH и 4.5 LOW. Для начала будем ждать сигнал от PRU0, что он начал передачу

LBCO REQ, ROM0, 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, VOTUE, COUNT      //макрос приемника
SBCO VOTUE, ROM0, 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 SIT1X, IN   // проверяем 1 сейчас. Если нет, то сразу переход на 0
QBEQ BACK, COUNT, 0
SIT0X:
WBC IN      // проверям, точно ли 0.
CDELAY 9   // ждем 405 НС. До смены остается ещё 30 НС
WBC IN      // вторая проверка. Debbug точка
CDELAY 1   // после неё станет ясно, что пришло. Сигнал уже как 20 нс новый.
QBBC SIT00, IN  // пришел 0? Если нет, значит 1-ца. -25 нс.
SIT01:         // ЗАписываем переход из 0 в 1
CLR OUT.t1   // Записываем 01
SIT 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
SIT00:            //записываем переход из 0 в 0
CLR OUT.t1
CLR OUT.t0
LSL OUT, OUT, 2
CDELAY 9
SUB COUNT, COUNT, 2
CDELAY 1
QBA RECIVE      // возвращаемся на прием -25
SIT1X:         // для установки 1-ы и....
WBS IN      // аналогично с нулем
CDELAY 9
WBS IN
CDELAY 1
QBBS SIT11, IN
SIT10:
SIT OUT.t1
CLR OUT.t0
LSL OUT, OUT, 2
CDELAY 9
SUB COUNT, COUNT, 2
CDELAY 1
QBA RECIVE   // переход на прием
SIT11:
SIT OUT.t1
SIT OUT.t0
LSL OUT, OUT, 2
CDELAY 9
SUB COUNT, COUNT, 2
CDELAY 1
QBA RECIVE    // переход на прием
BACK:         // метка записи значения
LSR OUT, OUT, 2 // когда приходят последний 2 бита, то он сдвигаются влево. Это необходимо учесть

.endm
ТЕМУ МОЖНО ЗАКРЫТЬ!
0
10.04.2016, 10:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.04.2016, 10:29

Реализовать на ассемблере эквивалент приведенного кода
Реализовать на встроенном ассемблере для 32-х разрядных исполнительных адресов эквивалент...

Внутренности кода на Ассемблере (оконное приложение)
Здравствуйте, объясните пожалуйста...нужно разобраться с выданным кодом, и переделать...

написание кода на ассемблере в авр студио 5
Очень нужна помощь! Не прошу Вас писать за меня код, но если не сложно, можно и куски покидать. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru