Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/32: Рейтинг темы: голосов - 32, средняя оценка - 4.50
kowopuk

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

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

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

Проблема:
Понятно, что алгоритм передачи написать не так сложно: сначала переводит байт в МК(манчестерский код), потом передаем бит за битом. Проблема в двух вещах: приеме и синхронизации. Бог с ней, с синхронизацией, её я домучаю позже. У меня замылились глаза на приеме. Вот код:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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 для того, чтобы не записывать в регистры биты, когда на линии, после передачи одного байта, остается либо высокий, либо низкий уровень.
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.03.2016, 15:26
Ответы с готовыми решениями:

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

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

Декодер кода Рида-Маллера
Проблема: построить декодер для кода Рида-Маллера. Задание. Имеется блок для передачи из 4-ёх информационных разрядов a1 a2 a3 a4 ...

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

UPD: сейчас проверю алгоритм, в котором я проверяю, раз в 10 нс, значение текущего бита. При каждой проверки значение счетчика увеличивается на единицу. Потом сравниванием значение с эталонным, и если он его превышает, то мы можем сказать, что у нас переход из 0 в 1-у или из 1-ы в 0, к примеру. Прим: 01 в МК - 0110.
kowopuk
05.04.2016, 11:51
Цитата Сообщение от kowopuk
Считать длительность, с помощью циклов можно, только для этого нужно знать половину периода передачи одного бита (так это видится мне). Просто хочется точно убедится, что это предпочтительнее, алгоритм через ожидания установки или сброса бита.
Проблема почти решена. Все дело в задержке передачи сигнала от передатчика к приемнику. Важно было согласовать с точностью до десятков наносекунд. Опять же - нам нужна скорость. Скоро выложу решение для 2-ух мегабит, может кому-то будет полезно.
kowopuk
10.04.2016, 10:29
Передатчик можно написать, исходя из кода приемника. Это не самое трудное.
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// приемник для передачи сигнала со скоростью 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):
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
.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
ТЕМУ МОЖНО ЗАКРЫТЬ!
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.04.2016, 10:29
Помогаю со студенческими работами здесь

Кодер и декодер, вылавливающие ошибки для кода Файра
Здравствуйте! Пытаюсь выполнить задачи 6.9 и 6.12 из книги "Теория и практика кодов, контролирующих ошибки" Блейхута. В задаче ...

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru