я профессиональный балабол, боюсь, к данной задаче моя квалификация неприменима.
таймера хорошо освоил @Dimax
просто создай тему в платном разделе, если сразу озвучишь сколько готов заплатить, то дело пойдет быстрее.
т.е. народ или сразу откажется или согласится
как бы для понимания что там надо знать вот можешь почитать на русском, может и сам осилишь … Таймеры stm32 HAL - часть вторая
Хватит меня рекламировать Я конечно могу написать, только мне-то оно зачем… @Bogolepov по-моему спаять одновибратор на одной микрухе гораздо быстрее, чем написать эту программу под stm. Ну по крайней мере я бы думаю быстрее спаял, чем написал
Дима @dimax , я просто убедиться, что всё ок, а то давно ничем нас не радуешь )))
PS помню для avr ты приводил код на таймере поднять-опустить лапу, мне понравилось, но поиском быстро не нашёл, думал аналогичное и на STM пробовал…мысли вслух…
Опять радиогубитель от безделья на слабо брать пытается…
Собственно говоря, опять решаем проблему не проблемы. Зачем всё это нужно? Может быть кварцевый генератор и логика на мс решили бы проблему без программирования ?))
я за последнее время более 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…
Код набивался в протеус ? Там по умолчанию оптимизация отключена !
И скоко на осциллограмме клеточка длиться?
Да пробовал SBI, но это не то, знаний по асму AVR не хватило.))
Пробовал и -0 и -S - одинаково.
К сожалению, комп слабый, не тянет в реальном времени.
Картинка для наглядности.
Длительность импульса (расчётная, без учёта фронтов) - две команды. Т.е. 125нс
Всё же думаю, эту задачу можно решить таким образом. Знаний не хватает.
Вот Komandir бы точно справился))
P.S
Только дошло, значит всё норм., должно работать!
Осциллограмма тоже рисуется не в реальном времени. Так что времена на осциллограмме правильные.
На 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() {
}