Помогите ускорить скетч для Arduino Due.

jorj22
Offline
Зарегистрирован: 17.07.2018


Программа написана в Flprog.

При частоте внутреннего генератора 500 Кгц секвенсор переключает шаги с частотой 21530 Гц.

Мне надо поучить стабильных 50 кгц. Куда копать.

const byte Sequencer_129662790_Out1_ValArr[] PROGMEM = {1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0};
const byte Sequencer_129662790_Out2_ValArr[] PROGMEM = {1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0};
const byte Sequencer_129662790_Out3_ValArr[] PROGMEM = {1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0};
const byte Sequencer_129662790_Out4_ValArr[] PROGMEM = {1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0};
const byte Sequencer_129662790_Out5_ValArr[] PROGMEM = {1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0};
const byte Sequencer_129662790_Out6_ValArr[] PROGMEM = {1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0};
const byte Sequencer_129662790_Out7_ValArr[] PROGMEM = {1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0};
bool Sequencer_129662790_Out1;
bool Sequencer_129662790_Out2;
bool Sequencer_129662790_Out3;
bool Sequencer_129662790_Out4;
bool Sequencer_129662790_Out5;
bool Sequencer_129662790_Out6;
bool Sequencer_129662790_Out7;
int Sequencer_129662790_CSOUT = 1;
bool Sequencer_129662790_NSOST = 0;
bool _gen3I = 0;
bool _gen3O = 0;
unsigned long _gen3P = 0UL;
void setup()
{
analogReadResolution(8);
analogWriteResolution(8);
pinMode(13, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(10, OUTPUT);
pinMode(9, OUTPUT);
pinMode(8, OUTPUT);
pinMode(7, OUTPUT);

Sequencer_129662790_setStep(0);
}
void loop()
{

//Плата:1
if (1) { if (! _gen3I) { _gen3I = 1; _gen3O = 1; _gen3P = micros(); } } else { _gen3I = 0 ; _gen3O= 0;}
if (_gen3I) { if ( _isTimerMicros ( _gen3P , 1.00 )) { _gen3P = micros(); _gen3O = ! _gen3O;}}
if (_gen3O) { if(! Sequencer_129662790_NSOST) {Sequencer_129662790_NSOST = 1; Sequencer_129662790_setStep(Sequencer_129662790_CSOUT + 1);}} else {Sequencer_129662790_NSOST = 0;}
digitalWrite(7, Sequencer_129662790_Out7);
digitalWrite(8, Sequencer_129662790_Out6);
digitalWrite(9, Sequencer_129662790_Out5);
digitalWrite(10, Sequencer_129662790_Out4);
digitalWrite(11, Sequencer_129662790_Out3);
digitalWrite(12, Sequencer_129662790_Out2);
digitalWrite(13, Sequencer_129662790_Out1);

}
bool _isTimerMicros(unsigned long startTime, unsigned long period )
{
unsigned long currentTime;
currentTime = micros();
if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));}
}
void Sequencer_129662790_setStep(int stepValue)
{int step = stepValue;
if(step < 0 ) {return;}
if(step > 149 ) {step = 0;}
if(step == Sequencer_129662790_CSOUT ) {return;}
Sequencer_129662790_Out1 = (pgm_read_byte(&Sequencer_129662790_Out1_ValArr[step]));
Sequencer_129662790_Out2 = (pgm_read_byte(&Sequencer_129662790_Out2_ValArr[step]));
Sequencer_129662790_Out3 = (pgm_read_byte(&Sequencer_129662790_Out3_ValArr[step]));
Sequencer_129662790_Out4 = (pgm_read_byte(&Sequencer_129662790_Out4_ValArr[step]));
Sequencer_129662790_Out5 = (pgm_read_byte(&Sequencer_129662790_Out5_ValArr[step]));
Sequencer_129662790_Out6 = (pgm_read_byte(&Sequencer_129662790_Out6_ValArr[step]));
Sequencer_129662790_Out7 = (pgm_read_byte(&Sequencer_129662790_Out7_ValArr[step]));
Sequencer_129662790_CSOUT = step;
}

 

b707
Offline
Зарегистрирован: 26.05.2017

Если я к вечеру еще не ослеп, у вас все массивы Sequencer_129662790_Out1 - Out7 одинаковые. Все эти жуткие конструкции чтения битов (хранимых как байты!) из ПРОГМЕМ можно заменить на 5-10 строк кода

b707
Offline
Зарегистрирован: 26.05.2017

Не заметил, что это "творчество" FLProg. Выкиньте эту гадость и напишите код руками - будет раз в 5 короче и значительно надежнее.

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

Флпрог действительно защищается от переполнения миллис? Вот это поворот.

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:

Флпрог действительно защищается от переполнения миллис? Вот это поворот.

а я почему-то не удивлен :)

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

sadman41 пишет:

Флпрог действительно защищается от переполнения миллис? Вот это поворот.

Никакого поворота. Если так работать с микросом (через сложение), то действительно надо защищаться. Так что "усё правельно"!

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Ардублок генерит код не в пример лучше.. :)

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

ЕвгенийП пишет:

Никакого поворота. Если так работать с микросом (через сложение), то действительно надо защищаться. Так что "усё правельно"!

Это я понял, я не понял, зачем сначала в гамак на лыжах становиться, а потом балансировать.

jorj22
Offline
Зарегистрирован: 17.07.2018
Извените, не хотел никого кошмарить своим творчеством. 
Программу написал в Flprog по причине не знания среды программирования ардуино. У меня серьёзные проблемы со зрением , "могу не успеть"...
И так ближе к делу. 
   В первых семи строчках программы указаны состояния семи пинов Arduino Due, "0 или 1 в каждом шаге секвенсора". Всего шагов 150. Это надо для эксперимента,  измерения частоты переключенный секвенсора.  К любоме из пинов подключаю частотомер и получаю частоту коммутации пинов. Секвенсор висит на 13,12,11,10,9,8,7 пинах Arduino Due.  Кроме того секвенсор включён в режиме при достижении последнего шага перейти  к первому , без прерывный цикл, опять таки для эксперимента. 
 
  Сигнал 2 мкс частотой  500 Кгц внутреннего генератора поступает в секвенсор и на пинах Arduino я должен получить 250 Кгц. Но получаю всего 107565Гц. 
Пожалуйста помогите доработать мой!!! скетч для увеличения скорости.
Спасибо всем за участие и удачи в делах.
 
 
 
 
 
5N62V
Offline
Зарегистрирован: 25.02.2016

jorj22 пишет:

Мне надо поучить стабильных 50 кгц. Куда копать.

Вам при таком объеме данных прогмем не нужен, как мне каацо. Вообще-то ответ был дан в 1м посте.  Переведите последовательность нулей и единиц в константную переменную, а ее разбивайте на биты в своей функции Sequencer_129662790_setStep.

а вот это вот накой:

int step = stepValue;

? Используйте stepValue, зачем вы ее другой переменной присваиваете?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

jorj22, вы сначала детально опишите что вы хотите сделать. Потому, что на данный момент это всё выглядит абсолютной бессмыслицей, о чём вам ещё в первом комментарии написали.

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

sadman41 пишет:
зачем сначала в гамак на лыжах становиться, а потом балансировать.
Истинные прогеры не ищут лёгких путей. Это только лохи делают всегда одинаково (по классическим догмам), и потому живут скучно.

jorj22
Offline
Зарегистрирован: 17.07.2018

 

dimax, надо получить вот такое устройство с управлением при помощи ардуины. С возможностью заносить в память ,редактировать  несколько десятков паттернов  , дисплей итд.

http://electronics-lab.ru/blog/mcu/157.html

 

5N62V, скеч не я писал а программа Flprog. Я не умею писать программы для ардуины вообще. Потому попросил вас помочь мне  оптимизировать код который создала программа Flprog. 

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

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

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

3. в любом случае, для такого изделия нужно ДВЕ программы - управляющая на десктоп, под винду или линукс и рабочая на контроллер. Следует продумать хотя бы свои пожелания к обеим. Ну вот, навскидку: одинаковые или разные частоты по каналам? Максимальная длина паттерна? Сколько каналов должны уметь работать одновременно?

 

Ну, как-то так.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

jorj22 пишет:
надо получить вот такое устройство с управлением при помощи ардуины. С возможностью заносить в память ,редактировать  несколько десятков паттернов  , дисплей итд. http://electronics-lab.ru/blog/mcu/157.html

Ну так и делайте как там. На сайте автора проекта есть прошивка для PICа, схемы, печатки,  всё что нужно. Собрать, залить программатором и готово. А как вы вообще собирались состыковать arduino due и ту программу?  Это задача на порядок сложнее чем "разгон" ардуиновского говнокода.

jorj22
Offline
Зарегистрирован: 17.07.2018

Дааа Уж.

 

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

jorj22 пишет:

Дааа Уж.

"Уж" - это в смысле зверь такой из отряда чешуйчатых, или что?

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

ЕвгенийП пишет:

jorj22 пишет:

Дааа Уж.

"Уж" - это в смысле зверь такой из отряда чешуйчатых, или что?

УЖ это точно не PIC т.е. PIG