Организация задержки сигнала на Меге 2560

meteoaza
Offline
Зарегистрирован: 11.09.2015

Добрый день, уважаемые форумчане!
Прошу совета по реализации задержки сигнала.
Задача такая, есть прямоугольный импульс, надо сгенерировать аналогичный с задержкой по времени.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

В чём трудности?

sadman41
Offline
Зарегистрирован: 19.10.2016

Трудности в написании кода, видимо. Других тут пока не видел.

meteoaza
Offline
Зарегистрирован: 11.09.2015

Дело в срочности. Давно не возился с микроконтроллерами, лет 5 уже.
Времени мало на реализацию. Нужно сделать задержку сигнала. Имеею четыре пакета с частотой 4 Гц по 16 импульсов частотой около 2 кГц.
На данный момент вижу картину так, по фронту первого пучка генерирую нужный сигнал.
Правильно ли я мыслю?

meteoaza
Offline
Зарегистрирован: 11.09.2015

sadman41 пишет:

Трудности в написании кода, видимо. Других тут пока не видел.


Синтаксис не проблема, но логическую цепочку пока слету не могу.
Последнее время пишу на Питоне десктопные решения, Си вместе с ассемблером уже немного позабыты, но понимание есть.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Если интервалы пересекаются, т.е задержка меньше длительности активного уровня входящего сигнала, то: 

1. Ждёшь активный фронт.

2. Запускаешь таймер на величину задержки. Засекаешь время.

3. После срабатывания таймера - активный уровень на выходную ногу

4. Ждёшь неактивный фронт. Считаешь длительность сигнала

5. Через время = (длительность сигнала) - (то которое ты засёк в п.2) подаешь на выходную ногу пассивный уровень. Либо опять же, через величину заданной задержки, нинаю чо дано.  

6. Repeat.

meteoaza
Offline
Зарегистрирован: 11.09.2015

DetSimen пишет:

Если интервалы пересекаются, т.е задержка меньше периода входящего сигнала, то: 

1. Ждёшь активный фронт.

2. Запускаешь таймер на величину задержки. Засекаешь время.

3. После срабатывания таймера - активный уровень на выходную ногу

4. Ждёшь неактивный фронт. Считаешь длительность сигнала

5. Через время = (длительность сигнала) - (то которое ты засёк в п.2) подаешь на выходную ногу пассивный уровень. Либо опять же, через величину заданной задержки, нинаю чо дано.  

6. Repeat.


А если период задержки больше? Вообще будет изменяемый период. Но диапазон пока неизвестен

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

тогда считай длительность входящего импульса. А выходной запускай через задержку от стартового. 

По условиям задачи длительности одинаковы?  у входного и выходного. 

meteoaza
Offline
Зарегистрирован: 11.09.2015

Пока одинаковы длительности.
Но если не хранить входящий, то разве я не упущу его на выходном?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ты определись, у тебя входящий импульс (подразумевается, одиночный), или всё же периодический сигнал, который надо повторять на выходе с задержкой?   

meteoaza
Offline
Зарегистрирован: 11.09.2015

DetSimen пишет:

ты определись, у тебя входящий импульс (подразумевается, одиночный), или всё же периодический сигнал, который надо повторять на выходе с задержкой?   


Периодический сигнал один раз в три секунды четыре пакета в секунду, в каждом пакете 16 импульсов

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Пока таймлайн не разрисуешь, ничего не получится. Сложно по телефону пиндицит вырезать

meteoaza
Offline
Зарегистрирован: 11.09.2015

DetSimen пишет:

Пока таймлайн не разрисуешь, ничего не получится. Сложно по телефону пиндицит вырезать


В понедельник буду в конторе, смогу скинуть осциллограмку.
Если не затруднит, код накидать смогешь на регистрацию фронта, взвода таймера?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

бесплатно на этом форуме "накидывают" только понос на вентилятор.  Ну еще советы дают и направление гугленья.  Если код сам писать не хочешь по советам -> на этом же форуме "Ищу исполнителя"

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

meteoaza пишет:

код накидать смогешь на регистрацию фронта, взвода таймера?

Папал ты, Дет! ;)) Яш говорил - доброта тебя погубит! Гы!

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

wdrakula пишет:

Папал ты, Дет! ;)) Яш говорил - доброта тебя погубит! Гы!

см. моё предыдущее сапщение.  Нихрена я не добрый сёдня. 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

DetSimen пишет:

wdrakula пишет:

Папал ты, Дет! ;)) Яш говорил - доброта тебя погубит! Гы!

см. моё предыдущее сапщение.  Нихрена я не добрый сёдня. 

уже. Успел аправдаццо!

meteoaza
Offline
Зарегистрирован: 11.09.2015

Вполне так доступно ответил. Уважаю прямоту. Сам писать хочу. Советы тоже должны монетизироваться или безвозмездно (то есть даром)?

meteoaza
Offline
Зарегистрирован: 11.09.2015

Благодарю за внимание! Дай Вам бог долгих лет жизни и благополучия.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

2ТС: Родное серце - не утаи, скажи, с какой точностью тебе нужны фронты в копии? - эт рас, и дфа - какие преполагаюццо задержки - порядка секунды? - часа? месяца? - до конца правления ВВП? ;)))))

Это к тому вопрос, что поместится ли весь сигнал в задержку? Тогда его нужно весь запомнить, и тогда мой первый вопрос важен - а с  какой точностью его запоминать?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

meteoaza пишет:
Вполне так доступно ответил. Уважаю прямоту. Сам писать хочу. Советы тоже должны монетизироваться или безвозмездно (то есть даром)?

Советы - бесплатно. Но для советов таймлайн нужен. 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

meteoaza пишет:
Вполне так доступно ответил. Уважаю прямоту. Сам писать хочу. Советы тоже должны монетизироваться или безвозмездно (то есть даром)?

Мы ж тут родом ысчо из "страны советофф", такшта советы, по старой памяти, иногда, ну там по праздникам, можно бээз-возмездно! Привычка - вторая натура, а что делать? ;))

Joog
Offline
Зарегистрирован: 03.01.2020

meteoaza кури вот эту тему. Что то наподобии: "Задача функции обработки прерывания - отлов интервалов с радиоприемника. Интервал - это импульс 0 или 1 уровня, нам надо определить его длительность и собственно уровень.
Функция обработки прерывания должна вызываться каждый раз при смене уровня на входе МК, к которому подключен приемник. У нас это нога INT0, а прерывание настроено на срабатывание как по положительному так и отрицательному перепаду (фронту).
Еще раз, для закрепления - наша функция-обработчик будет автоматически вызываться на каждом фронте сигнала с приемника.
Для вычисления длительности - нам надо запоминать время последнего срабатывания прерывания, и при очередном срабатывании - вычитать из текущего времени, последнее записаное. Разность и будет длительность интервала между фронтами.
Собственно у ардуины в фоне тикает таймер, который непрерывно считает микросекунды с момента включения, нам этот таймер прекрасно подойдет." И потом, через нужный промежуток времени (задержка), дергать пином с записанной длительностью.

/*
прерывание от перепада уровня.

работаем с тремя переменными: len, level, last
1. в переменную len мы помещаем вычисленную длительность интервала
2. в переменную level - уровень этого интервала. Определяем его кстати просто- если после срабатывания прерывания (т.е. после фронта) на этом входе висит 0, значит до срабатывания там был 1, т.е. мы поймали положительный импульс.
зачем тут level сравнивается с 255 - будет показано далее.
3. а переменная last нам нужна чтобы смотреть время последнего отлова фронта, чтобы высчитать длину.
*/
void rx_int()
{
  if(level!=255) return;
  
  len=micros()-last;
  last=micros();
  
  if(digitalRead(CC_RX)==HIGH) level=0;
    else level=1; 
}

/*
функция приема.

эту функцию мы вызываем каждый раз после отлова очередного интервала, не важно какого - 0 или 1 (использовать надо все). Описание способа приема (ну тоесть как использовать эти интервалы, чтобы в конце концов принять данные) будет в ледущем посте, сейчас мы про общую структуру говорим.
*/
void process_starline()
{
 
}

void setup()
{
  //тут нам надо настроить прерывания, порты и так далее.
  //прерывание настраиваем так, чтобы по его срабатыванию вызывалась функция rx_int()
}

//собственно главный цикл
void loop()
{ 
  //если level равен 0 или 1 - значит приняли интервал, надо его обработать
  if(level!=255)
  {
    /*
    копируем параметры импульса в отдельные (рабочие) переменные, и присваиваем level значение 255
    У нас в прерывании переменная level сравнивается с этим значением, и если там не 255 то прерывание ничего не делает, т.е не измеряет длительность и уровень, потому что мы еще прошлое значение не скопировали в рабочие переменные.
    */
    p_level=level;
    p_len=len;
    len=0;
    level=255;
    
    //ну и вызываем функцию обработки принятого интервала. Причем эта функция работает с переменными p_level и p_len, в которые мы копировали значения, а не с теми, которые используются в прерывании. Это сделано чтобы в ходе работы функции переменные внезапно не поменялись прерыванием.
    process_starline();
    
    //в ходе приема удобно использовать так же длину предыдущего интервала, поэтому сохраняем ее тут
    p_len_prev=p_len;
  }
  
  //проверяем, а не выставлен ли флаг окончания приема. Если он выставлен (я использую значение 100 для его обозначения), то выводим посылку в терминал, а далее сбрасываем прием в 0 (т.е. разрешаем прием следующей посылки)
  if(starline.state==100)
  {
    Serial.print("STARLINE[");
    Serial.print(starline.dat_bit);
    Serial.print("]: ");
    dump_hex(starline.data, starline.dat_bit);
    starline.state=0;
  }
}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

коли тебе срочно, то как таймлайн будет готов пиши напрямую, elf-basic@yandex.ru

meteoaza
Offline
Зарегистрирован: 11.09.2015

DetSimen пишет:

коли тебе срочно, то как таймлайн будет готов пиши напрямую, elf-basic@yandex.ru


Благодарю за поддержку!