Инициализация: тоновая посылка в формате Азбуки Морзе: «rk50.ru 79031423721 Petrov Roman»
Основной режим: Ожидание сигнала → Отсчет тайм-аута в 15 минут.
Если сигнал не появился, то через 15 минут тоновая посылка в формате Азбуки Морзе «слово 1», если эхо-репитер не используется, то по истечение 15 минут в эфир передернется следующее «слово 2» в формате Азбуки Морзе, потом «слово 3» и «слово 4».
Далее цикл начинается заново.
Длительность тоновой посылки составляет 111 мСек.
Если сигнал появился, то записываем, если запись превышает тайм-аут, то ограничиваем длительностью в 10.25 сек.
После окончания сигнала, воспроизводим с задержкой после подачи несущей в 500 мС.
Таким образом, гарантированно передаем начало первых букв в слове.
Исходный код последней модификации программы для микроконтроллера AVR ATTINY13A:
Программа полностью рабочая и отлажена 5 февраля 2015 года.
;########################################################
;# 25 января 2015 года
;# УПРАВЛЕНИЕ ЭХОРЕПИТЕРОМ
;# PB4-управление передачей TX
;# PB0 — тоновый выход TONE
;# PB2 -индикатор состояния LED
;# PB3 — вход детектора IN
;# АЛГОРИТМ РАБОТЫ:
;# 1.1ТОН 3 СЕК.-> ПАУЗА 3 СЕК -> ИНФОРМАЦИЯ 1 -> ТАЙАУТ 15 МИНУТ
;# 1.2 -> ТОН 3 СЕК. -> ПАУЗА 3 СЕК ТАЙМАУТ 15 МИНУТ
;# 1.3 ->ТОН 3 СЕК. -> -> ПАУЗА 3 СЕК -> ТАЙАУТ 15 МИНУТ
;# 1.4 ->ТОН 3СЕК -> ПАУЗА 3 СЕК -> ИНФОРМАЦИЯ 2 …
; Добавлены 3-ре тоновые посылки в формате Азбуки Морзе в период 15, 30, 45 и 60 мин — 24 февраля 2015 год.
; добавлена функция воспроизведения ранее записанной фрпазы после первого там-аута в минут.
; Оканчательно доработана с устранением всех ошибок.
;########################################################
.include «tn13def.inc»
.list
.def tmp = r16;
.def tmpa = r17;
.def tmp_1 = r18; сотояние порта PORTB
.def short = r19; регистр для формирования длинной задержки
.def long = r20; регистр для осчета времени сторожевым таймером
.def tmp_2 = r21; время запис ограниченное 10сек
.def tmp_3 = r22;
.def counter = r23;
.def vtmp_2 = r24; время записи, используется для повоторного воспроизведения ранее записанной радиопосылки
.equ tx = 4 ; PB0 TX
.equ led = 2 ; PB1 LED
.equ tone = 0 ; PB2 TONE
.equ det = 3 ; PB3 IN — вход детектора
.equ play_rec = 1; PB1 управление записью и чтением
.equ t_1 = 255
.equ t_2 = 3 ; задержка d1000 1 mS
.equ t_3 = 12; задержка d3000 3S
.equ t_30min = 16; 31 задержка длинная 30 минут
.equ t_4 = 1 ; задержка 1 мС для формирования тона генератора
.equ t_10s = 42 ; задержка 10.25 Сек T=(42-1)*0.25=10.25S
.equ wait_point = 63; задержка для формирования точки +
.equ wait_point_tone = 32 ; задержка для формирования тоновой точки
.equ counter_info = 4 ; счетчик информации
.cseg
.org 0
ldi tmp, low(RAMEND)
out SPL, tmp
;########################################################
;# ИНИЦИАЛИЗАЦИЯ ТАЙМЕРА
;########################################################
ldi tmp, 0x05; коэффициент деления таймера-счетчика TCCR0 1024
out TCCR0B, tmp; загрузить в регистр управления
;########################################################
;# ИНИЦИАЛИЗАЦИЯ МИКРОКОНТРОЛЛЕРВА
;########################################################
ldi tmp, 0b0010111; PINB3- in, PINB0, PINB1, PINB2 -out
out DDRB, tmp
ldi tmp, 0xFF ; out PORTB
out PORTB, tmp
ldi counter, counter_info
rcall d3000
rcall d3000
;########################################################
;# ОСНОВНАЯ ПРОГРАММА
;########################################################
start:
;#####################################################################
;# ИНИЦИАЛИЗАЦИЯ
;#####################################################################
;### Несущая 3 СЕК -> PAUSE 3S-> TONE 3S-> PAUSE 3S->INFO> PAUSE 3S-> TONE 3S-> ОТКЛЮЧЕНИЕ
rjmp start_info; Тновая посылка в формате Азбуки Морзе RK50.RU Petrov Roman 79031423721
end_end_info:
ldi counter, counter_info
end_info:
;######################################################################
;# Ветвление, отчет тай-аута при неиспользовании репитера
;######################################################################
start_0:
ldi long, t_30min; задание времени таймаута в 15 минут T=60*(16-1) = 900 S
time_out_1:
clr short
dec long
cpi long, 0
breq start_counter_info; перейти на метку при равентсе time_long =0
det3:; Один цикл =0.235С Полная задержка равна 60 секунд
in tmp_1, PINB
sbrs tmp_1, det; пропустить следующую команду, если det=1 -нет сигнала на входе тетектора
rjmp write
;#######################################################################
; ФОРМИРОВАНИЕ ТАЙМ-АУТА в T=0.25*255 = 15 МИНУТ, ПО ИСТЕЧЕНИИ КОТОРОГО
;В ЭФИР ВЫДАЕТСЯ РАДИОПОСЫЛКА
;#######################################################################
inc short
cpi short, t_1; сравнить с t_1 (255)
breq time_out_1; при равентсве перейти на метку Задержка 0.25*255 = 63,75С
rcall d250ms
rjmp det3
start_counter_info:
rjmp start_counter_info_0
;#########################################################################
; ПРОЦЕСС ЗАПИСИ И ВОСПРОИЗВЕДЕНИЯ СИГНАЛА С ОГРАНИЧЕНИЕМ ЗАПИСИ В 10.5 СЕКУНД
;
;#########################################################################
write:
clr tmp_2
sbi PORTB, PLAY_REC; REC — начать запись
write_1:
rcall d250ms
inc tmp_2
cpi tmp_2, t_10s
breq stop_write; при равенстве tmp=255 перейти на метку stop_write (T=0,218 *48 =10,5S )
in tmp_1, PINB
sbrs tmp_1, det ; пропустить если det = 1 — сигнал на входе пропал
rjmp write_1 ; повторить цикл
stop_write: ; конец записи
; Ждать пока не закончится сигнал
det_1:
in tmp_1, PINB
sbrs tmp_1, det; пропустить если play_rec = 1 — сигнал на входе пропал
rjmp det_1
cbi PORTB, LED; горит светодиод
cbi PORTB, TX; передача
rcall d250ms; Пвуза для того, чтобы успел открытся шумоподавитель от CTCSS-сигнала
rcall d250ms
cbi PORTB, PLAY_REC; PLAY-начать воспроизведение ранее записанного файла
;#######################################################################
;# PLAY
;;#######################################################################
play:
rcall d250ms
dec tmp_2
cpi tmp_2, 0
breq stop_play_end; при равентсве нулю tmp перейти на метку
rjmp play
stop_play_end:
; Пауза перед тоновой посылкой, т.е. концом передачи
ldi tmp, 0x06
pause_tone:
dec tmp
cpi tmp,0
breq exit_pause
rcall d250ms
rjmp pause_tone
exit_pause:
rcall tone_3s ; тоновая посылка
sbi PORTB, LED; не горит светодиод
sbi PORTB, TX; передача закончена
rjmp start_0
;######################################################
;# Пауза 3 секунды = 3000 мС
;# T=1MHz/1024=976,5 Hz 1,24 mS 1,024*256=261 mS
;# T=218 mS T=0.925 mS -1 цикл
;# Реальная T=1,45S
;######################################################
d3000:
push tmp
ldi tmpa, t_3
d3000_1:
clr tmp
out TCNT0, tmp
dec tmpa
cpi tmpa,0
breq output
wait_1:; 232 mS
in tmp, TCNT0
cpi tmp, t_1
brlo wait_1
rjmp d3000_1
output:
pop tmp
ret
;################################################################
;# ЗАДЕРЖКА ДЛЯ ФОРМИРОВАНИЯ ТОНА T=2,34 mS F=500 Hz
;# ИСПОЛЬЗОВАНИЕ ТАЙМЕРА TCNT0
;# F=977Hz T=1,024 ms
;# Реальная задержка T=937 mkS
;################################################################
d1000: ; ФОРМИРОВАНИЕ ЗАДЕРЖКИ в 1 МС F=1/(2T)=500 Hz для ГЕНЕРАТОРА
push tmp
clr tmp
out TCNT0, tmp
wait_2:
in tmp, TCNT0
cpi tmp, t_4
brlo wait_2
pop tmp
ret
;################################################################
;# ЗАДЕРЖКА 250 мС
;################################################################
d250ms: ; ФОРМИРОВАНИЕ ЗАДЕРЖКИ в 1 МС F=1/(2T)=500 Hz для ГЕНЕРАТОРА
push tmp
clr tmp
out TCNT0, tmp
wait_3: ; Итоговая задрежка в 1 мС
in tmp, TCNT0
cpi tmp, t_1; сравнить с числом t_1=255
brlo wait_3
pop tmp
ret
;############################################################
;# ФОРМИРОВАНИЕ ТОНА 0,944 mS при t_2=7
;############################################################
tone_3s:
ldi tmpa, t_2; 3
stop_1:
dec tmpa
cpi tmpa,0
breq tone_stop
ldi tmp_1, 0b111100 ; Было t_1; 255
tone_start: ; Цикл выполняется за 0.472 Сек при tmp_1=255
sbi PORTB, TONE
rcall d1000; задержка в 1 мС
cbi PORTB, TONE
rcall d1000; задержка в 1 мС
;############################################################
;######## ОСЧЕТ 3 СЕКУНД ТОНОВОЙ ПОСЫЛКИ
dec tmp_1
cpi tmp_1, 0
breq stop_1; при равенстве перейтина метку stop_1
rjmp tone_start
tone_stop:
ret
;############################################################
;# ИНФОРМАЦИОННОЫЕ ПОСЫЛКИ В ПЕРИОД 15, 30, 45 и 60 минут
;############################################################
start_counter_info_0:
dec counter
cpi counter, 3
breq info_1
cpi counter, 2
breq info_2
cpi counter, 1
breq info_3
cpi counter, 0
breq info_4
;#############################################################
; ТОНОВЫЕ ПОСЫЛКИ : info_1: ТОН (79031423721 Petrov Roman) ТОН,
; info_2:ТОН ТОН (rk50.ru 79031423721) ТОН ТОН
; info_3: ТОН ТОН ТОН (rk50.ru Petrov Roman)ТОН ТОН ТОН
; info_4: ТОН ТОН ТОН ТОН (rk50.ru) ТОН ТОН ТОН ТОН
;#############################################################
info_1: ; rk50.ru
cbi PORTB, LED;
cbi PORTB, TX ;
rcall d3000; ПАУЗА 3 СЕК
rcall tone_3s ; тоновая посылка 1
rcall d3000; ПАУЗА 3 СЕК
rcall word_2 ;79031423721
rcall word_3; Petrov Roman
rcall d3000; ПАУЗА 3 СЕК
rcall tone_3s ; тоновая посылка 1
rcall d3000; ПАУЗА 3 СЕК
sbi PORTB, LED;
sbi PORTB, TX ;
rjmp end_info
info_2:
cbi PORTB, LED;
cbi PORTB, TX ;
rcall d3000; ПАУЗА 3 СЕК
rcall tone_3s ; тоновая посылка 1
rcall d250ms
rcall tone_3s ; тоновая посылка 2
rcall d3000; ПАУЗА 3 СЕК
rcall word_1 ; rk50.ru
rcall word_2 ;79031423721
rcall d3000; ПАУЗА 3 СЕК
rcall tone_3s ; тоновая посылка 1
rcall d250ms
rcall tone_3s ; тоновая посылка 2
rcall d3000; ПАУЗА 3 СЕК
sbi PORTB, LED;
sbi PORTB, TX ;
rjmp end_info
info_3: ; rk50.ru Petrov Roman
cbi PORTB, LED;
cbi PORTB, TX ;
rcall d3000; ПАУЗА 3 СЕК
rcall tone_3s ; тоновая посылка 1
rcall d250ms
rcall tone_3s ; тоновая посылка 2
rcall d250ms
rcall tone_3s ; тоновая посылка 3
rcall d3000; ПАУЗА 3 СЕК
rcall word_1 ; rk50.ru
rcall word_3 ; Petrov Roman
rcall d3000; ПАУЗА 3 СЕК
rcall tone_3s ; тоновая посылка 1
rcall d250ms
rcall tone_3s ; тоновая посылка 2
rcall d250ms
rcall tone_3s ; тоновая посылка 3
rcall d3000; ПАУЗА 3 СЕК
sbi PORTB, LED;
sbi PORTB, TX ;
rjmp end_info
info_4:
cbi PORTB, LED;
cbi PORTB, TX ;
rcall d3000; ПАУЗА 3 СЕК
rcall tone_3s ; тоновая посылка 1
rcall d250ms
rcall tone_3s ; тоновая посылка 2
rcall d250ms
rcall tone_3s ; тоновая посылка 3
rcall d250ms
rcall tone_3s ; тоновая посылка 4
rcall d3000; ПАУЗА 3 СЕК
rcall word_1
rcall d3000; ПАУЗА 3 СЕК
rcall tone_3s ; тоновая посылка 1
rcall d250ms
rcall tone_3s ; тоновая посылка 2
rcall d250ms
rcall tone_3s ; тоновая посылка 3
rcall d250ms
rcall tone_3s ; тоновая посылка 4
rcall d3000; ПАУЗА 3 СЕК
sbi PORTB, LED;
sbi PORTB, TX ;
rjmp end_end_info
start_info: ;rk50.ru 79031423721 Petrov Roman
cbi PORTB, LED;
cbi PORTB, TX ;
rcall d3000; ПАУЗА 3 СЕК
rcall word_1
rcall word_2
rcall word_3
rcall d3000; ПАУЗА 3 СЕК
sbi PORTB, LED; погасить светодиод
sbi PORTB, TX ; выключение передачи
rjmp end_info
;############################################################
;# ФОРМИРОВАНИЕ ТОНОВОЙ ИНФОРМАЦИОННОЙ ПОСЫЛКИ В ФОРМАТЕ АЗБУКИ МОРЗЕ
;############################################################
;############################################################
;# Тоновая посылка в формате Азбуки Морзе
;# RK50.RU PETROV ROMAN 79099119494 Первый пип и потерялся
;############################################################
word_1:
rcall symbol_R
rcall symbol_K
rcall symbol_5
rcall symbol_0
rcall symbol_point
rcall symbol_R
rcall symbol_U
ret
word_2:
rcall pause_word
rcall symbol_7
rcall symbol_9
rcall symbol_0
rcall symbol_3
rcall symbol_1
rcall symbol_4
rcall symbol_2
rcall symbol_3
rcall symbol_7
rcall symbol_2
rcall symbol_1
ret
word_3:
rcall pause_word
rcall symbol_P
rcall symbol_E
rcall symbol_T
rcall symbol_R
rcall symbol_O
rcall symbol_V
rcall pause_word
rcall symbol_R
rcall symbol_O
rcall symbol_M
rcall symbol_M
rcall symbol_A
rcall symbol_N
ret
;############################################################
;# Таблица символов в формате Азбуки Морзе
;############################################################
symbol_R :
rcall point
rcall tire
rcall point
ret
symbol_K :
rcall tire
rcall point
rcall tire
ret
symbol_5 :
rcall point
rcall point
rcall point
rcall point
rcall point
ret
symbol_0 :
rcall tire
rcall tire
rcall tire
rcall tire
rcall tire
ret
symbol_point:
rcall point
rcall point
rcall point
rcall point
rcall point
rcall point
ret
symbol_U :
rcall point
rcall point
rcall tire
ret
symbol_P :
rcall point
rcall tire
rcall tire
rcall point
ret
symbol_E :
rcall point
ret
symbol_T :
rcall tire
ret
symbol_V :
rcall point
rcall point
rcall tire
ret
symbol_O :
rcall tire
rcall tire
rcall tire
rcall tire
rcall tire
ret
symbol_M :
rcall tire
rcall tire
ret
symbol_A :
rcall point
rcall tire
ret
symbol_N :
rcall tire
rcall point
ret
symbol_7 :
rcall tire
rcall tire
rcall point
rcall point
rcall point
ret
symbol_9 :
rcall tire
rcall tire
rcall tire
rcall tire
rcall point
ret
symbol_1 :
rcall point
rcall tire
rcall tire
rcall tire
rcall tire
ret
symbol_4 :
rcall point
rcall point
rcall point
rcall point
rcall tire
ret
symbol_2 :
rcall point
rcall point
rcall tire
rcall tire
rcall tire
ret
symbol_3 :
rcall point
rcall point
rcall point
rcall tire
rcall tire
ret
;############################################################
;# ФОРМИРОВАНИЕ ДЛИТЕЛЬНОСТЕЙ ТИРЕ, ТОЧКА И ПАУЗ МЕЖДУ СЛОВАМИ
;# Тире = 3 Точкам, ПАУЗА МЕЖДУ СЛОВАМИ = 7 точкам
;Тире = 157 мС должно 175 мС
;Точка = 58,5 мС
;ПАуза между символами = 29.7 мс должно 58.5 мС
;############################################################
point:
ldi tmp_3, wait_point_tone ;
start_point:
sbi PORTB, TONE
rcall d1000; задержка в 1 мС
cbi PORTB, TONE
rcall d1000; задержка в 1 мС
dec tmp_3
cpi tmp_3,0
breq end_point
rjmp start_point
end_point:
rcall pause_point
ret
;# ФОРМИРОВАНИЕ ДЛИТЕЛЬНОСТИ ТИРЕ T=3*T (точки)
tire:
ldi tmp_3, 0b1100000 ;96 T=177 mS
start_tire: ; T=1,837 mS
sbi PORTB, TONE
rcall d1000; задержка в 1 мС
cbi PORTB, TONE
rcall d1000; задержка в 1 мС
dec tmp_3
cpi tmp_3,0
breq end_tire
rjmp start_tire
end_tire:
rcall pause_point
ret
;# ФОРМИРОВАНИЕ ДЛИТЕЛЬНОСТИ ПАУЗЫ МЕЖДУ СЛОВАМИ T=7*Tточки
pause_word:
ldi tmp_3, 0x06
start_pause_word:
rcall pause_point
dec tmp_3
cpi tmp_3,0
breq end_pause_word
rjmp start_pause_word
end_pause_word:
ret
;# ФОРМИРОВАНИЕ ДЛИТЕЛЬНОСТИ ТОЧКИ T=58,6 mS
pause_point:
push tmp
clr tmp
out TCNT0, tmp
wait_p: ; T=0,928 mS
in tmp, TCNT0
cpi tmp, wait_point; N=58,5/0,928 = 63
brlo wait_p
pop tmp
ret