Радиолюбительский Маяк на arduino nano

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

работает как часы, скорость не скачет и без гистерезиса )))

Дед чесслово не подглядывал, писал сам, а получилось как ты сказал )))
Тока не говори, что это подсознание сработало, после прочитанного...

Samid777
Offline
Зарегистрирован: 24.04.2019

Ну это само собой)) Ситуацию, в которой спорость бы перескавивала между соседними значениями еще нужно постараться создать, умудриться еще резистром попасть так. Разве что многооборотным выйдет. 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

По уму так не делаеца. :(

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

По уму так не делаеца. :(

что не так?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Заводим соощение 

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;

}

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

идея понятна, всё остальное тоже через таймер?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ua6em пишет:

идея понятна, всё остальное тоже через таймер?

Можно и НЕ через таймеры, НО через очередь. Крайне желательно. 

Green
Offline
Зарегистрирован: 01.10.2015

Не знаю как насчёт маяков, но мне как то с Великобританией приходилось работать на QRPP (менее 1 вт).) При том что дома обычная верёвка была.)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

в сетапе взводим его на 100 миллисекунд

hSensorRead = TimerList.Add(tmrSensorRead, 100);

 не взлетело!

Взвод таймера ломает всю логику, не могу понять, код привести?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Green пишет:

Не знаю как насчёт маяков, но мне как то с Великобританией приходилось работать на QRPP (менее 1 вт).) При том что дома обычная верёвка была.)

 от нас скачёк на британию плохой, за пятном, а на 10-ке на 1 ватт во время прохода и американцы были

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Я пока не рядом с компом. Пджди, вечером разберемся

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Или пришли мне код внапочту

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:
Я пока не рядом с компом. Пджди, вечером разберемся

ок

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

отослал

Green
Offline
Зарегистрирован: 01.10.2015

ua6em пишет:

 от нас скачёк на британию плохой, за пятном, а на 10-ке на 1 ватт во время прохода и американцы были

Вот как бы не на 7-ке было, но утверждать не буду.)
Относительно американцев, помнится только соорудили log yagi за первый час получислось 85 qso, в основном янки, некоторые оценивали 599+40db. Правда, 1КВ было на выходе.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

прикрепи, пож-та, сам файл ino вложением.

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Позно. Я уже набит мидихлорианами. Ночью паматрю. :-)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

У нас тут хаашо, +3, иконы битлов, ладан, гашыш. :-)  Мяса жарица, стаканы звенят, сдвигаясь, мелодично, радуют слух и желудок. :-)  да и коть счастлив. 

Мышей жреть. Сосецких. :-)

Green
Offline
Зарегистрирован: 01.10.2015

+3 хаашо... Много ли человеку надо. У нас +23, а ветер холодный, понимаешь ли...)

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

Сегодня снег выпал, в понед. -8 в прогнозе. А вы говорите...

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Аптамуш, не надо бездумно копировать, надо копировать вдумчива. В этой строке 

  hSensorRead = TimerList.Add(tmrSensorRead, 100); // таймер опроса потенциометра скорости опрашиваем раз в 0.1 секунды (на этой строке валится)

поменяй местами функцию и интервал местами, от так 

  hSensorRead = TimerList.Add(100, tmrSensorRead); 

и сё. 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

И не стыдно тебе по таким пустякам гонять старого, бальнова человека?  :) 

Лучше б рассолу прислалъ....

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

И не стыдно тебе по таким пустякам гонять старого, бальнова человека?  :) 

Лучше б рассолу прислалъ....

так я сам не новый )))
я жеж тебе верил, как себе, что ты в своих текстах не можешь неправильно написать, нет подумать о возрасте - после 50 человеку свойственно переставлять местами...даже из реплик на этом сайте можно сразу сказать кому и за сколько )))
Насчет рассола, ты жеж знаешь, он у нас позиционируется как как лучший рассол всех времён и народов, так сказать ЭТАЛОН РАССОЛА на планете земля, а с тех пор как в USA на рассол бум, он здесь идёт на вес золота )))

PS я то думал, что таймера переменными пересеклись, фуф, отлегло...

ЗЗЫ выяснился дефект фикции - на самой малой скорости пропускает знаки (((

нашёл!!!

Две константы связаны 100 в таймере и 100 миллисекунд интервал точки, интервал точки всегда должен быть меньше интервала таймера, тогда пропускать не будет

выяснилось - будет, но значительно меньше...видимо из-за асинхронности таймеров...

а если зацепиться за loop этих артефактов нет совсем, на любых скоростях

Все твердят, точки бифуркации, точки бифуркации...на них видимо скетч и напарывается во временных отрезках...
как там у тебя с этим с библиотекой таймеров, как обходишь, как выставляются приоритеты???

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:

Сегодня снег выпал, в понед. -8 в прогнозе. А вы говорите...

 а у нас вчера в тени +30 было

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

всё таки точки буфуркации в таймерах видимо имеют место быть...
Вот так значительно лучше
 

  hSensorRead = TimerList.Add(113,tmrSensorRead); // таймер опроса потенциометра скорости опрашиваем раз в 0.113 секунды (на этой строке уже не валится)
  uint8_t newdottime = 101 - map(analogRead(mySpeedPin), 0,1023,0,15)*5; // тут все чтения и вычисления

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

DetSimen пишет:

Ой.  Забыл про саафтара.  Подтверждаю, понужал меня не спать изо всех сил. 

Судя по аватару, это и есть автор.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Выставь пока таймер опроса потанцометра на 103 мс. все остальное завтра. 

А вапще, третий таймер можно выкинуть, а SendMessage для аналогово чтения влепить в конец функции sendPause. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Выкинуть то можно, но желательно чтобы все таймера обрабатывались правильно, как реализовано в библиотеке если два или более тамера сработали?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

С этим я разбираюсь. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

С этим я разбираюсь. 

вот это я тебя озадачил )))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Запусти у себя 


/*
    Name:       TimersTest.ino
    Created:	30.04.2019 9:01:42
    Author:     DetSimen
*/
#include <TimerList.h>
#include <Messages.h>
#include <DEF_Message.h>
#include <Generics.h>

extern TTimerList TimerList;
TMessageList MessageList(12);

THandle hTimer1, hTimer2, hTimer3, hTimer4;



void tmr1(void) {
	SendMessage(msg_TimerEnd, 1);
}

void tmr2(void) {
	SendMessage(msg_TimerEnd, 2);
}

void tmr3(void) {
	SendMessage(msg_TimerEnd, 3);
}

void tmr4(void) {
	SendMessage(msg_TimerEnd, 4);
}


void setup()
{
	delay(1000);
	Serial.begin(115200);
	Serial << "Program started\n";

	hTimer1 = TimerList.Add(1000, tmr1);
	hTimer2 = TimerList.Add(2000, tmr2);
	hTimer3 = TimerList.Add(1000, tmr3);
	hTimer4 = TimerList.Add(2000, tmr4);


}

void loop()
{
	static uint8_t sec = 0;

	if (not MessageList.Available()) return;

	TMessage msg = MessageList.GetMessage();

	switch (msg.Message)
	{
	case msg_TimerEnd: {
		if (msg.LoParam == 1) {
			sec++;
			Serial << "Timer 1 ends  " << sec << eoln;
			break;
		}
		if (msg.LoParam == 2) {
			Serial << "Timer 2 ends  " << sec << eoln;;
			break;
		}
		if (msg.LoParam == 3) {
			Serial << "Timer 3 ends  " << sec << eoln;;
			break;
		}
		if (msg.LoParam == 4) {
			Serial << "Timer 4 ends  " << sec << eoln;
			sec = 0;
			Serial << eoln << eoln;
		}
		break;
	}
	default:
		Serial.print("Unknown message 0x"); Serial.println(msg.Message, HEX);
		break;
	}


}
DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

потом интервалы поменяй на вот так 

	hTimer1 = TimerList.Add(1000, tmr1);
	hTimer2 = TimerList.Add(2000, tmr2);
	hTimer3 = TimerList.Add(4000, tmr3);
	hTimer4 = TimerList.Add(8000, tmr4);

и последи.  Тама все интервалы пересекаюца, не будет ли пропусков где. 

У мня нет. 

 

Котъ озадачен и негодуэ.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Се, я пойду с трудящимися солидарничать. Ищите мня после 12-го. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

Се, я пойду с трудящимися солидарничать. Ищите мня после 12-го. 

ни чё се, а я до компа только добрался )))

test1
 

Program started
Timer 1 ends  1
Timer 3 ends  1
Timer 1 ends  2
Timer 2 ends  2
Timer 3 ends  2
Timer 4 ends  2


Timer 1 ends  1
Timer 3 ends  1
Timer 1 ends  2
Timer 2 ends  2
Timer 3 ends  2
Timer 4 ends  2


Timer 1 ends  1
Timer 3 ends  1
Timer 1 ends  2
Timer 2 ends  2
Timer 3 ends  2
Timer 4 ends  2


Timer 1 ends  1
Timer 3 ends  1
Timer 1 ends  2
Timer 2 ends  2
Timer 3 ends  2
Timer 4 ends  2


Timer 1 ends  1
Timer 3 ends  1
Timer 1 ends  2
Timer 2 ends  2
Timer 3 ends  2
Timer 4 ends  2


Timer 1 ends  1
Timer 3 ends  1
Timer 1 ends  2
Timer 2 ends  2
Timer 3 ends  2
Timer 4 ends  2


Timer 1 ends  1
Timer 3 ends  1
Timer 1 ends  2
Timer 2 ends  2
Timer 3 ends  2
Timer 4 ends  2


Timer 1 ends  1
Timer 3 ends  1
Timer 1 ends  2
Timer 2 ends  2
Timer 3 ends  2
Timer 4 ends  2

test-2
 

Program started
Timer 1 ends  1
Timer 1 ends  2
Timer 2 ends  2
Timer 1 ends  3
Timer 1 ends  4
Timer 2 ends  4
Timer 3 ends  4
Timer 1 ends  5
Timer 1 ends  6
Timer 2 ends  6
Timer 1 ends  7
Timer 1 ends  8
Timer 2 ends  8
Timer 3 ends  8
Timer 4 ends  8


Timer 1 ends  1
Timer 1 ends  2
Timer 2 ends  2
Timer 1 ends  3
Timer 1 ends  4
Timer 2 ends  4
Timer 3 ends  4
Timer 1 ends  5
Timer 1 ends  6
Timer 2 ends  6
Timer 1 ends  7
Timer 1 ends  8
Timer 2 ends  8
Timer 3 ends  8
Timer 4 ends  8


Timer 1 ends  1
Timer 1 ends  2
Timer 2 ends  2
Timer 1 ends  3
Timer 1 ends  4
Timer 2 ends  4
Timer 3 ends  4
Timer 1 ends  5
Timer 1 ends  6
Timer 2 ends  6
Timer 1 ends  7
Timer 1 ends  8
Timer 2 ends  8
Timer 3 ends  8
Timer 4 ends  8


Timer 1 ends  1
Timer 1 ends  2
Timer 2 ends  2
Timer 1 ends  3
Timer 1 ends  4
Timer 2 ends  4
Timer 3 ends  4
Timer 1 ends  5
Timer 1 ends  6
Timer 2 ends  6
Timer 1 ends  7
Timer 1 ends  8
Timer 2 ends  8
Timer 3 ends  8
Timer 4 ends  8


Timer 1 ends  1
Timer 1 ends  2
Timer 2 ends  2
Timer 1 ends  3
Timer 1 ends  4
Timer 2 ends  4
Timer 3 ends  4
Timer 1 ends  5
Timer 1 ends  6
Timer 2 ends  6
Timer 1 ends  7
Timer 1 ends  8
Timer 2 ends  8
Timer 3 ends  8
Timer 4 ends  8


Timer 1 ends  1
Timer 1 ends  2
Timer 2 ends  2
Timer 1 ends  3
Timer 1 ends  4
Timer 2 ends  4
Timer 3 ends  4
Timer 1 ends  5
Timer 1 ends  6
Timer 2 ends  6
Timer 1 ends  7
Timer 1 ends  8
Timer 2 ends  8
Timer 3 ends  8
Timer 4 ends  8


Timer 1 ends  1
Timer 1 ends  2
Timer 2 ends  2
Timer 1 ends  3
Timer 1 ends  4
Timer 2 ends  4
Timer 3 ends  4
Timer 1 ends  5
Timer 1 ends  6
Timer 2 ends  6
Timer 1 ends  7

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ну дак у тебя тоже в бифуркациях не пропускает. Тогда я не понимаю. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

ну дак у тебя тоже в бифуркациях не пропускает. Тогда я не понимаю. 

если функция опроса датчика скорости стоит в loop тоже не пропускает )))
Особенно сказывается когда выставляешь минимальную скорость, может это подскажет что-то

как вариант - потеря истинного указателя на символ для передачи, он забегает вперёд???

и отслеживать пропуски в мониторе порта совсем не комильфо, телеграф то я принимаю в фоновом режиме, занимаясь попутно любыми другими делами, единственный недостаток - для домочадцев, это пиликанье )))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Ну тогда сделай как я в #127 говорил про третий таймер

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

Ну тогда сделай как я в #127 говорил про третий таймер

съедает, иногда паузы между знаками иногда буквы

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Ну не знаю тогда. Седня чота думается плохо

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

Ну не знаю тогда. Седня чота думается плохо

так оно и понятно, шашлычок в маринаде подходит небось

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

У нас -3, мы с котяном дома. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

У нас -3, мы с котяном дома. 

у нас +21, я пока дома, лежу на гвоздях

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Короче, это надо у аксакалов спрашивать.  Если оне снизойдут, канеш.  Вапще не удивлюсь, если в моих таймерах и очередях всякая хня понаписана. 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Вы про реализацию изменеия скорости передачи на потенциометре? 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

qwone пишет:

Вы про реализацию изменеия скорости передачи на потенциометре? 

Нет

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

qwone пишет:

Вы про реализацию изменеия скорости передачи на потенциометре? 

Нет

 у меня большое подозрение, что два раза уменьшается указатель на элемент строки при прерывании таймером, чтение значения с потенциометра и установка значения скорости при вынесении процедуры в loop отрабатывает безукоризненно!!!
так как иногда пропускает и пробел тоже
Если буква строки взята в отработку, то выдаёт её код азбукой морзе правильно, не усекает

с другой стороны, фунция имеет рандомный глюк, вот прямо имитирует работу оператора, захочешь такую написать - замаешься )))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Вынеси в loop. Я сиравно пью до 12-го. 

и попробуй не map() а 

uint8_t newdottime = 100 - 5*(analogRead(mySpeedPin)>>6); // тут все твои чтения и вычисления

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

Вынеси в loop. Я сиравно пью до 12-го. 

и попробуй не map() а 

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;
  }

}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

нууу, у мня идей больше неть.  бери, значить, другой код маяка. 

вот эту строчку проверь внимательно, нет ли ашыбок

006 #pragma GCC otimize ("-Os") //где х - 0, 1, 2, 3, fast, g, s - уровень оптимизации

ты и default потерял в 219 строчке.  

конец перепишы вот так

	case msg_ReadSensor: {
		uint8_t newdottime = 100 - 5*(analogRead(mySpeedPin)>>6); // тут все твои чтения и вычисления
		if (newdottime != DOT_TIME) {   // меняем ТОЛЬКО если значения РЕАЛЬНО ИЗМЕНИЛИСЬ
			DOT_TIME = newdottime;
			DASH_TIME = 3 * DOT_TIME;
			Serial.print("Скорость = ");
			Serial.println(newdottime);
		}
		break;
	}
	default:
	 Serial.print("Unknown message code: 0x"); Serial.println(msg.Message, HEX);
     break;
	}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

нууу, у мня идей больше неть.  бери, значить, другой код маяка. 

Не!!! "Русские не сдаются"!!!
Я тут явную связь выявил, стоит открыть-закрыть монитор порта и скетч начинает работать правильно...
Надо смотреть обработку сериала, он правда что делает, при открытии монитора порта - резетит но с открытым последовательным... потом закрываю и всё работает как надо...

уменьшил скорость порта до 9600, пытаю, пока работает как надо, теперь надо строку вводимую в мониторе порта сохранить в еепром и забирать оттуда, если было сохранение, попробую сам прикрутить