Ну это само собой)) Ситуацию, в которой спорость бы перескавивала между соседними значениями еще нужно постараться создать, умудриться еще резистром попасть так. Разве что многооборотным выйдет.
от нас скачёк на британию плохой, за пятном, а на 10-ке на 1 ватт во время прохода и американцы были
Вот как бы не на 7-ке было, но утверждать не буду.)
Относительно американцев, помнится только соорудили log yagi за первый час получислось 85 qso, в основном янки, некоторые оценивали 599+40db. Правда, 1КВ было на выходе.
И не стыдно тебе по таким пустякам гонять старого, бальнова человека? :)
Лучше б рассолу прислалъ....
так я сам не новый )))
я жеж тебе верил, как себе, что ты в своих текстах не можешь неправильно написать, нет подумать о возрасте - после 50 человеку свойственно переставлять местами...даже из реплик на этом сайте можно сразу сказать кому и за сколько )))
Насчет рассола, ты жеж знаешь, он у нас позиционируется как как лучший рассол всех времён и народов, так сказать ЭТАЛОН РАССОЛА на планете земля, а с тех пор как в USA на рассол бум, он здесь идёт на вес золота )))
PS я то думал, что таймера переменными пересеклись, фуф, отлегло...
ЗЗЫ выяснился дефект фикции - на самой малой скорости пропускает знаки (((
нашёл!!!
Две константы связаны 100 в таймере и 100 миллисекунд интервал точки, интервал точки всегда должен быть меньше интервала таймера, тогда пропускать не будет
выяснилось - будет, но значительно меньше...видимо из-за асинхронности таймеров...
а если зацепиться за loop этих артефактов нет совсем, на любых скоростях
Все твердят, точки бифуркации, точки бифуркации...на них видимо скетч и напарывается во временных отрезках...
как там у тебя с этим с библиотекой таймеров, как обходишь, как выставляются приоритеты???
ну дак у тебя тоже в бифуркациях не пропускает. Тогда я не понимаю.
если функция опроса датчика скорости стоит в loop тоже не пропускает )))
Особенно сказывается когда выставляешь минимальную скорость, может это подскажет что-то
как вариант - потеря истинного указателя на символ для передачи, он забегает вперёд???
и отслеживать пропуски в мониторе порта совсем не комильфо, телеграф то я принимаю в фоновом режиме, занимаясь попутно любыми другими делами, единственный недостаток - для домочадцев, это пиликанье )))
Вы про реализацию изменеия скорости передачи на потенциометре?
Нет
у меня большое подозрение, что два раза уменьшается указатель на элемент строки при прерывании таймером, чтение значения с потенциометра и установка значения скорости при вынесении процедуры в loop отрабатывает безукоризненно!!!
так как иногда пропускает и пробел тоже
Если буква строки взята в отработку, то выдаёт её код азбукой морзе правильно, не усекает
с другой стороны, фунция имеет рандомный глюк, вот прямо имитирует работу оператора, захочешь такую написать - замаешься )))
uint8_t newdottime = 100 - 5*(analogRead(mySpeedPin)>>6); // тут все твои чтения и вычисления
поигрался с опциями компилятора, вот так при получасовом тесте на минимальной скорости глюков не заметил
ЗЫ рано обрадовался, начал лыгать на больших скоростях
PPS изменил выкинув map 5 минут полёт нормальный пытаю на других скоростях, неужели в ней была вся проблема? (Нет, поигравшись со скоростями нашёл такое положение, что чётко во втором CQ всегда пропускает С и эта скорость равна 30 открыл-закрыл монитор порта и глюк исчез, чудеса)))
нууу, у мня идей больше неть. бери, значить, другой код маяка.
Не!!! "Русские не сдаются"!!!
Я тут явную связь выявил, стоит открыть-закрыть монитор порта и скетч начинает работать правильно...
Надо смотреть обработку сериала, он правда что делает, при открытии монитора порта - резетит но с открытым последовательным... потом закрываю и всё работает как надо...
уменьшил скорость порта до 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 было
всё таки точки буфуркации в таймерах видимо имеют место быть...
Вот так значительно лучше
1
hSensorRead = TimerList.Add(113,tmrSensorRead);
// таймер опроса потенциометра скорости опрашиваем раз в 0.113 секунды (на этой строке уже не валится)
2
uint8_t newdottime = 101 - map(analogRead(mySpeedPin), 0,1023,0,15)*5;
// тут все чтения и вычисления
Ой. Забыл про саафтара. Подтверждаю, понужал меня не спать изо всех сил.
Судя по аватару, это и есть автор.
Выставь пока таймер опроса потанцометра на 103 мс. все остальное завтра.
А вапще, третий таймер можно выкинуть, а SendMessage для аналогово чтения влепить в конец функции sendPause.
Выкинуть то можно, но желательно чтобы все таймера обрабатывались правильно, как реализовано в библиотеке если два или более тамера сработали?
С этим я разбираюсь.
С этим я разбираюсь.
вот это я тебя озадачил )))
Запусти у себя
01
/*
02
Name: TimersTest.ino
03
Created: 30.04.2019 9:01:42
04
Author: DetSimen
05
*/
06
#include <TimerList.h>
07
#include <Messages.h>
08
#include <DEF_Message.h>
09
#include <Generics.h>
10
11
extern
TTimerList TimerList;
12
TMessageList MessageList(12);
13
14
THandle hTimer1, hTimer2, hTimer3, hTimer4;
15
16
17
18
void
tmr1(
void
) {
19
SendMessage(msg_TimerEnd, 1);
20
}
21
22
void
tmr2(
void
) {
23
SendMessage(msg_TimerEnd, 2);
24
}
25
26
void
tmr3(
void
) {
27
SendMessage(msg_TimerEnd, 3);
28
}
29
30
void
tmr4(
void
) {
31
SendMessage(msg_TimerEnd, 4);
32
}
33
34
35
void
setup
()
36
{
37
delay(1000);
38
Serial
.begin(115200);
39
Serial
<<
"Program started\n"
;
40
41
hTimer1 = TimerList.Add(1000, tmr1);
42
hTimer2 = TimerList.Add(2000, tmr2);
43
hTimer3 = TimerList.Add(1000, tmr3);
44
hTimer4 = TimerList.Add(2000, tmr4);
45
46
47
}
48
49
void
loop
()
50
{
51
static
uint8_t sec = 0;
52
53
if
(not MessageList.Available())
return
;
54
55
TMessage msg = MessageList.GetMessage();
56
57
switch
(msg.Message)
58
{
59
case
msg_TimerEnd: {
60
if
(msg.LoParam == 1) {
61
sec++;
62
Serial
<<
"Timer 1 ends "
<< sec << eoln;
63
break
;
64
}
65
if
(msg.LoParam == 2) {
66
Serial
<<
"Timer 2 ends "
<< sec << eoln;;
67
break
;
68
}
69
if
(msg.LoParam == 3) {
70
Serial
<<
"Timer 3 ends "
<< sec << eoln;;
71
break
;
72
}
73
if
(msg.LoParam == 4) {
74
Serial
<<
"Timer 4 ends "
<< sec << eoln;
75
sec = 0;
76
Serial
<< eoln << eoln;
77
}
78
break
;
79
}
80
default
:
81
Serial
.print(
"Unknown message 0x"
);
Serial
.println(msg.Message, HEX);
82
break
;
83
}
84
85
86
}
потом интервалы поменяй на вот так
1
hTimer1 = TimerList.Add(1000, tmr1);
2
hTimer2 = TimerList.Add(2000, tmr2);
3
hTimer3 = TimerList.Add(4000, tmr3);
4
hTimer4 = TimerList.Add(8000, tmr4);
и последи. Тама все интервалы пересекаюца, не будет ли пропусков где.
У мня нет.
Котъ озадачен и негодуэ.
Се, я пойду с трудящимися солидарничать. Ищите мня после 12-го.
Се, я пойду с трудящимися солидарничать. Ищите мня после 12-го.
ни чё се, а я до компа только добрался )))
test1
01
Program started
02
Timer 1 ends 1
03
Timer 3 ends 1
04
Timer 1 ends 2
05
Timer 2 ends 2
06
Timer 3 ends 2
07
Timer 4 ends 2
08
09
10
Timer 1 ends 1
11
Timer 3 ends 1
12
Timer 1 ends 2
13
Timer 2 ends 2
14
Timer 3 ends 2
15
Timer 4 ends 2
16
17
18
Timer 1 ends 1
19
Timer 3 ends 1
20
Timer 1 ends 2
21
Timer 2 ends 2
22
Timer 3 ends 2
23
Timer 4 ends 2
24
25
26
Timer 1 ends 1
27
Timer 3 ends 1
28
Timer 1 ends 2
29
Timer 2 ends 2
30
Timer 3 ends 2
31
Timer 4 ends 2
32
33
34
Timer 1 ends 1
35
Timer 3 ends 1
36
Timer 1 ends 2
37
Timer 2 ends 2
38
Timer 3 ends 2
39
Timer 4 ends 2
40
41
42
Timer 1 ends 1
43
Timer 3 ends 1
44
Timer 1 ends 2
45
Timer 2 ends 2
46
Timer 3 ends 2
47
Timer 4 ends 2
48
49
50
Timer 1 ends 1
51
Timer 3 ends 1
52
Timer 1 ends 2
53
Timer 2 ends 2
54
Timer 3 ends 2
55
Timer 4 ends 2
56
57
58
Timer 1 ends 1
59
Timer 3 ends 1
60
Timer 1 ends 2
61
Timer 2 ends 2
62
Timer 3 ends 2
63
Timer 4 ends 2
test-2
001
Program started
002
Timer 1 ends 1
003
Timer 1 ends 2
004
Timer 2 ends 2
005
Timer 1 ends 3
006
Timer 1 ends 4
007
Timer 2 ends 4
008
Timer 3 ends 4
009
Timer 1 ends 5
010
Timer 1 ends 6
011
Timer 2 ends 6
012
Timer 1 ends 7
013
Timer 1 ends 8
014
Timer 2 ends 8
015
Timer 3 ends 8
016
Timer 4 ends 8
017
018
019
Timer 1 ends 1
020
Timer 1 ends 2
021
Timer 2 ends 2
022
Timer 1 ends 3
023
Timer 1 ends 4
024
Timer 2 ends 4
025
Timer 3 ends 4
026
Timer 1 ends 5
027
Timer 1 ends 6
028
Timer 2 ends 6
029
Timer 1 ends 7
030
Timer 1 ends 8
031
Timer 2 ends 8
032
Timer 3 ends 8
033
Timer 4 ends 8
034
035
036
Timer 1 ends 1
037
Timer 1 ends 2
038
Timer 2 ends 2
039
Timer 1 ends 3
040
Timer 1 ends 4
041
Timer 2 ends 4
042
Timer 3 ends 4
043
Timer 1 ends 5
044
Timer 1 ends 6
045
Timer 2 ends 6
046
Timer 1 ends 7
047
Timer 1 ends 8
048
Timer 2 ends 8
049
Timer 3 ends 8
050
Timer 4 ends 8
051
052
053
Timer 1 ends 1
054
Timer 1 ends 2
055
Timer 2 ends 2
056
Timer 1 ends 3
057
Timer 1 ends 4
058
Timer 2 ends 4
059
Timer 3 ends 4
060
Timer 1 ends 5
061
Timer 1 ends 6
062
Timer 2 ends 6
063
Timer 1 ends 7
064
Timer 1 ends 8
065
Timer 2 ends 8
066
Timer 3 ends 8
067
Timer 4 ends 8
068
069
070
Timer 1 ends 1
071
Timer 1 ends 2
072
Timer 2 ends 2
073
Timer 1 ends 3
074
Timer 1 ends 4
075
Timer 2 ends 4
076
Timer 3 ends 4
077
Timer 1 ends 5
078
Timer 1 ends 6
079
Timer 2 ends 6
080
Timer 1 ends 7
081
Timer 1 ends 8
082
Timer 2 ends 8
083
Timer 3 ends 8
084
Timer 4 ends 8
085
086
087
Timer 1 ends 1
088
Timer 1 ends 2
089
Timer 2 ends 2
090
Timer 1 ends 3
091
Timer 1 ends 4
092
Timer 2 ends 4
093
Timer 3 ends 4
094
Timer 1 ends 5
095
Timer 1 ends 6
096
Timer 2 ends 6
097
Timer 1 ends 7
098
Timer 1 ends 8
099
Timer 2 ends 8
100
Timer 3 ends 8
101
Timer 4 ends 8
102
103
104
Timer 1 ends 1
105
Timer 1 ends 2
106
Timer 2 ends 2
107
Timer 1 ends 3
108
Timer 1 ends 4
109
Timer 2 ends 4
110
Timer 3 ends 4
111
Timer 1 ends 5
112
Timer 1 ends 6
113
Timer 2 ends 6
114
Timer 1 ends 7
ну дак у тебя тоже в бифуркациях не пропускает. Тогда я не понимаю.
ну дак у тебя тоже в бифуркациях не пропускает. Тогда я не понимаю.
если функция опроса датчика скорости стоит в loop тоже не пропускает )))
Особенно сказывается когда выставляешь минимальную скорость, может это подскажет что-то
как вариант - потеря истинного указателя на символ для передачи, он забегает вперёд???
и отслеживать пропуски в мониторе порта совсем не комильфо, телеграф то я принимаю в фоновом режиме, занимаясь попутно любыми другими делами, единственный недостаток - для домочадцев, это пиликанье )))
Ну тогда сделай как я в #127 говорил про третий таймер
Ну тогда сделай как я в #127 говорил про третий таймер
съедает, иногда паузы между знаками иногда буквы
Ну не знаю тогда. Седня чота думается плохо
Ну не знаю тогда. Седня чота думается плохо
так оно и понятно, шашлычок в маринаде подходит небось
У нас -3, мы с котяном дома.
У нас -3, мы с котяном дома.
у нас +21, я пока дома, лежу на гвоздях
Короче, это надо у аксакалов спрашивать. Если оне снизойдут, канеш. Вапще не удивлюсь, если в моих таймерах и очередях всякая хня понаписана.
Вы про реализацию изменеия скорости передачи на потенциометре?
Вы про реализацию изменеия скорости передачи на потенциометре?
Нет
Вы про реализацию изменеия скорости передачи на потенциометре?
Нет
у меня большое подозрение, что два раза уменьшается указатель на элемент строки при прерывании таймером, чтение значения с потенциометра и установка значения скорости при вынесении процедуры в loop отрабатывает безукоризненно!!!
так как иногда пропускает и пробел тоже
Если буква строки взята в отработку, то выдаёт её код азбукой морзе правильно, не усекает
с другой стороны, фунция имеет рандомный глюк, вот прямо имитирует работу оператора, захочешь такую написать - замаешься )))
Вынеси в loop. Я сиравно пью до 12-го.
и попробуй не map() а
1
uint8_t newdottime = 100 - 5*(analogRead(mySpeedPin)>>6);
// тут все твои чтения и вычисления
Вынеси в loop. Я сиравно пью до 12-го.
и попробуй не map() а
1
uint8_t newdottime = 100 - 5*(analogRead(mySpeedPin)>>6);
// тут все твои чтения и вычисления
поигрался с опциями компилятора, вот так при получасовом тесте на минимальной скорости глюков не заметил
ЗЫ рано обрадовался, начал лыгать на больших скоростях
PPS изменил выкинув map 5 минут полёт нормальный пытаю на других скоростях, неужели в ней была вся проблема? (Нет, поигравшись со скоростями нашёл такое положение, что чётко во втором CQ всегда пропускает С и эта скорость равна 30 открыл-закрыл монитор порта и глюк исчез, чудеса)))
001
/*
002
Name: Morze.ino
003
Created: 21.04.2019 4:16:26
004
Author: DetSimen
005
*/
006
#pragma GCC otimize ("-Os") //где х - 0, 1, 2, 3, fast, g, s - уровень оптимизации
007
//#include <EEPROM.h>
008
#include "Arduino.h"
009
#include "MorzeTable.h"
010
#include "TimerList.h"
011
#include "Messages.h"
012
013
#define toneFreq (800) //частота звука (выбирайте между 600 - 1000Гц)
014
static
uint8_t TXPin = 13;
// пин передаччика
015
int
tonePin = A4;
// выход звука на радиостанцию
016
int
mySpeedPin = A0;
// потенциометр скорости
017
int
mySpeed;
// переменная для потенуиометра
018
019
extern
TTimerList TimerList;
// списой таймеров (до 10) паумолчанью
020
021
TMessageList MessageList(12);
// очереть на 12 сапщений
022
023
static
const
int
msg_ReadSerial = 0x100;
// сообщение "Читать Сериал"
024
static
const
int
msg_SendChar = 0x101;
// сообщение "Передать символ (букву)"
025
static
const
int
msg_SendNextBit = 0x102;
// сообщение "Передать следующий бит в букве"
026
static
const
int
msg_ReadSensors = 0x105;
// считать потенциометр скорости
027
028
static
/*const*/
uint32_t DOT_TIME = 35;
// основное время, длительность точки 75 мс, остальные производные
029
static
/*const*/
uint32_t DASH_TIME = 3 * DOT_TIME;
// длительность тире
030
031
static
const
uint16_t REPEAT_TIME = 5000;
// Задержка в мс между повторениями текста, по умолчанию 5 сек.
032
static
const
uint16_t SERIAL_TIMEOUT = 2000;
// если в течение 2000 мс не было данных с сериала, значит приняли всю строку
033
034
static
const
uint8_t MAX_STRING_LENGTH = 128;
// макс длина передаваемой строки
035
036
enum
class
enumTXState :
bool
{ Pause =
false
, Bit =
true
};
037
038
enumTXState TXState = enumTXState::Pause;
// что передаем в данный момент: или бит (точка/тире) или паузу
039
040
THandle hTXTimer = INVALID_HANDLE;
// таймер передаччика
041
THandle hSerialTimer = INVALID_HANDLE;
// таймер таймаута приема из Serial
042
THandle hRepeatTimer = INVALID_HANDLE;
// таймер повтора фразы
043
THandle hSensorRead = INVALID_HANDLE;
// таймер для опроса потенциометра скорости передачи
044
045
uint8_t TXCurrentMask = 0;
// маска текущего символа
046
uint8_t TXCurrentCode = 0;
// битовый код Морзе текущего символа
047
bool
TXBusy =
false
;
// идет передача бита или паузы
048
bool
TXStopped =
false
;
// передаччик остановлен нахрен. ничего не передаеца
049
050
051
String StringToTransmit;
// строка, которую будем слать
052
uint16_t TransmitCharIndex = 0;
// индекс текущего символа, в этой строке
053
054
055
void
TXOnOff(
const
bool
On) {
// передаччик вкл/выкл
056
digitalWrite(TXPin, On);
057
if
(On) {tone(tonePin, toneFreq);}
else
{ noTone(tonePin);}
058
}
059
060
void
tmrTXTimer(
void
) {
// здесь кончился таймер передачи бита/паузы
061
SendMessage(msg_TimerEnd, hTXTimer);
062
TimerList.Stop(hTXTimer);
// остановим этот таймер
063
}
064
065
void
tmrSerialTimer(
void
) {
// строку приняли до конца
066
SendMessage(msg_TimerEnd, hSerialTimer);
067
TimerList.Stop(hSerialTimer);
// таймер больше не нужен
068
}
069
070
void
tmrRepeat(
void
) {
// таймер повтора кончился, начинаем передавать сначала
071
TransmitCharIndex = 0;
072
TXStopped =
false
;
073
TimerList.Stop(hRepeatTimer);
074
}
075
076
void
sendBit(
const
bool
aBit) {
// передать один бит (точку == false или тире == true)
077
078
TXState = enumTXState::Bit;
// признак: передаем бит
079
080
TXOnOff(
true
);
// ключ на старт!
081
082
TXBusy =
true
;
// передаччик теперя занят
083
084
TimerList.setNewInterval(hTXTimer, aBit ? DASH_TIME : DOT_TIME);
// длительность таймера разная для точки и тире
085
TimerList.Reset(hTXTimer);
// перезапустим его сначала интервала
086
087
}
088
089
void
sendPause(
const
uint8_t kf = 1) {
// передаем паузу длиной в 1 точку по умолчанию
090
TXState = enumTXState::Pause;
091
092
TXBusy =
true
;
// передаччик занят
093
094
TimerList.setNewInterval(hTXTimer, kf*DOT_TIME);
// либо длительность паузы кратна точке в kf раз
095
TimerList.Reset(hTXTimer);
// перезапустим таймер сначала
096
}
097
098
void
tmrSensorRead(
void
){
099
SendMessage(msg_ReadSensor);
// пхаем в очередь сообщение на чтение потанцометра
100
}
101
102
;
void
setup
()
103
{
104
Serial
.begin(115200);
105
delay(1000);
// чтоб всё устаканилось к старту
106
pinMode(TXPin, OUTPUT);
107
TXOnOff(
false
);
// ключ выключен
108
109
// все таймеры создаюца по умолчанию остановленными
110
//
111
hTXTimer = TimerList.AddStopped(DOT_TIME, tmrTXTimer);
// таймер передаччика бит
112
hSerialTimer = TimerList.AddStopped(SERIAL_TIMEOUT, tmrSerialTimer);
// таймер таймаута чтения из Serial
113
hRepeatTimer = TimerList.AddStopped(REPEAT_TIME, tmrRepeat);
// таймер повтора передачи строки
114
hSensorRead = TimerList.Add(100,tmrSensorRead);
// таймер опроса потенциометра скорости опрашиваем раз в 0.1 секунды (на этой строке валится)
115
116
StringToTransmit.reserve(MAX_STRING_LENGTH);
// хапнем сразу место под строку, чтоб не перераспределять потом
117
StringToTransmit =
"CQ DX UA6EM CQ DX UA6EM QSA? 73! 73! 73! K"
;
// строка для передачи по умолчанию
118
TransmitCharIndex = 0;
119
}
120
121
void
loop
()
122
{
123
if
(
Serial
.available()) {
// если в сериал чота припрыгало
124
SendMessage(msg_ReadSerial);
// пошлем команду прочесть сериал
125
TXStopped =
true
;
// передачу остановим
126
TransmitCharIndex = 0;
// и все индексы и маски обнулим,
127
TXCurrentCode = 0;
// так как после приема будем передавать уже новую строку
128
TXCurrentMask = 0;
129
}
130
// тут читаем потенциометр скорости
131
// mySpeed = map(analogRead(mySpeedPin), 0,1023,0,15);
132
// DOT_TIME = 100-mySpeed*5;
133
// DASH_TIME = 3 * DOT_TIME;
134
135
if
((not TXBusy) and (not TXStopped)) {
// если передаччик не остановлен и не занят передачей бита
136
137
if
(TXCurrentMask > 0)
// если маска еще до конца не сдвинулась
138
{
139
SendMessage(msg_SendNextBit);
// передать следующий бит знака
140
}
141
else
142
{
143
SendMessage(msg_SendChar);
// знак кончился, начать передавать след. символ
144
}
145
}
146
147
148
if
( not MessageList.Available())
return
;
// если сапщений в очереди нет, выходим
149
150
TMessage msg = MessageList.GetMessage();
151
152
switch
(msg.Message)
153
{
154
155
156
case
msg_TimerEnd: {
157
if
(msg.LoParam == hSerialTimer) {
// кончился таймер приёма по сериал
158
TXStopped =
false
;
// можно стартовать передаччик, есличо
159
break
;
160
}
161
if
(msg.LoParam == hTXTimer) {
// кончился таймер передачи бита/паузы
162
TXBusy =
false
;
// можно передавать следующий
163
164
if
(TXState == enumTXState::Bit) {
// если передавали бит, передадим 1 паузу
165
TXOnOff(
false
);
// выключим ключ
166
TXCurrentMask >>= 1;
167
if
(TXCurrentMask>0) sendPause();
else
sendPause(3);
// а если знак кончился, то 3 паузы
168
}
169
170
break
;
171
}
172
173
break
;
174
}
175
176
case
msg_SendNextBit: {
// передаем след. бит (точка/тире)
177
sendBit(TXCurrentCode & TXCurrentMask);
178
break
;
179
}
180
181
case
msg_ReadSerial: {
// чтение из сериала
182
if
(!TimerList.isActive(hSerialTimer)) {
// если таймер таймаута остановлен
183
StringToTransmit =
""
;
// значить читаем новую строку
184
TransmitCharIndex = 0;
185
}
186
StringToTransmit +=
char
(
Serial
.read());
// берем символ из сериал и вклеиваем в строку
187
TimerList.Reset(hSerialTimer);
// перезапускаем таймер таймаута (помнишь? 2 секунды после ПОСЛЕДНЕГО символа)
188
break
;
189
}
190
191
case
msg_SendChar: {
// послать знак
192
if
(TransmitCharIndex < StringToTransmit.length()) {
// если строка еще не кончиилась
193
char
c = StringToTransmit[TransmitCharIndex++];
// взять символ
194
if
(c !=
' '
) {
// если не пробел, то
195
TXCurrentCode = getMorzeCode(c);
// по нему взять код Морзя см. MorzeTable.cpp
196
TXCurrentMask = getSymbolMask(getMorzeCode(c));
// и маску см. MorzeTable.cpp
197
}
198
else
sendPause(7);
// пробел между словами - передаем паузу в 7 точек
199
}
200
else
{
// если строка кончилась
201
TXStopped =
true
;
// остановим передачу
202
TransmitCharIndex = 0;
// вернем указатель на 0 символ строки
203
TimerList.Reset(hRepeatTimer);
// и запустим таймер для REPEAT
204
}
205
break
;
206
}
207
// тут читаем потенциометр скорости
208
209
case
msg_ReadSensor:{
210
uint8_t newdottime = 100 - map(analogRead(mySpeedPin), 0,1023,0,15)*5;
// тут все твои чтения и вычисления
211
Serial
.print(
"Скорость = "
);
212
Serial
.println( newdottime);
213
if
(newdottime != DOT_TIME){
// меняем ТОЛЬКО если значения РЕАЛЬНО ИЗМЕНИЛИСЬ
214
DOT_TIME = newdottime;
215
DASH_TIME = 3*DOT_TIME;
216
}
217
break
;
218
}
219
Serial
.print(
"Unknown message code: 0x"
);
Serial
.println(msg.Message, HEX);
220
break
;
221
}
222
223
}
нууу, у мня идей больше неть. бери, значить, другой код маяка.
вот эту строчку проверь внимательно, нет ли ашыбок
006
#pragma GCC otimize ("-Os") //где х - 0, 1, 2, 3, fast, g, s - уровень оптимизации
ты и default потерял в 219 строчке.
конец перепишы вот так
01
case
msg_ReadSensor: {
02
uint8_t newdottime = 100 - 5*(analogRead(mySpeedPin)>>6);
// тут все твои чтения и вычисления
03
if
(newdottime != DOT_TIME) {
// меняем ТОЛЬКО если значения РЕАЛЬНО ИЗМЕНИЛИСЬ
04
DOT_TIME = newdottime;
05
DASH_TIME = 3 * DOT_TIME;
06
Serial
.print(
"Скорость = "
);
07
Serial
.println(newdottime);
08
}
09
break
;
10
}
11
default
:
12
Serial
.print(
"Unknown message code: 0x"
);
Serial
.println(msg.Message, HEX);
13
break
;
14
}
нууу, у мня идей больше неть. бери, значить, другой код маяка.
Не!!! "Русские не сдаются"!!!
Я тут явную связь выявил, стоит открыть-закрыть монитор порта и скетч начинает работать правильно...
Надо смотреть обработку сериала, он правда что делает, при открытии монитора порта - резетит но с открытым последовательным... потом закрываю и всё работает как надо...
уменьшил скорость порта до 9600, пытаю, пока работает как надо, теперь надо строку вводимую в мониторе порта сохранить в еепром и забирать оттуда, если было сохранение, попробую сам прикрутить