Помогите ускорить скетч для Arduino Due.
- Войдите на сайт для отправки комментариев
Программа написана в 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;
}
Если я к вечеру еще не ослеп, у вас все массивы Sequencer_129662790_Out1 - Out7 одинаковые. Все эти жуткие конструкции чтения битов (хранимых как байты!) из ПРОГМЕМ можно заменить на 5-10 строк кода
Не заметил, что это "творчество" FLProg. Выкиньте эту гадость и напишите код руками - будет раз в 5 короче и значительно надежнее.
Флпрог действительно защищается от переполнения миллис? Вот это поворот.
Флпрог действительно защищается от переполнения миллис? Вот это поворот.
а я почему-то не удивлен :)
Флпрог действительно защищается от переполнения миллис? Вот это поворот.
Никакого поворота. Если так работать с микросом (через сложение), то действительно надо защищаться. Так что "усё правельно"!
Ардублок генерит код не в пример лучше.. :)
Никакого поворота. Если так работать с микросом (через сложение), то действительно надо защищаться. Так что "усё правельно"!
Это я понял, я не понял, зачем сначала в гамак на лыжах становиться, а потом балансировать.
Вам при таком объеме данных прогмем не нужен, как мне каацо. Вообще-то ответ был дан в 1м посте. Переведите последовательность нулей и единиц в константную переменную, а ее разбивайте на биты в своей функции Sequencer_129662790_setStep.
а вот это вот накой:
int step = stepValue;
? Используйте stepValue, зачем вы ее другой переменной присваиваете?
jorj22, вы сначала детально опишите что вы хотите сделать. Потому, что на данный момент это всё выглядит абсолютной бессмыслицей, о чём вам ещё в первом комментарии написали.
dimax, надо получить вот такое устройство с управлением при помощи ардуины. С возможностью заносить в память ,редактировать несколько десятков паттернов , дисплей итд.
http://electronics-lab.ru/blog/mcu/157.html
5N62V, скеч не я писал а программа Flprog. Я не умею писать программы для ардуины вообще. Потому попросил вас помочь мне оптимизировать код который создала программа Flprog.
1. давить на жалость - низко. Если можешь писать на форум, то можешь и программировать, несмотря проблеммы со зрением, сорри за каламбур.
2. если не умеешь программировать, то либо учись либо заказывай. Третий путь - клянчить на форуме, давя на жалость - как-бы тебе повежливее сказать? - несолидно, что ли...
3. в любом случае, для такого изделия нужно ДВЕ программы - управляющая на десктоп, под винду или линукс и рабочая на контроллер. Следует продумать хотя бы свои пожелания к обеим. Ну вот, навскидку: одинаковые или разные частоты по каналам? Максимальная длина паттерна? Сколько каналов должны уметь работать одновременно?
Ну, как-то так.
Ну так и делайте как там. На сайте автора проекта есть прошивка для PICа, схемы, печатки, всё что нужно. Собрать, залить программатором и готово. А как вы вообще собирались состыковать arduino due и ту программу? Это задача на порядок сложнее чем "разгон" ардуиновского говнокода.
Дааа Уж.
Дааа Уж.
"Уж" - это в смысле зверь такой из отряда чешуйчатых, или что?
Дааа Уж.
"Уж" - это в смысле зверь такой из отряда чешуйчатых, или что?
УЖ это точно не PIC т.е. PIG