Re: streamer_halstreamer
Добавлено: 12 янв 2018, 17:09
сейчас попробую...
Статьи, обзоры, цены на станки и комплектующие.
https://cnc-club.ru/forum/
маг ??Алексс писал(а):Все как-бы должно работать, но нужно убрать обнуление tt, иначе в streamer сбивается синхронизация
и тип tt заменить на unsigned.
Код: Выделить всё
/* sudo halcompile --install kl.comp */
component kl;
pin out s32 inspection0;
pin out s32 inspection1;
pin out s32 inspection2;
pin out s32 inspection3;
pin in s32 insreamer ; //streamer.0.pin.0
pin in u32 arr_len;
pin in bit empty ; //streamer.0.empty
pin out bit clock ; //streamer.0.clock
pin in s32 pin_len ; // arr len
variable int i = 0;
variable int tt = 0;
int *arr_line = 0;
unsigned arr_len_old = 0;
// статик не нужно юзать - в случае двух и более компонентов будет засада
function _;
license "GPL";
;;
FUNCTION(_) {
if(!arr_line) {
arr_line = (int *)hal_malloc(arr_len * sizeof(streamer_t));
}
if (empty == 0) { //streamer.0.empty
if (tt % 2 != 0) {
clock = 0; //streamer.0.clock (streamer.0.clock-mode 2)
arr_line[i] = insreamer; //streamer.0.pin.0
i++;
} else {
clock = 1;
}
tt++;
} else {
i=0;
if(arr_line != arr_line_old) {
// realloc
// todo release pointer
arr_line = (int *)hal_malloc(arr_len * sizeof(streamer_t));
all_line_old = arr_line;
}
}
inspection0 = arr_line[0];
inspection1 = arr_line[1];
inspection2 = arr_line[2];
inspection3 = arr_line[3];
}
синхронизацию надо вообще делать независимую от сервоцикла, а то могут возникать "чудеса на ровном месте", например в зависимости от порядка addf.Алексс писал(а):иначе в streamer сбивается синхронизация
в данном случае - работает стандартный компонент емс...UAVpilot писал(а):синхронизацию надо вообще делать независимую от сервоцикла, а то могут возникать "чудеса на ровном месте", например в зависимости от порядка addf.
По сути да. Если это не нужно, то необходимо обрабатывать входящие параметры в компоненте.nkp писал(а):это не "расширение" размера массива при каждой (новой) надобности?
Вполне возможно что так оно и есть.UAVpilot писал(а):Алексс писал(а):в зависимости от порядка addf.
Я про твой код: у тебя clock меняется с 0 на 1 в каждом чётном сервоцикле, и с 1 на 0 в каждом нечётном - зависимости от готовности данных никакой.nkp писал(а):в данном случае - работает стандартный компонент емс...
Например когда сигналы передаются в обе стороны, clock от А к В, а данные от В к А (addf в алфавитном порядке), то изменения clock дойдут от А к В в пределах одного и того-же сервоцикла, а вот данные от В А увидит только в следующем... В твоём случае А уже изменит состояние clock на противоположное.nkp писал(а):а синхронизация...
так она тут условная - получаем новую порцию по срабатыванию пина(пин clock)
опять же - этот пин обновляется только в сервоцикле...
Или делать в компоненте две функции read и write, read помещать в начало сервоцикла, а write в конец. Для примера см. hostmot2.Алексс писал(а):Думаю идеально бы было иметь общий сигнал когда передатчик выставляет его в 1 - есть данные а приемник сбрасывает в 0 - прочитано.