Вы о каком коде? Я уже в них запутался. И ещё, всё-таки у меня приступы головной боли от Вашего квадратичного решения. Надо делать через таблицу, низзя так.
Вы о каком коде? Я уже в них запутался. И ещё, всё-таки у меня приступы головной боли от Вашего квадратичного решения. Надо делать через таблицу, низзя так.
Можно и через таблицу, но она двухмерная жеж данные и длина получается, как у brokly
Код этот, строку для отправки освобождать не надо, инициировать один раз в setup, значит должна быть глобальная, пока не возникнет необходимость её изменить, отслеживать предполагаю по флагу актуальности
А вообще предполагается следующий алгоритм:
1. При включении считываем данные из EEPROM в структуру
2. Считываем флаг записи структуры в EEPROM
3. Если запись структуры в EEPROM была ранее произведена, то строку формируем из структуры, иначе из строки первичной инициализации структуры
// Строка для отправки сформируется внутри,
// а при выходе будет освобождена
//
void sendMsg(MyBeacon & mbStr) {
static const char middle[] = "BEACON QRA is"; // серёдка сообщения
static const int8_t sizeMiddle = strlen(middle); // длина серёдки сообщения
static const int8_t repeatCounter = 2; // сколько раз повторять позывной и ... тот хвост
//
// strSize - длина строки для отправки по sms, включая терминальный ноль.
const int8_t strSize = sizeMiddle + (strlen(mbStr.call_sign) + strlen(mbStr.loc) + 2) * repeatCounter + 1;
volatile char str[strSize];
//
// Заполняем строку
str[0] = '\0';
for (int8_t i = 0; i < repeatCounter; i++) {
strcat(str, mbStr.call_sign);
strcat(str, " ");
}
strcat(str, middle);
for (int8_t i = 0; i < repeatCounter; i++) {
strcat(str, " ");
strcat(str, mbStr.loc); // Собрали строку текста Маяка
}
}
в смысле от балды, нормальная кодировка, проверьте (к 5 пину зуммер от системника)
ОК, понял.) Вы всегда пишете через жо? Ну ведь слева направо писать как то понятнее всёж таки? Нежели по арабски.) В чём преимущество? Хотя, дело хозяйское, конечно.
//ТАБЛИЦА ГЕНЕРАЦИИ БУКВЫ АЗБУКИ МОРЗЕ
// ''
// 0 1 2 3 4 5 6 7 8 9
// A B C D E F G H I J
// K L M N O P Q R S T
// U V W X Y Z
// описание буквы 0-точка, 1 -тире
const PROGMEM uint8_t morseCode[]={B10000000,
B00000100,B00001100,B00011100,B00111100,B01111100,B11111100,B11110100,B11100100,B11000100,B10000100,
B01100000,B11101000,B10101000,B11010000,B11000000,B10111000,B10010000,B11111000,B11100000,B00011000,
B01010000,B11011000,B00100000,B10100000,B00010000,B10011000,B01001000,B10110000,B11110000,B01000000,
B01110000,B01111000,B00110000,B01101000,B00101000,B11001000};
// секвенция по символу
uint8_t getMorzeSeq(char in) {
uint8_t till = 0;
if (in < '0') {
//...
} else if (in <= '9') {
till = in - 0x2F; // если цифра , то корректируем на 0x2F;
} else if (in < 'A') {
//...
} else if (in <= 'Z') {
till = in - 0x36; // заглавные буквы до Z, в нашей таблице с 11 до 37
} else if (in < 'a') {
// ...
} else if (in <= 'z') {
till = in - 0x56; // маленькие, передаем как заглавные буквы до z, в нашей таблице с 11 до 37
}
return pgm_read_byte_near(morseCode+till);
}
void sendBeacon(char* _thePhrase) {
while (*_thePhrase) {
if (*_thePhrase==' '){
delay(3*DOTLEN);
} else {
uint8_t buff=getMorzeSeq(*_thePhrase);
uint8_t mask=1;
while(!(buff & mask)){
mask<<=1;
}
mask<<=1;
while(mask){
(buff & mask) ? dot() : dash();
mask<<=1;
}
break;
}
_thePhrase++;
delay(2*DOTLEN);
}
}
Сердце кровью обливается?)
Удивительно что ещё хоть кто-то этим морзе занимается. Я вообще считал что CW в наше время не востребовано совсем.) А тут бац, мужичёк заказывает клавиатурный датчик кода морзе... для работы! Я так понял, военнослужащий...)
Сердце кровью обливается?)
Удивительно что ещё хоть кто-то этим морзе занимается. Я вообще считал что CW в наше время не востребовано совсем.) А тут бац, мужичёк заказывает клавиатурный датчик кода морзе... для работы! Я так понял, военнослужащий...)
уже нет )))
CW хорош, мы единственные с Михаилом UA1QV в истории ВДВ кто сделал канал связи на 1000км при мощности передатчика 1 ватт!!!
Ну я то немного другим боком к этому Морзе. Есть такая хрень "приводной маяк" называется. В аэропортах, аэродромах и вертодромах устанавливается. Сигнальные огни, опять же для всяких авиаций. Там нужно. Правда фразы короткие там, но это ничего не менят. У световых указателей еще тайминги отличаются.
//ТАБЛИЦА ГЕНЕРАЦИИ БУКВЫ АЗБУКИ МОРЗЕ
// ''
// 0 1 2 3 4 5 6 7 8 9
// A B C D E F G H I J
// K L M N O P Q R S T
// U V W X Y Z
// описание буквы 0-точка, 1 -тире
const PROGMEM uint8_t morseCode[]={B10000000,
B00000100,B00001100,B00011100,B00111100,B01111100,B11111100,B11110100,B11100100,B11000100,B10000100,
B01100000,B11101000,B10101000,B11010000,B11000000,B10111000,B10010000,B11111000,B11100000,B00011000,
B01010000,B11011000,B00100000,B10100000,B00010000,B10011000,B01001000,B10110000,B11110000,B01000000,
B01110000,B01111000,B00110000,B01101000,B00101000,B11001000};
// секвенция по символу
uint8_t getMorzeSeq(char in) {
uint8_t till = 0;
if (in < '0') {
//...
} else if (in <= '9') {
till = in - 0x2F; // если цифра , то корректируем на 0x2F;
} else if (in < 'A') {
//...
} else if (in <= 'Z') {
till = in - 0x36; // заглавные буквы до Z, в нашей таблице с 11 до 37
} else if (in < 'a') {
// ...
} else if (in <= 'z') {
till = in - 0x56; // маленькие, передаем как заглавные буквы до z, в нашей таблице с 11 до 37
}
return pgm_read_byte_near(morseCode+till);
}
void sendBeacon(char* _thePhrase) {
while (*_thePhrase) {
if (*_thePhrase==' '){
delay(3*DOTLEN);
} else {
uint8_t buff=getMorzeSeq(*_thePhrase);
uint8_t mask=1;
while(!(buff & mask)){
mask<<=1;
}
mask<<=1;
while(mask){
(buff & mask) ? dot() : dash();
mask<<=1;
}
break;
}
_thePhrase++;
delay(2*DOTLEN);
}
}
Прям как Евгений Петрович хотел )))
А начиналось с малого, с хранения даных, которые могут меняться в EEPROM и реплики Евгения, ЧТО для структуры есть простые команды EEPROM.get() и EEPROM.put() и даные очень хорошо укладывались в структуру, то-есть позывной, текстовка, локатор размещения...а код маяка уже был (чужой), кривописанный по Вашим определениям но работающий как швейцарские часы )))
в смысле от балды, нормальная кодировка, проверьте (к 5 пину зуммер от системника)
ОК, понял.) Вы всегда пишете через жо? Ну ведь слева направо писать как то понятнее всёж таки? Нежели по арабски.) В чём преимущество? Хотя, дело хозяйское, конечно.
Это не я, sadman41 предложил два решения, там где справа на лево были ошибки или я кода совсем не понял, взял за основу слева на право сам то я такое разве бы смог написать, да ни в жисть )))
А там речь не шла об экономии. Спросили как формировать "переменную строку", чтобы её можно было eeprom.put'ом в епром пихать, я показал как можно сделать.
Например, разбиваете Вашу ЭППЗУ на блоки равного размера.
Самый первый обзываете суперблоком и пишете туда размер одного блока, их количество, сколько свободных блоков осталось и ещё может что.
Следом в одном или нескольких блоках размещаете битовую карту занятых блоков (бит сброшен - блок занят).
Каждый блок состоит из номера следующего блока и данных.
В следующем после битовой карты блоке размещается каталог, содержащий записи вида: номер первого блока/размер информации.
Для добавления нового Value ищете первую свободную запись в каталоге, если нет, добавляете к каталогу ещё один блок.
Далее находите столько номеров свободных блоков, сколько требуется для размещения Value, записывается информацию в эти блоки, располагая их цепочкой, вносите изменения в битовую карту и суперблок. Ключом будет являтся номер первого блока в цепочке.
В нормальных ассемблерах, разумеется есть. И простые типы, и структуры - всё там есть.
ну так это в нормальных, а когда из доступных средств есть только встроенная команда debug, а попраграммировать очень хочется )))
Кстати, в руках там в любом месте программы возможность создания и использования глобальных (не регистровых) переменных и экономное и правильное выделение памяти полностью на программисте...
ЗЫ А ассемблеру учился у Питера Нортона
PPS примера, как сделать функцию не блокирующей, так и не последовало )))
как сделать функцию не блокирующей, так и не последовало )))
Ну так там не только о функции нужно думать, а и том что вы будете делать вне её. А в самой функции вы должны запоминать текущую ситуацию, с тем что бы продолжать с неё при последующем вызове.
Для примера.
// send char, true - end
bool MorseChar(uint8_t chr)
{
static uint8_t dat;
if (!dat) { //new uint8_t, if ready
if (chr == ' ')
dat = 1<<7; //pause
else
dat = pgm_read_byte(&(morse_tab[HEX_CHAR_TO_BIN(chr)]));
}
if (MorseDat(dat)) //send
dat = 0;
return !dat;
}
// send morse data, true - end
static bool MorseDat(uint8_t dat)
{
static uint8_t dat01;
static uint8_t seq;
if (!seq) {
if (!dat01)
dat01 = dat;
if (dat01 == 1<<7)
seq = B00001000; //pause
else if (dat01 & 1<<7)
seq = B11110000; //dash
else
seq = B11000000; //dot
}
if (MorseSequence(seq)) { //send
seq = 0;
dat01 <<= 1;
}
return !dat01 && !seq;
}
// send sequence, true - ready
static bool MorseSequence(uint8_t seq)
{
static uint8_t sequence;
if (!sequence)
sequence = seq;
off(MORSE);
if (sequence != 1<<7 && sequence & 1<<7)
on(MORSE);
sequence <<= 1;
return !sequence;
}
я и говорю, будет такая борьба за мир, что камня на камне не останется...
открыл ветку в проектах, там скетч привели простого маячка, строк 80 всего, с учетом, что генерация частоты средствами таймера ардуины, запоминают знаки непосредственно в точках и тире (строками в духмерном массиве), да не экономно вроде, но простота подкупает
А в приведенном мной примере от brokly нет смысла борьбы c делеями, даже если буду прикручивать дисплей, можно его обработку зацепить за прерывание
Ну дак правильно. У каждого свои приоритеты. Кому то нужно впихнуть невпихуемое, а кому то нужно тяп-ляп и в продакшен.) Как правило, все эти маячки на каких нибудь Тини13, вот и думайте.)
]Вот бывают же на форуме здоровые мысли. А то делеефобы уже превратили это в фетишь - борются ради борьбы.
Я так понимаю, это камушек в мой огород. В данном, конкретном случае, если я правильно понимаю, предполагается набор фраз с клавиатуры, или это спутник , который кроме пи-пи-пи ничего не делает ?
Делей, в любом случае зло. А запускать что то в прерывании, из-за того что не понимаешь как избавится от делеев, ваабще курьез. В прерываниях то предется жить без делеев. Так можно из-за делеев до FreeRTOS и yield докатится. Вобщем, Евгений, вы не правы.
В данном, конкретном случае, если я правильно понимаю, предполагается набор фраз с клавиатуры, или это спутник , который кроме пи-пи-пи ничего не делает ?
Будет использоваться раза 3-4 в год, выехал на точку, забил позывной и координаты и всё, устройство пиликает круглосуточно пару-тройку дней и, до следующей поездки, да, частоты на синтезатор программируются в setup, далее он работает автономно
Могу помочь куда-нить какую-нить ляьду всунуть, если надо :) Вы какие лямбды предпочитаете в это время года? Какого порядка?
Могу помочь куда-нить какую-нить ляьду всунуть, если надо :) Вы какие лямбды предпочитаете в это время года? Какого порядка?
вы лучще про область видимости полученной строки поясните (хочу оформить как функцию)
Вы о каком коде? Я уже в них запутался. И ещё, всё-таки у меня приступы головной боли от Вашего квадратичного решения. Надо делать через таблицу, низзя так.
Что то морзе кодировка у вас какая то странная... Или это так, от балды?
Да тут всё от балды. Перформанс без ТЗ. Или даже хэппенинг...
Вы о каком коде? Я уже в них запутался. И ещё, всё-таки у меня приступы головной боли от Вашего квадратичного решения. Надо делать через таблицу, низзя так.
Можно и через таблицу, но она двухмерная жеж данные и длина получается, как у brokly
Код этот, строку для отправки освобождать не надо, инициировать один раз в setup, значит должна быть глобальная, пока не возникнет необходимость её изменить, отслеживать предполагаю по флагу актуальности
А вообще предполагается следующий алгоритм:
1. При включении считываем данные из EEPROM в структуру
2. Считываем флаг записи структуры в EEPROM
3. Если запись структуры в EEPROM была ранее произведена, то строку формируем из структуры, иначе из строки первичной инициализации структуры
Что то морзе кодировка у вас какая то странная... Или это так, от балды?
в смысле от балды, нормальная кодировка, проверьте (к 5 пину зуммер от системника)
Можно и через таблицу, но она двухмерная жеж данные и длина получается, как у brokly
А что мешает сунуть во флеш вашу таблицу ? Кстати в моем примере , в озу , эта таблица не занимает ни байта.
Вы зачем мне этот бред приписываете что значит "(c) brokly arduino.ru" ? Я возмущенн !!!! Такой пурги я не писал !
Вот правильное, обратите внимание на строку 12, вот поэтому у вас фигня получается.
Вы зачем мне этот бред приписываете что значит "(c) brokly arduino.ru" ? Я возмущенн !!!! Такой пурги я не писал !
Вот правильное, обратите внимание на строку 12, вот поэтому у вас фигня получается.
вот этот код пробовал из поста #148 потом уже импровизировал, я ставлю (c) чтобы первоисточник искать шибче
в смысле от балды, нормальная кодировка, проверьте (к 5 пину зуммер от системника)
ОК, понял.) Вы всегда пишете через жо? Ну ведь слева направо писать как то понятнее всёж таки? Нежели по арабски.) В чём преимущество? Хотя, дело хозяйское, конечно.
Не могу смотреть на эти мучения... :(
Не могу смотреть на эти мучения... :(
Сердце кровью обливается?)
Удивительно что ещё хоть кто-то этим морзе занимается. Я вообще считал что CW в наше время не востребовано совсем.) А тут бац, мужичёк заказывает клавиатурный датчик кода морзе... для работы! Я так понял, военнослужащий...)
Не могу смотреть на эти мучения... :(
Сердце кровью обливается?)
Удивительно что ещё хоть кто-то этим морзе занимается. Я вообще считал что CW в наше время не востребовано совсем.) А тут бац, мужичёк заказывает клавиатурный датчик кода морзе... для работы! Я так понял, военнослужащий...)
уже нет )))
CW хорош, мы единственные с Михаилом UA1QV в истории ВДВ кто сделал канал связи на 1000км при мощности передатчика 1 ватт!!!
Ну я то немного другим боком к этому Морзе. Есть такая хрень "приводной маяк" называется. В аэропортах, аэродромах и вертодромах устанавливается. Сигнальные огни, опять же для всяких авиаций. Там нужно. Правда фразы короткие там, но это ничего не менят. У световых указателей еще тайминги отличаются.
Не могу смотреть на эти мучения... :(
Прям как Евгений Петрович хотел )))
А начиналось с малого, с хранения даных, которые могут меняться в EEPROM и реплики Евгения, ЧТО для структуры есть простые команды EEPROM.get() и EEPROM.put() и даные очень хорошо укладывались в структуру, то-есть позывной, текстовка, локатор размещения...а код маяка уже был (чужой), кривописанный по Вашим определениям но работающий как швейцарские часы )))
в смысле от балды, нормальная кодировка, проверьте (к 5 пину зуммер от системника)
ОК, понял.) Вы всегда пишете через жо? Ну ведь слева направо писать как то понятнее всёж таки? Нежели по арабски.) В чём преимущество? Хотя, дело хозяйское, конечно.
Это не я, sadman41 предложил два решения, там где справа на лево были ошибки или я кода совсем не понял, взял за основу слева на право сам то я такое разве бы смог написать, да ни в жисть )))
Один фиг этот код блокирующий. Не употребимо в реальной жизни.
Дак, а неблокирующий в чём проблема написать?
отписка ,задолбало)
У кого проблемма? Я чуть выше дал неблокирующий :)
Один фиг этот код блокирующий. Не употребимо в реальной жизни.
а что там блокирующего?
Дык любой delay().
Дык любой delay().
интересно, а каким чудным образом формировать задержки между знаками, чтоб без делеев, как-то не придумывается в этом случае
del
интересно, а каким чудным образом формировать задержки между знаками, чтоб без делеев, как-то не придумывается в этом случае
Ну а каким чудным образом делается задержка без делеев? Аналогично.)
То можно, например, вот так (если не усираться на параноидальной экономии времени выполнения)
результат
Только я не очень понимаю какую экономию дает этот пример ? Если оперативки, то экономии нет ваапче.
А там речь не шла об экономии. Спросили как формировать "переменную строку", чтобы её можно было eeprom.put'ом в епром пихать, я показал как можно сделать.
интересно, а каким чудным образом формировать задержки между знаками, чтоб без делеев, как-то не придумывается в этом случае
Ну а каким чудным образом делается задержка без делеев? Аналогично.)
а пальцем показать слабо?
Што-то я никак не пойму - куда делись года блистательной практики на ассемблере? Или не было их таки?
Што-то я никак не пойму - куда делись года блистательной практики на ассемблере? Или не было их таки?
а в ассемблере (это тот который DEBUG) есть типы данных? ))) там ты бог
Перенёс скетчи в раздел проекты, здесь флуд можно и почистить, по не относящемуся к EEPROM
Может не в масть, но если в EEPROM организовать чтото на подобии файловой системы?
Гуглил на эту тему, много рассуждений на эту тему, даже вроде как библиотеки есть.
С одного форума
Например, разбиваете Вашу ЭППЗУ на блоки равного размера.
Самый первый обзываете суперблоком и пишете туда размер одного блока, их количество, сколько свободных блоков осталось и ещё может что.
Следом в одном или нескольких блоках размещаете битовую карту занятых блоков (бит сброшен - блок занят).
Каждый блок состоит из номера следующего блока и данных.
В следующем после битовой карты блоке размещается каталог, содержащий записи вида: номер первого блока/размер информации.
Для добавления нового Value ищете первую свободную запись в каталоге, если нет, добавляете к каталогу ещё один блок.
Далее находите столько номеров свободных блоков, сколько требуется для размещения Value, записывается информацию в эти блоки, располагая их цепочкой, вносите изменения в битовую карту и суперблок. Ключом будет являтся номер первого блока в цепочке.
Для перечисления просматриваете каталог.
Удаление Value также не представляет сложности.
И еще немного
В нормальных ассемблерах, разумеется есть. И простые типы, и структуры - всё там есть.
В нормальных ассемблерах, разумеется есть. И простые типы, и структуры - всё там есть.
ну так это в нормальных, а когда из доступных средств есть только встроенная команда debug, а попраграммировать очень хочется )))
Кстати, в руках там в любом месте программы возможность создания и использования глобальных (не регистровых) переменных и экономное и правильное выделение памяти полностью на программисте...
ЗЫ А ассемблеру учился у Питера Нортона
PPS примера, как сделать функцию не блокирующей, так и не последовало )))
Может не в масть, но если в EEPROM организовать чтото на подобии файловой системы?
главный (по моему мнению) недостаток, сегментирование памяти при её освобождении
главный (по моему мнению) недостаток, сегментирование памяти при её освобождении
так как тебе предлагають блоки одинакового размера, то это нистрашна.
главный (по моему мнению) недостаток, сегментирование памяти при её освобождении
так как тебе предлагають блоки одинакового размера, то это нистрашна.
большой блок - не экономное расходование памяти, малый, потребуется выделение нескольких блоков, панацеи нет?
как сделать функцию не блокирующей, так и не последовало )))
Ну так там не только о функции нужно думать, а и том что вы будете делать вне её. А в самой функции вы должны запоминать текущую ситуацию, с тем что бы продолжать с неё при последующем вызове.
Для примера.
я и говорю, будет такая борьба за мир, что камня на камне не останется...
открыл ветку в проектах, там скетч привели простого маячка, строк 80 всего, с учетом, что генерация частоты средствами таймера ардуины, запоминают знаки непосредственно в точках и тире (строками в духмерном массиве), да не экономно вроде, но простота подкупает
А в приведенном мной примере от brokly нет смысла борьбы c делеями, даже если буду прикручивать дисплей, можно его обработку зацепить за прерывание
Ну дак правильно. У каждого свои приоритеты. Кому то нужно впихнуть невпихуемое, а кому то нужно тяп-ляп и в продакшен.) Как правило, все эти маячки на каких нибудь Тини13, вот и думайте.)
просто логично, пока нет проблемы зачем с ней бороться
главный (по моему мнению) недостаток, сегментирование памяти при её освобождении
так как тебе предлагають блоки одинакового размера, то это нистрашна.
большой блок - не экономное расходование памяти, малый, потребуется выделение нескольких блоков, панацеи нет?
FAT на дисках живет же. А текст в #182 очень сильно на него смахивает.
]Вот бывают же на форуме здоровые мысли. А то делеефобы уже превратили это в фетишь - борются ради борьбы.
Я так понимаю, это камушек в мой огород. В данном, конкретном случае, если я правильно понимаю, предполагается набор фраз с клавиатуры, или это спутник , который кроме пи-пи-пи ничего не делает ?
Делей, в любом случае зло. А запускать что то в прерывании, из-за того что не понимаешь как избавится от делеев, ваабще курьез. В прерываниях то предется жить без делеев. Так можно из-за делеев до FreeRTOS и yield докатится. Вобщем, Евгений, вы не правы.
Многие этого не понимают и "в борьбе обретают право своё" :)
Может не в масть, но если в EEPROM организовать чтото на подобии файловой системы?
Тогда уж лучше SPIFFS, только вот встроеный епром, как правило, маловат для этого.
Многие этого не понимают и "в борьбе обретают право своё" :)
Тааак, понятно, пятница :)
Это еще так ... пятница в соседней теме :)
Делей, в любом случае зло.
А позвольте тут с вами не согласица.
А запускать что то в прерывании, из-за того что не понимаешь как избавится от делеев, ваабще курьез.
а с этим полностью согласица.
Вобщем, Евгений, вы не правы.
Вопщем, не всё так аднозначна.
В данном, конкретном случае, если я правильно понимаю, предполагается набор фраз с клавиатуры, или это спутник , который кроме пи-пи-пи ничего не делает ?
Будет использоваться раза 3-4 в год, выехал на точку, забил позывной и координаты и всё, устройство пиликает круглосуточно пару-тройку дней и, до следующей поездки, да, частоты на синтезатор программируются в setup, далее он работает автономно