Ну это само собой)) Ситуацию, в которой спорость бы перескавивала между соседними значениями еще нужно постараться создать, умудриться еще резистром попасть так. Разве что многооборотным выйдет.
от нас скачёк на британию плохой, за пятном, а на 10-ке на 1 ватт во время прохода и американцы были
Вот как бы не на 7-ке было, но утверждать не буду.)
Относительно американцев, помнится только соорудили log yagi за первый час получислось 85 qso, в основном янки, некоторые оценивали 599+40db. Правда, 1КВ было на выходе.
И не стыдно тебе по таким пустякам гонять старого, бальнова человека? :)
Лучше б рассолу прислалъ....
так я сам не новый )))
я жеж тебе верил, как себе, что ты в своих текстах не можешь неправильно написать, нет подумать о возрасте - после 50 человеку свойственно переставлять местами...даже из реплик на этом сайте можно сразу сказать кому и за сколько )))
Насчет рассола, ты жеж знаешь, он у нас позиционируется как как лучший рассол всех времён и народов, так сказать ЭТАЛОН РАССОЛА на планете земля, а с тех пор как в USA на рассол бум, он здесь идёт на вес золота )))
PS я то думал, что таймера переменными пересеклись, фуф, отлегло...
ЗЗЫ выяснился дефект фикции - на самой малой скорости пропускает знаки (((
нашёл!!!
Две константы связаны 100 в таймере и 100 миллисекунд интервал точки, интервал точки всегда должен быть меньше интервала таймера, тогда пропускать не будет
выяснилось - будет, но значительно меньше...видимо из-за асинхронности таймеров...
а если зацепиться за loop этих артефактов нет совсем, на любых скоростях
Все твердят, точки бифуркации, точки бифуркации...на них видимо скетч и напарывается во временных отрезках...
как там у тебя с этим с библиотекой таймеров, как обходишь, как выставляются приоритеты???
всё таки точки буфуркации в таймерах видимо имеют место быть...
Вот так значительно лучше
hSensorRead = TimerList.Add(113,tmrSensorRead); // таймер опроса потенциометра скорости опрашиваем раз в 0.113 секунды (на этой строке уже не валится)
uint8_t newdottime = 101 - map(analogRead(mySpeedPin), 0,1023,0,15)*5; // тут все чтения и вычисления
ну дак у тебя тоже в бифуркациях не пропускает. Тогда я не понимаю.
если функция опроса датчика скорости стоит в loop тоже не пропускает )))
Особенно сказывается когда выставляешь минимальную скорость, может это подскажет что-то
как вариант - потеря истинного указателя на символ для передачи, он забегает вперёд???
и отслеживать пропуски в мониторе порта совсем не комильфо, телеграф то я принимаю в фоновом режиме, занимаясь попутно любыми другими делами, единственный недостаток - для домочадцев, это пиликанье )))
Вы про реализацию изменеия скорости передачи на потенциометре?
Нет
у меня большое подозрение, что два раза уменьшается указатель на элемент строки при прерывании таймером, чтение значения с потенциометра и установка значения скорости при вынесении процедуры в loop отрабатывает безукоризненно!!!
так как иногда пропускает и пробел тоже
Если буква строки взята в отработку, то выдаёт её код азбукой морзе правильно, не усекает
с другой стороны, фунция имеет рандомный глюк, вот прямо имитирует работу оператора, захочешь такую написать - замаешься )))
uint8_t newdottime = 100 - 5*(analogRead(mySpeedPin)>>6); // тут все твои чтения и вычисления
поигрался с опциями компилятора, вот так при получасовом тесте на минимальной скорости глюков не заметил
ЗЫ рано обрадовался, начал лыгать на больших скоростях
PPS изменил выкинув map 5 минут полёт нормальный пытаю на других скоростях, неужели в ней была вся проблема? (Нет, поигравшись со скоростями нашёл такое положение, что чётко во втором CQ всегда пропускает С и эта скорость равна 30 открыл-закрыл монитор порта и глюк исчез, чудеса)))
/*
Name: Morze.ino
Created: 21.04.2019 4:16:26
Author: DetSimen
*/
#pragma GCC otimize ("-Os") //где х - 0, 1, 2, 3, fast, g, s - уровень оптимизации
//#include <EEPROM.h>
#include "Arduino.h"
#include "MorzeTable.h"
#include "TimerList.h"
#include "Messages.h"
#define toneFreq (800) //частота звука (выбирайте между 600 - 1000Гц)
static uint8_t TXPin = 13; // пин передаччика
int tonePin = A4; // выход звука на радиостанцию
int mySpeedPin = A0; // потенциометр скорости
int mySpeed; // переменная для потенуиометра
extern TTimerList TimerList; // списой таймеров (до 10) паумолчанью
TMessageList MessageList(12); // очереть на 12 сапщений
static const int msg_ReadSerial = 0x100; // сообщение "Читать Сериал"
static const int msg_SendChar = 0x101; // сообщение "Передать символ (букву)"
static const int msg_SendNextBit = 0x102; // сообщение "Передать следующий бит в букве"
static const int msg_ReadSensors = 0x105; // считать потенциометр скорости
static /*const*/ uint32_t DOT_TIME = 35; // основное время, длительность точки 75 мс, остальные производные
static /*const*/ uint32_t DASH_TIME = 3 * DOT_TIME; // длительность тире
static const uint16_t REPEAT_TIME = 5000; // Задержка в мс между повторениями текста, по умолчанию 5 сек.
static const uint16_t SERIAL_TIMEOUT = 2000; // если в течение 2000 мс не было данных с сериала, значит приняли всю строку
static const uint8_t MAX_STRING_LENGTH = 128; // макс длина передаваемой строки
enum class enumTXState : bool { Pause = false, Bit = true };
enumTXState TXState = enumTXState::Pause; // что передаем в данный момент: или бит (точка/тире) или паузу
THandle hTXTimer = INVALID_HANDLE; // таймер передаччика
THandle hSerialTimer = INVALID_HANDLE; // таймер таймаута приема из Serial
THandle hRepeatTimer = INVALID_HANDLE; // таймер повтора фразы
THandle hSensorRead = INVALID_HANDLE; // таймер для опроса потенциометра скорости передачи
uint8_t TXCurrentMask = 0; // маска текущего символа
uint8_t TXCurrentCode = 0; // битовый код Морзе текущего символа
bool TXBusy = false; // идет передача бита или паузы
bool TXStopped = false; // передаччик остановлен нахрен. ничего не передаеца
String StringToTransmit; // строка, которую будем слать
uint16_t TransmitCharIndex = 0; // индекс текущего символа, в этой строке
void TXOnOff(const bool On) { // передаччик вкл/выкл
digitalWrite(TXPin, On);
if(On) {tone(tonePin, toneFreq);}else{ noTone(tonePin);}
}
void tmrTXTimer(void) { // здесь кончился таймер передачи бита/паузы
SendMessage(msg_TimerEnd, hTXTimer);
TimerList.Stop(hTXTimer); // остановим этот таймер
}
void tmrSerialTimer(void) { // строку приняли до конца
SendMessage(msg_TimerEnd, hSerialTimer);
TimerList.Stop(hSerialTimer); // таймер больше не нужен
}
void tmrRepeat(void) { // таймер повтора кончился, начинаем передавать сначала
TransmitCharIndex = 0;
TXStopped = false;
TimerList.Stop(hRepeatTimer);
}
void sendBit(const bool aBit) { // передать один бит (точку == false или тире == true)
TXState = enumTXState::Bit; // признак: передаем бит
TXOnOff(true); // ключ на старт!
TXBusy = true; // передаччик теперя занят
TimerList.setNewInterval(hTXTimer, aBit ? DASH_TIME : DOT_TIME); // длительность таймера разная для точки и тире
TimerList.Reset(hTXTimer); // перезапустим его сначала интервала
}
void sendPause(const uint8_t kf = 1) { // передаем паузу длиной в 1 точку по умолчанию
TXState = enumTXState::Pause;
TXBusy = true; // передаччик занят
TimerList.setNewInterval(hTXTimer, kf*DOT_TIME); // либо длительность паузы кратна точке в kf раз
TimerList.Reset(hTXTimer); // перезапустим таймер сначала
}
void tmrSensorRead(void){
SendMessage(msg_ReadSensor); // пхаем в очередь сообщение на чтение потанцометра
}
; void setup()
{
Serial.begin(115200);
delay(1000); // чтоб всё устаканилось к старту
pinMode(TXPin, OUTPUT);
TXOnOff(false); // ключ выключен
// все таймеры создаюца по умолчанию остановленными
//
hTXTimer = TimerList.AddStopped(DOT_TIME, tmrTXTimer); // таймер передаччика бит
hSerialTimer = TimerList.AddStopped(SERIAL_TIMEOUT, tmrSerialTimer); // таймер таймаута чтения из Serial
hRepeatTimer = TimerList.AddStopped(REPEAT_TIME, tmrRepeat); // таймер повтора передачи строки
hSensorRead = TimerList.Add(100,tmrSensorRead); // таймер опроса потенциометра скорости опрашиваем раз в 0.1 секунды (на этой строке валится)
StringToTransmit.reserve(MAX_STRING_LENGTH); // хапнем сразу место под строку, чтоб не перераспределять потом
StringToTransmit = "CQ DX UA6EM CQ DX UA6EM QSA? 73! 73! 73! K"; // строка для передачи по умолчанию
TransmitCharIndex = 0;
}
void loop()
{
if (Serial.available()) { // если в сериал чота припрыгало
SendMessage(msg_ReadSerial); // пошлем команду прочесть сериал
TXStopped = true; // передачу остановим
TransmitCharIndex = 0; // и все индексы и маски обнулим,
TXCurrentCode = 0; // так как после приема будем передавать уже новую строку
TXCurrentMask = 0;
}
// тут читаем потенциометр скорости
// mySpeed = map(analogRead(mySpeedPin), 0,1023,0,15);
// DOT_TIME = 100-mySpeed*5;
// DASH_TIME = 3 * DOT_TIME;
if ((not TXBusy) and (not TXStopped)) { // если передаччик не остановлен и не занят передачей бита
if (TXCurrentMask > 0) // если маска еще до конца не сдвинулась
{
SendMessage(msg_SendNextBit); // передать следующий бит знака
}
else
{
SendMessage(msg_SendChar); // знак кончился, начать передавать след. символ
}
}
if ( not MessageList.Available()) return; // если сапщений в очереди нет, выходим
TMessage msg = MessageList.GetMessage();
switch (msg.Message)
{
case msg_TimerEnd: {
if (msg.LoParam == hSerialTimer) { // кончился таймер приёма по сериал
TXStopped = false; // можно стартовать передаччик, есличо
break;
}
if (msg.LoParam == hTXTimer) { // кончился таймер передачи бита/паузы
TXBusy = false; // можно передавать следующий
if (TXState == enumTXState::Bit) { // если передавали бит, передадим 1 паузу
TXOnOff(false); // выключим ключ
TXCurrentMask >>= 1;
if (TXCurrentMask>0) sendPause(); else sendPause(3); // а если знак кончился, то 3 паузы
}
break;
}
break;
}
case msg_SendNextBit: { // передаем след. бит (точка/тире)
sendBit(TXCurrentCode & TXCurrentMask);
break;
}
case msg_ReadSerial: { // чтение из сериала
if (!TimerList.isActive(hSerialTimer)) { // если таймер таймаута остановлен
StringToTransmit = ""; // значить читаем новую строку
TransmitCharIndex = 0;
}
StringToTransmit += char(Serial.read()); // берем символ из сериал и вклеиваем в строку
TimerList.Reset(hSerialTimer); // перезапускаем таймер таймаута (помнишь? 2 секунды после ПОСЛЕДНЕГО символа)
break;
}
case msg_SendChar: { // послать знак
if (TransmitCharIndex < StringToTransmit.length()) { // если строка еще не кончиилась
char c = StringToTransmit[TransmitCharIndex++]; // взять символ
if (c != ' ') { // если не пробел, то
TXCurrentCode = getMorzeCode(c); // по нему взять код Морзя см. MorzeTable.cpp
TXCurrentMask = getSymbolMask(getMorzeCode(c)); // и маску см. MorzeTable.cpp
}
else sendPause(7); // пробел между словами - передаем паузу в 7 точек
}
else { // если строка кончилась
TXStopped = true; // остановим передачу
TransmitCharIndex = 0; // вернем указатель на 0 символ строки
TimerList.Reset(hRepeatTimer); // и запустим таймер для REPEAT
}
break;
}
// тут читаем потенциометр скорости
case msg_ReadSensor:{
uint8_t newdottime = 100 - map(analogRead(mySpeedPin), 0,1023,0,15)*5; // тут все твои чтения и вычисления
Serial.print("Скорость = ");
Serial.println( newdottime);
if (newdottime != DOT_TIME){ // меняем ТОЛЬКО если значения РЕАЛЬНО ИЗМЕНИЛИСЬ
DOT_TIME = newdottime;
DASH_TIME = 3*DOT_TIME;
}
break;
}
Serial.print("Unknown message code: 0x"); Serial.println(msg.Message, HEX);
break;
}
}
нууу, у мня идей больше неть. бери, значить, другой код маяка.
Не!!! "Русские не сдаются"!!!
Я тут явную связь выявил, стоит открыть-закрыть монитор порта и скетч начинает работать правильно...
Надо смотреть обработку сериала, он правда что делает, при открытии монитора порта - резетит но с открытым последовательным... потом закрываю и всё работает как надо...
уменьшил скорость порта до 9600, пытаю, пока работает как надо, теперь надо строку вводимую в мониторе порта сохранить в еепром и забирать оттуда, если было сохранение, попробую сам прикрутить
работает как часы, скорость не скачет и без гистерезиса )))
Дед чесслово не подглядывал, писал сам, а получилось как ты сказал )))
Тока не говори, что это подсознание сработало, после прочитанного...
Ну это само собой)) Ситуацию, в которой спорость бы перескавивала между соседними значениями еще нужно постараться создать, умудриться еще резистром попасть так. Разве что многооборотным выйдет.
По уму так не делаеца. :(
По уму так не делаеца. :(
что не так?
Заводим соощение
const int msg_ReadSensors = 0x105;
Заводим еще один таймер
THandle hSensorRead = INVALID_HANDLE;
в сетапе взводим его на 100 миллисекунд
hSensorRead = TimerList.Add(tmrSensorRead, 100);
Пишем функцию отклика на него
void tmrSensorRead(void){
SendMessage(msg_ReadSensor); // пхаем в очередь сообщение на чтение потанцометра
}
в лупе добавляем к switch
case msg_ReadSensor:{
uint8_t newdottime = ..... // тут все твои чтения и вычисления
if (newdottime != DOT_TIME){ // меняем ТОЛЬКО если значения РЕАЛЬНО ИЗМЕНИЛИСЬ
DOT_TIME = newdottime;
DASH_TIME = 3*DOT_TIME;
}
break;
}
идея понятна, всё остальное тоже через таймер?
идея понятна, всё остальное тоже через таймер?
Можно и НЕ через таймеры, НО через очередь. Крайне желательно.
Не знаю как насчёт маяков, но мне как то с Великобританией приходилось работать на QRPP (менее 1 вт).) При том что дома обычная верёвка была.)
в сетапе взводим его на 100 миллисекунд
hSensorRead = TimerList.Add(tmrSensorRead, 100);
не взлетело!
Взвод таймера ломает всю логику, не могу понять, код привести?
Не знаю как насчёт маяков, но мне как то с Великобританией приходилось работать на QRPP (менее 1 вт).) При том что дома обычная верёвка была.)
от нас скачёк на британию плохой, за пятном, а на 10-ке на 1 ватт во время прохода и американцы были
Я пока не рядом с компом. Пджди, вечером разберемся
Или пришли мне код внапочту
ок
отослал
от нас скачёк на британию плохой, за пятном, а на 10-ке на 1 ватт во время прохода и американцы были
Вот как бы не на 7-ке было, но утверждать не буду.)
Относительно американцев, помнится только соорудили log yagi за первый час получислось 85 qso, в основном янки, некоторые оценивали 599+40db. Правда, 1КВ было на выходе.
прикрепи, пож-та, сам файл ino вложением.
Позно. Я уже набит мидихлорианами. Ночью паматрю. :-)
У нас тут хаашо, +3, иконы битлов, ладан, гашыш. :-) Мяса жарица, стаканы звенят, сдвигаясь, мелодично, радуют слух и желудок. :-) да и коть счастлив.
Мышей жреть. Сосецких. :-)
+3 хаашо... Много ли человеку надо. У нас +23, а ветер холодный, понимаешь ли...)
Сегодня снег выпал, в понед. -8 в прогнозе. А вы говорите...
Аптамуш, не надо бездумно копировать, надо копировать вдумчива. В этой строке
hSensorRead = TimerList.Add(tmrSensorRead, 100); // таймер опроса потенциометра скорости опрашиваем раз в 0.1 секунды (на этой строке валится)
поменяй местами функцию и интервал местами, от так
hSensorRead = TimerList.Add(100, tmrSensorRead);
и сё.
И не стыдно тебе по таким пустякам гонять старого, бальнова человека? :)
Лучше б рассолу прислалъ....
И не стыдно тебе по таким пустякам гонять старого, бальнова человека? :)
Лучше б рассолу прислалъ....
так я сам не новый )))
я жеж тебе верил, как себе, что ты в своих текстах не можешь неправильно написать, нет подумать о возрасте - после 50 человеку свойственно переставлять местами...даже из реплик на этом сайте можно сразу сказать кому и за сколько )))
Насчет рассола, ты жеж знаешь, он у нас позиционируется как как лучший рассол всех времён и народов, так сказать ЭТАЛОН РАССОЛА на планете земля, а с тех пор как в USA на рассол бум, он здесь идёт на вес золота )))
PS я то думал, что таймера переменными пересеклись, фуф, отлегло...
ЗЗЫ выяснился дефект фикции - на самой малой скорости пропускает знаки (((
нашёл!!!
Две константы связаны 100 в таймере и 100 миллисекунд интервал точки, интервал точки всегда должен быть меньше интервала таймера, тогда пропускать не будет
выяснилось - будет, но значительно меньше...видимо из-за асинхронности таймеров...
а если зацепиться за loop этих артефактов нет совсем, на любых скоростях
Все твердят, точки бифуркации, точки бифуркации...на них видимо скетч и напарывается во временных отрезках...
как там у тебя с этим с библиотекой таймеров, как обходишь, как выставляются приоритеты???
Сегодня снег выпал, в понед. -8 в прогнозе. А вы говорите...
а у нас вчера в тени +30 было
всё таки точки буфуркации в таймерах видимо имеют место быть...
Вот так значительно лучше
Ой. Забыл про саафтара. Подтверждаю, понужал меня не спать изо всех сил.
Судя по аватару, это и есть автор.
Выставь пока таймер опроса потанцометра на 103 мс. все остальное завтра.
А вапще, третий таймер можно выкинуть, а SendMessage для аналогово чтения влепить в конец функции sendPause.
Выкинуть то можно, но желательно чтобы все таймера обрабатывались правильно, как реализовано в библиотеке если два или более тамера сработали?
С этим я разбираюсь.
С этим я разбираюсь.
вот это я тебя озадачил )))
Запусти у себя
потом интервалы поменяй на вот так
и последи. Тама все интервалы пересекаюца, не будет ли пропусков где.
У мня нет.
Котъ озадачен и негодуэ.
Се, я пойду с трудящимися солидарничать. Ищите мня после 12-го.
Се, я пойду с трудящимися солидарничать. Ищите мня после 12-го.
ни чё се, а я до компа только добрался )))
test1
test-2
ну дак у тебя тоже в бифуркациях не пропускает. Тогда я не понимаю.
ну дак у тебя тоже в бифуркациях не пропускает. Тогда я не понимаю.
если функция опроса датчика скорости стоит в loop тоже не пропускает )))
Особенно сказывается когда выставляешь минимальную скорость, может это подскажет что-то
как вариант - потеря истинного указателя на символ для передачи, он забегает вперёд???
и отслеживать пропуски в мониторе порта совсем не комильфо, телеграф то я принимаю в фоновом режиме, занимаясь попутно любыми другими делами, единственный недостаток - для домочадцев, это пиликанье )))
Ну тогда сделай как я в #127 говорил про третий таймер
Ну тогда сделай как я в #127 говорил про третий таймер
съедает, иногда паузы между знаками иногда буквы
Ну не знаю тогда. Седня чота думается плохо
Ну не знаю тогда. Седня чота думается плохо
так оно и понятно, шашлычок в маринаде подходит небось
У нас -3, мы с котяном дома.
У нас -3, мы с котяном дома.
у нас +21, я пока дома, лежу на гвоздях
Короче, это надо у аксакалов спрашивать. Если оне снизойдут, канеш. Вапще не удивлюсь, если в моих таймерах и очередях всякая хня понаписана.
Вы про реализацию изменеия скорости передачи на потенциометре?
Вы про реализацию изменеия скорости передачи на потенциометре?
Нет
Вы про реализацию изменеия скорости передачи на потенциометре?
Нет
у меня большое подозрение, что два раза уменьшается указатель на элемент строки при прерывании таймером, чтение значения с потенциометра и установка значения скорости при вынесении процедуры в loop отрабатывает безукоризненно!!!
так как иногда пропускает и пробел тоже
Если буква строки взята в отработку, то выдаёт её код азбукой морзе правильно, не усекает
с другой стороны, фунция имеет рандомный глюк, вот прямо имитирует работу оператора, захочешь такую написать - замаешься )))
Вынеси в loop. Я сиравно пью до 12-го.
и попробуй не map() а
Вынеси в loop. Я сиравно пью до 12-го.
и попробуй не map() а
поигрался с опциями компилятора, вот так при получасовом тесте на минимальной скорости глюков не заметил
ЗЫ рано обрадовался, начал лыгать на больших скоростях
PPS изменил выкинув map 5 минут полёт нормальный пытаю на других скоростях, неужели в ней была вся проблема? (Нет, поигравшись со скоростями нашёл такое положение, что чётко во втором CQ всегда пропускает С и эта скорость равна 30 открыл-закрыл монитор порта и глюк исчез, чудеса)))
нууу, у мня идей больше неть. бери, значить, другой код маяка.
вот эту строчку проверь внимательно, нет ли ашыбок
006
#pragma GCC otimize ("-Os") //где х - 0, 1, 2, 3, fast, g, s - уровень оптимизации
ты и default потерял в 219 строчке.
конец перепишы вот так
нууу, у мня идей больше неть. бери, значить, другой код маяка.
Не!!! "Русские не сдаются"!!!
Я тут явную связь выявил, стоит открыть-закрыть монитор порта и скетч начинает работать правильно...
Надо смотреть обработку сериала, он правда что делает, при открытии монитора порта - резетит но с открытым последовательным... потом закрываю и всё работает как надо...
уменьшил скорость порта до 9600, пытаю, пока работает как надо, теперь надо строку вводимую в мониторе порта сохранить в еепром и забирать оттуда, если было сохранение, попробую сам прикрутить