Страница 133 из 135 ПерваяПервая ... 3383123131132133134135 ПоследняяПоследняя
Показано с 1,321 по 1,330 из 1349

Тема: Hardella IDE

  1. #1321

    По умолчанию

    Пишем ASM -- появляется ассемблерная вставка (возможно, ctrl+пробел поможет).

    И далее команды типа
    -- Передаём данные из PRU0 в PRU1
    SBCO R29.b0, 4, 100, 1 ; пишем данные из регистра R29 в память по адресу 100

    -- Читаем данные в PRU1 и далее используем их
    LBCO R29.b0, 4, 100, 1 ; загружаем данные в регистр R29 из байта по адресу 100

    Если не ошибаюсь, то 4 это есть указание на то, что "работаем с памятью другого ядра"

    Вроде, вместо регистра в LBCO / SBCO должно быть возможно указывать переменные (но в последнем параметре нужно верно указывать размер читаемых-записываемых данных)

    Сейчас Hardella использует память только для обмена с основной программой, поэтому использовать адреса большие 100 безопасно.

  2. #1322

    По умолчанию

    Эх...
    А про команды ассемблера для этого контроллера где почитать? Если на вскидку? как задать поиск в гугле?
    А вообще. Пока откажусь от идеи передавать данные между РПУ((((
    Поставлю на костыли (буду работать 2 каналами и переключать их рэлюхами
    А пока скомпилировал проект в Hardella
    скоро запилю на реальное железо и буду тестить.

  3. #1323

    По умолчанию

    Цитата Сообщение от TV13M Посмотреть сообщение
    Эх...
    А про команды ассемблера для этого контроллера где почитать? Если на вскидку? как задать поиск в гугле?
    Например: "PRU Assembly Instruction User Guide", AM1808

    Для обмена нужны инструкции SBCO и LBCO.

  4. #1324

    По умолчанию

    Доброго времени.
    Испытал в железе.
    Основа работает!
    Огромное спасибо Владимиру! (как сдам проект, ещё спасибо "скажу")

    Но пока есть момент, измеренные показания очень сильно скачут. +\- 70 Гц.
    Может кто может высказать критику по поводу моего кода:

    "(* Первый канал *)
    IF StartCounter1 THEN (* проверяем флаг начала отсчёта, если счёт идёт то ждём передний фронт второго импульса: *)
    IF R_TRIG(CLK := inputs.in1).Q THEN (* если словили передний фронт сигнала то: *)
    counter1Hz := Counter1; (* записать значение из счётчика 1 в переменную памяти *)
    Counter1 := 0; (* обнулить счётчик *)
    ELSE
    Counter1 := Counter1 + 1; (* иначе прибавляем к счётчику 1 и ждём в следующем цикле *)
    END_IF;
    (* флаг начала отсчёта не установлен *)
    ELSE
    IF F_TRIG(CLK := inputs.in1).Q THEN (* тогда ждём задний фронт сигнала *)
    StartCounter1 := TRUE; (* словили задний фронт. Будем начинать счёт. Устанавливаем флаг начала отсчёта. *)
    Counter1 := Counter1 + 1; (* прибавляем 1 к счётчику *)
    END_IF;
    END_IF; "

    Весь код, это + ещё один канал и 4 строчки воздействия на выходы.

    CoDeSys запрашивает данные каждый новый цикл... (может из за этого косяк?)
    Если во время обмена данными, PRU не выполняет программу, тут то погрешность и вылезает? Может можно и нужно сбрасывать измерения которые были не закончены во время когда пришёл запрос от КДС?

    Пишу новую "поэму" с усреднением из 10 измерений, но не уверен что это самый лучший вариант, да и обсчёт двух каналов, а потом ещё сложение и деление из 10 измерений... (тут я уже точно выхожу за рамки 1 мкСек.
    Последний раз редактировалось TV13M; 21.07.2020 в 22:47.

  5. #1325
    Пользователь
    Регистрация
    31.07.2013
    Адрес
    Аркаим
    Сообщений
    1,033

    По умолчанию

    "поэму" с усреднением из 10 измерений
    Может перенести это в основную ПОУ? Т. е. ПРУ будет показывать насчитанное между передними фронтами inputs.in1 без промежуточных данных, а основная программа в ПЛК будет усреднять данные. Вроде даже в библиотеке OSCAT уже есть готовые ФБ усреднения.

  6. #1326

    По умолчанию

    Тут вылезают не контролируемые (а так ли это?) задержки реакции выхода на достижение заданного значения.
    (из за того что время обработки программы в КДС не стабильное. +\- мСек...)
    У меня в коде ошибка. Я не сбрасываю "флаг" что отсчёт уже идёт...
    Последний раз редактировалось TV13M; 22.07.2020 в 08:50.

  7. #1327
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,224

    По умолчанию

    не брезгуйте конструкцией IF...ELSIF
    И вместо ФБ ловли фронтов используйте
    Код:
    foo :=  inputs.in1
    (*где то потом*)
    IF foo and NOT bar THEN
       ...
    ELSIF NOT foo and bar THEN
       ...
    END_IF;
    bar := foo;
    должно стать более читаемо и менее затратно
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  8. #1328

    По умолчанию

    Если усреднять за 16, то вместо деления можно использовать сдвиг -- будет гораздо быстрее.

    IF ... IF F_TRIG -- с этим поосторожнее нужно быть. Сам по себе триггер же сбрасывать нужно, а, если внешняя проверка не выполнена, то и триггер не сбросится.

    Если есть Hardella проект -- могу прогнать на эмуляторе -- посмотреть сколько тактов занимает программа

  9. #1329

    По умолчанию

    На какой частоте приходят данные?

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

    Сам обмен довольно быстрый. Вроде, 20нс на переменную или около того.

  10. #1330
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    2,314

    По умолчанию

    все ничего, но это что то вирусное
    Counter1 := Counter1 + 1; (* прибавляем 1 к счётчику *)

Страница 133 из 135 ПерваяПервая ... 3383123131132133134135 ПоследняяПоследняя

Ваши права

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