
Сообщение от
IVM
И как это выглядит ?
Я начал уж было переписывать, но бросил на шаге "текущее время".
Выглядит примерно так:
Код:
PROGRAM STEPPER_PRU0
variables:
@Export
input dir : BOOL;
stepper : PRU_STEPPER;
@Export
input enable1 : BOOL;
@Export
input quantity1 : WORD;
@Export
output state1 : STEPPER_RUN_STATE;
@Export
output step_count1 : WORD;
@Export
input enable2 : BOOL;
@Export
input quantity2 : WORD;
@Export
output state2 : STEPPER_RUN_STATE;
@Export
output step_count2 : WORD;
first : BOOL;
body:
IF first THEN
ASM
SBCO R29.b0, 3, 100, 4 ; сохраняем R29
LDI R29.dw, 2000
LBCO R0.b0, 3, R29.dw, 120 ; загружаем все регистры из адреса 2000
LBCO R29.b0, 3, 100, 4 ; возвращаем R29 в прежнее состояние
END_ASM
stepper.enable := enable1;
stepper.quantity := quantity1;
ELSE
ASM
SBCO R29.b0, 3, 100, 4 ; сохраняем R29
LDI R29.dw, 3000
LBCO R0.b0, 3, R29.dw, 120 ; загружаем все регистры из адреса 3000
LBCO R29.b0, 3, 100, 4 ; возвращаем R29 в прежнее состояние
END_ASM
stepper.enable := enable2;
stepper.quantity := quantity2;
END_IF;
stepper();
IF first THEN
ASM
SBCO R29.b0, 3, 100, 4 ; сохраняем R29
LDI R29.dw, 2000
SBCO R0.b0, 3, R29.dw, 120 ; сохраняем все регистры по адресу 2000
LBCO R29.b0, 3, 100, 4 ; возвращаем R29 в прежнее состояние
END_ASM
state1 := stepper.state;
step_count1 := stepper.step_count;
ELSE
state2 := stepper.state;
step_count2 := stepper.step_count;
END_IF;
first := NOT first;
FAST_OUTPUTS(out3 := stepper.Q, out4 := dir);
END_PROGRAM
Смысл в том, что команда LBCO загружает данные из памяти, а команда SBCO пишет данные в память (из регистров).
Адрес превышающий 124 (или около того) в LBCO/SBCO не поддерживается, и нужно использовать вспомогательный регистр.
Команды имеют вид "LBCO регистр (который в прочитаются данные), 3 (означает "память текущего ядра"), 100 (смещение), 4 (количество байт, если больше размера регистра, то лишние данные попадут в следующие регистры по порядку)
Поэтому видно, что исходно в части "IF first" я хочу загрузить данные "как бы для 1-го ШД" из памяти (ну, я взял и волевым решением принял, что 1-ый ШД будет храниться по адресу 2000, а второй по адресу 3000). Для обращения к 2000 нужно это самое 2000 записать в регистр (я выбрал R29, но можно любой из R0..R29). Но в этом R29 могло находиться что-то полезное, поэтому я предварительно сохранил его в память по адресу 100.
Обмен с КДС находится по адресам 0.. и далее, поэтому до 1000 он уж точно не дойдёт.