Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Декодер манчестерского кода на ассемблере
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
kowapuk
Введение:
Взял себе плату 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 бита
    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 бита
    QBA LISEN        // возврат на прослушку

Приходит конечно не то, что нужно. Возможно я написал неправильный алгоритм посылки, но вроде проверял осцилографом (но там он показывает выборку в случайном месте).
Глоссарии:
SBCO - команда записи данных в память
QBBS, QBBC - команды перехода на метку, если 1 или 0
QBNE - переход на метку, пока не ровно.
QBGE - переход на метку, если больше.
kowapuk
Note:
Ядра работают на частотах 200 МГц (такт 5 нс или меня обманули).
Нашел ошибку в коде: переход на метки SET01 и CLR10 происходит в тот момент, когда в линии меняется фронт (с 0 в 1 или с 1 в 0) и если длительность присутствия одного уровня превышает половину периода. Как только условия соблюдены, у нас происходит ещё 9 тактов - это доп. смещение, которое ломает общий алгоритм.
Возможно, правильнее использовать команды: WBS и WBC ( ждать, пока не придет 1, и 0 соответственно).
jcxz
Вам тут вряд-ли кто поможет, слишком специфичное ядро, да ещё асм. Я сам когда-то писал под PRU (эмулировал UART на нём + другие мелочи), но уже давно и мало что помню.
Попробуйте лучше стукнуться в подфорум по DSP - там также были люди занимавшиеся PRU-ядрами
kowapuk
Цитата(jcxz @ Mar 22 2016, 10:36) *
Вам тут вряд-ли кто поможет, слишком специфичное ядро, да ещё асм. Я сам когда-то писал под PRU (эмулировал UART на нём + другие мелочи), но уже давно и мало что помню.
Попробуйте лучше стукнуться в подфорум по DSP - там также были люди занимавшиеся PRU-ядрами

Благодарю за ответ!
Я тут уже нашел пару вариантов реализации декодера для других ядер. Попробую их адаптировать, либо допилю свой. Наверное, больше меня волнует алгоритм с уклоном на ассемблер.
А таки да, обращусь к тем ребятам, спасибо)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.