Сигналы с микросекундной задержкой

Marcion19
Offline
Зарегистрирован: 17.02.2021

Доброго времени суток!

Какую плату лучше выбрать для проекта, где нужно подать несколько сигналов с задержкой 1-4 мкс?

Про 16 МГц читал, что у них разрешение 4 мкс и на менее 3 мкс работа не гарантированна.

 

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

4мкс - это шаг для функции micros(). Сама железяка работает быстрее, и такие задержки получить можно, если не завязываться на функционал Wiring.

Marcion19
Offline
Зарегистрирован: 17.02.2021

Т.е через MATLAB Stateflow или MATLAB and Simulink вполне реально задать?

Или лучше что-то другое?

Upper
Offline
Зарегистрирован: 23.06.2020

Marcion19 пишет:

Какую плату лучше выбрать для проекта, где нужно подать несколько сигналов с задержкой 1-4 мкс?

Если планируете программировать сами, то начните и проверьте подходит ли вам плата с которой у вас больше всего опыта работы.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Marcion19 пишет:

Т.е через MATLAB Stateflow или MATLAB and Simulink вполне реально задать?

Я не знаю, что означают все эти слова. В простой программе на С/С++ или на ассемблере - как два пальца. А с этими словами ... наверняка по ним есть специальные форумы, спросите там.

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

Marcion19 пишет:

Т.е через MATLAB Stateflow или MATLAB and Simulink вполне реально задать?

Или лучше что-то другое?

лучше научиться программировать без автоматического генератора кода. Про него нет никаких данных - умеет ли он задавать микросекундные задержки на Ардуино. Проверить это - доверяем тебе!

Green
Offline
Зарегистрирован: 01.10.2015

Какой-нить ds18b20 - ну чем не мкс задержки! 1 мкс - это 16 команд Ардуино как - никак.

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

Green пишет:

Какой-нить ds18b20 - ну чем не мкс задержки! 1 мкс - это 16 команд Ардуино как - никак.

Гы! Помню мне один раз пришлось набирать nop-ами аккуратно задержки с высокой точностью. Чтобы именно по одному nop-у градация - по 62.5 нс. Забыл  уже - для какого проекта :((. Но на ослике красиво было!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

wdrakula пишет:
Забыл  уже - для какого проекта :((
Я это делал для 2811/2812. Даже макрос написал для ассемблера

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Генерирует ровно amount nop'ов
;
.macro  nops amount
	.if \amount > 0
		nop
		nops (\amount-1)
	.endif
.endm

 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

sadman41 пишет:

4мкс - это шаг для функции micros(). Сама железяка работает быстрее, и такие задержки получить можно, если не завязываться на функционал Wiring.

4мкс длится переключение состояния вывода при прямой работе с портом.
Так что не только micros().

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Kakmyc пишет:
4мкс длится переключение состояния вывода при прямой работе с портом. Так что не только micros().
Чиво??? Т.е. переключение состояния порта длится 64 такта? Ахренительно!

Это кто ж Вам такое сказал?

Green
Offline
Зарегистрирован: 01.10.2015

Kakmyc пишет:
4мкс длится переключение состояния вывода при прямой работе с портом. Так что не только micros().

62.5 нс не хотите? При 16 мгц.)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Green пишет:

Kakmyc пишет:
4мкс длится переключение состояния вывода при прямой работе с портом. Так что не только micros().

62.5 нс не хотите? При 16 мгц.)

да какая разница какая частота, обычно - один такт процессора

Marcion19
Offline
Зарегистрирован: 17.02.2021

Правильно ли понял, что можно, на той же меге, использовать delayMicroseconds() и не извращаться?

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Marcion19 скорее всего нет, так как delayMicroseconds() имеет минимальный порог

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

См _delay_us()

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Marcion19 пишет:

Правильно ли понял, что можно, на той же меге, использовать delayMicroseconds() и не извращаться?

Использовать, конечно, можно. Но подойдет ли это для Вашей задачи - неизвестно, т.к. задачу Вы не описали.

anatoli_nik
Offline
Зарегистрирован: 17.01.2019

А кто не дает использовать 

#include "util/delay.h"
//и пользовать
_delay_us();//кратно 1 мкс (но, тип данных double подразумевает даже дробные числа)
//или даже
#include "util/delay_basic.h"
_delay_loop_1();//кратно трем машинным циклам
//и еще
asm volatile(  
"nop \n"    //кратно одному циклу
);

 

Green
Offline
Зарегистрирован: 01.10.2015

wdrakula пишет:
Помню мне один раз пришлось набирать nop-ами аккуратно задержки с высокой точностью. Чтобы именно по одному nop-у градация - по 62.5 нс. Забыл  уже - для какого проекта :((. Но на ослике красиво было!


Вы будете смеяться. Человеку нужно было 500 кгц на выходе.

#include "main.h"
#include "timer.h"
#include "int.h"
#include "comp.h"
#include "adc.h"
#include "config.h"


set_config();

volatile bool start;

void main() {
  comp_off();
  adc_init(VOLUME);
  off(FREQ);  out(FREQ);
  off(PULSE); out(PULSE);
  timer_init();
  int_enable();
  pin_change_en(1<<RISE | 1<<FALL);
  while (true) {
    sleep();
    if (start)
      break;
  }
  start = false;
  pin_change_dis();
  timer_start();
  on(PULSE);
  
  // frequency generation
  freq_init();
  while (true) {
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
    freq_toggle();
  }
}


void interrupt service() {
  static uint8_t cnt;
  
  if (timer_int()) {                    //прерывание от таймера
    timer_int_clear();
    #if DEBUG
    if (++cnt >= 1) {
    #else
    if (++cnt >= PULSE_TIME) {
    #endif
      off(PULSE);
      reset();
    }
  }
  if (pin_change()) {                   //по изменению на пине
    pin_change_clr();
    if (pin(RISE) || !pin(FALL))
      start = true;
  }
}

При этом.

#define freq_init()       do { off(FREQ); asm("movlw 1<<0"); } while (false) //FREQ
#define freq_toggle()     asm("xorwf 5")

Жаль что нету что то типа IRP директивы.)

anatoli_nik
Offline
Зарегистрирован: 17.01.2019

Цитата:
Человеку нужно было 500 кгц на выходе.

А что таймер в режиме CTC не катит?

Как пример, на таймере 2, на PORTB,3 (он же вывод 11 ардуино нано) :


DDRB |= (1<<3)
TCCR2A=((1<<COM2A0)|(1<<WGM21));
TCCR2B=(1<<CS20);
OCR2A =15;

 

Green
Offline
Зарегистрирован: 01.10.2015

А нету СТС. Это из другой оперы. Просто пример когда приходится тупо считать такты.
Там 1 мгц всего тактовая, а нужно дёргать пином на 500 кгц в течение 15 сек.

anatoli_nik
Offline
Зарегистрирован: 17.01.2019

Как то я упустил что это PIC гребанный... Не досмотрел что его ассемблер.

Green
Offline
Зарегистрирован: 01.10.2015

Да, есть ещё пикоманы. Некоторые так AVR на дух не переносят.)