Наносекундный одиночный импульс по триггеру

я профессиональный балабол, боюсь, к данной задаче моя квалификация неприменима.

3 лайка

таймера хорошо освоил @Dimax

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

как бы для понимания что там надо знать вот можешь почитать на русском, может и сам осилишь … Таймеры stm32 HAL - часть вторая

1 лайк

Хватит меня рекламировать :grinning: Я конечно могу написать, только мне-то оно зачем… @Bogolepov по-моему спаять одновибратор на одной микрухе гораздо быстрее, чем написать эту программу под stm. Ну по крайней мере я бы думаю быстрее спаял, чем написал :slight_smile:

1 лайк

Дима @dimax , я просто убедиться, что всё ок, а то давно ничем нас не радуешь )))
PS помню для avr ты приводил код на таймере поднять-опустить лапу, мне понравилось, но поиском быстро не нашёл, думал аналогичное и на STM пробовал…мысли вслух…

Опять радиогубитель от безделья на слабо брать пытается…

2 лайка

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

я за последнее время более 1000 этажей ножками пробежал, а ты говоришь от безделья, …просто рад видеть Димакса в полном здравии…своё видение Дима озвучил, я с ним солидарен

Если это единственная задача для МК…

За ради интереса попробовал на ATmega328p ногодрыг в Proteus,
почти получилось)).
Почему-то компилятор повторяет команды записи в порт по 2 раза.

Спойлер

Возможно, на асме можно допилить, но уже нет времени , это мне надо AVR асм подучить, а я только PIC немного знаю.))

Спойлер
#include <avr/io.h>
#define  pinINmask 4  //PD2 пин управляющего сигнала
#define  pinOUTmask 8  //PD3 пин выходящего сигнала

  int main(){

 DDRD = 8;
 PORTD = 0;

   while(1){
   while(!(PIND & pinINmask));
 
  asm volatile("LDI R16,  0x08");  
  asm volatile("OUT 0x0B, R16");

  asm volatile("LDI R16,  0x00"); 
  asm volatile("OUT 0x0B, R16");
 
   while(PIND & pinINmask);

    }
return 0;
  }
Спойлер

Вы на адреса гляньте - это протеус так отображает …

Можно и короче - надо тоглить бит в порту PINx…
Код набивался в протеус ? Там по умолчанию оптимизация отключена !

1 лайк

И скоко на осциллограмме клеточка длиться?

Да пробовал SBI, но это не то, знаний по асму AVR не хватило.))

Пробовал и -0 и -S - одинаково.

К сожалению, комп слабый, не тянет в реальном времени.
Картинка для наглядности.
Длительность импульса (расчётная, без учёта фронтов) - две команды. Т.е. 125нс

Всё же думаю, эту задачу можно решить таким образом. Знаний не хватает.
Вот Komandir бы точно справился))

P.S

Только дошло, значит всё норм., должно работать!

Осциллограмма тоже рисуется не в реальном времени. Так что времена на осциллограмме правильные.

1 лайк

На C\C++ импульс может быть от 1/16000000=62.5 наносекунд и выше, а вот реакция скачет от 250 до 437,5 нс …

void setup () {
    DDRD=1; //Импульс формируется на PD0, а запускается фронтом любого другого бита в PD
    while (1)
    {
        while (PIND);
        while (!PIND);
        PIND=1;
        PIND=1;
    }
}
void loop() {
}

На C\C++ и Inline ASM реакция уже 187.5 - 312.5 нс

void setup () {
    asm volatile(
        "ldi r16,1 \n\t"
        "out 10,r16 \n\t" //Импульс формируется на PD0, а запускается фронтом на PD1
        "l: \n\t"
        "sbic 9,1 \n\t"
        "rjmp l \n\t"
        "l1: \n\t"
        "sbis 9,1 \n\t"
        "rjmp l1 \n\t"
        "out 9,r16 \n\t"
        "out 9,r16 \n\t"
        "rjmp l \n\t"
    );
}
void loop() {
}

1 лайк

Ну да, похоже что так. Цена деления 0.5us

Спойлер

Спойлер