Code morse 8 bits

À la demande de l'un des amoureux de l'utilisation des codes in dans l'artisanat électronique, il est devenu nécessaire d'écrire une fonction (sous-programme, procédure) qui émettra un trille à partir d'une séquence de points et de tirets. Dans un code Morse, la longueur d'un caractère peut aller de 1 caractère (lettres E et T) à 9 caractères (trigraphe SOS). Que passer à la fonction ci-dessus comme paramètre? Si vous n'êtes pas gêné par les termes de la licence, je vous invite à vous familiariser avec le processus de bourrage du code Morse en 1 octet.

En code Morse, les caractères les plus couramment utilisés sont de 1 à 6 caractères.

; . Ee   ; - Tt  ; .. Ii  ; .- Aa  ; -. Nn  ; -- Mm  ; ... Ss  ; ..- Uu  ; .-. Rr  ; .-- Ww  ; -.. Dd  ; -.- Kk  ; --. Gg  ; --- Oo  ; .... Hh  ; ...- Vv  ; ..-. Ff  ; ..--  ; .-.. Ll  ; .-.-  [AA] digraph UNKNOWN STATION ; .--. Pp  ; .--- Jj  ; -... Bb  ; -..- Xx   ; -.-. Cc  ; -.-- Yy  ; --.. Zz  ; --.- Qq  ; ---.  ; ----  ; .---- 1 ; ..--- 2 ; ...-- 3 ; ....- 4 ; ..... 5 ; -.... 6 ; --... 7 ; ---.. 8 ; ----. 9 ; ----- 0 ; ..-..  ; ..-.- [INT] trigraph - military network question marker ; -..-. Slash/Fraction Bar [/] ; -.--. Parenthesis (Open) ; .-... [AS] digraph - Ampersand (or "Wait") [&] ; -...- [BT] digraph - Double Dash = or -- ; .-.-. Plus sign [+] ; .-.-. [AR] digraph - New Page Signal ; -.-.- Starting Signal ; ...-. Understood ; .--.-.  ; .-.-.- Period [.] ; --..-- Comma [,] ; ..--.. [UD] digraph Question Mark [?] ; .----. Apostrophe ['] ; -.-.-- [KW] digraph - Exclamation Point [!] ; -.--.- Parenthesis (Close) ; ---... Colon [:] ; -.-.-. Semicolon [;] ; -....- Hyphen, Minus Sign [-] ; ..--.- Underscore [_] ; .-..-. Quotation mark ["] ; .--.-. [AC] digraph - At Sign [@] ; ...-.- End of work ; ...-..- [SX] digraph - Dollar sign [$] ; ........ [HH] digraph - Error/correction ; ...---... [SOS] trigraph 

Ces caractères seront placés dans un argument 8 bits. Un octet doit contenir une séquence de caractères (de 1 à 6) et leur nombre (également de 1 à 6). La séquence de caractères doit être alignée sur le bit le moins significatif ou le plus élevé pour faciliter l'introduction du drapeau de report (Carry) par des commandes de décalage. Nous obtenons deux options pour l'emplacement du compteur (c) et la ou les séquences de caractères:

; arg [s, x, x, x, x, c, c, c] - 1 caractère
; arg [s, s, x, x, x, c, c, c] - 2 caractères
; arg [s, s, s, x, x, c, c, c] - 3 caractères
; arg [s, s, s, s, x, c, c, c] - 4 caractères
; arg [s, s, s, s, s, c, c, c] - 5 caractères
; arg [s, s, s, s, s, s / c, c, c] - 6 caractères

; arg [c, c, c, x, x, x, x, s] - 1 caractère
; arg [c, c, c, x, x, x, s, s] - 2 caractères
; arg [c, c, c, x, x, s, s, s] - 3 caractères
; arg [c, c, c, x, s, s, s, s] - 4 caractères
; arg [c, c, c, s, s, s, s, s] - 5 caractères
; arg [c, c, c / s, s, s, s, s, s] - 6 caractères

Dans le premier mode de réalisation, avec la longueur de séquence maximale, le 6ème caractère est superposé au bit le plus significatif du compteur.

Dans le deuxième mode de réalisation, avec la longueur de séquence maximale, le 1er caractère est superposé au bit le moins significatif du compteur. Dans ce cas, le bit le moins significatif du compteur peut être considéré comme insignifiant, car les deux combinaisons 110 et 111 peuvent être considérées comme la valeur maximale du compteur (6). Si la valeur du compteur est de 5 ou moins, aucun signe significatif n'est superposé aux bits du compteur.

Nous choisissons la deuxième option. Nous appelons les points zéros, tirets - unités. Puisque la séquence de caractères est alignée sur le bit le moins significatif de l'argument, la séquence de caractères est disposée dans l'ordre inverse pour être poussée vers la droite. Nous obtenons l'encodage de l'argument:

; arg [c2, c1, c0 / s6, s5, s4, s3, s2, s1]

Dans le code Morse, la durée d'un point est considérée comme un intervalle de temps unitaire. La durée du tiret est de 3 intervalles. La pause entre les caractères à l'intérieur du caractère est de 1 intervalle. Pause entre les caractères - 4 intervalles. Pause entre les mots - 7 intervalles. Pour informer la fonction qu'il n'est pas nécessaire de déterminer les signes, entrez simplement la combinaison de pause:

; arg [0, 0, 0, 0, 0, 0, 0, 0]

Après avoir accepté l'argument arg [c2, c1, c0 / s6, s5, s4, s3, s2, s1], la fonction devrait en extraire le compteur et la séquence, "scier" le personnage et le terminer par une pause de 3 intervalles.

Pour former une pause entre les mots, nous passons l'argument arg [0, 0, 0, 0, 0, 0, 0, 0] à la fonction. La fonction doit, en plus d'une post-pause de 3 intervalles du caractère précédent, calculer une pause de 4 intervalles (total 7 intervalles).

Pour extraire le compteur, la fonction doit décaler la copie du contenu de l'argument vers la droite de 5 bits, appliquer le masque AND (00000111), assimiler le compteur à 6 s'il est égal à 7. Ensuite, étape par étape vers la droite, extraire les caractères de l'argument d'origine. Si «0» est un point: 1 intervalle de bip, 1 intervalle de pause. Si «1» est un tiret: 3 intervalles de bip, 1 intervalle de pause. Après avoir pratiqué le dernier caractère - 2 intervalles de pause. Si arg = 0: seulement une pause de 4 intervalles.

Cet encodage 8 bits couvre tous les caractères et digraphes Morse de 1 à 6 caractères. Considérez les exemples suivants:

 ; . Ee   arg[0, 0, 1, x, x, x, x, 0] ; - Tt  arg[0, 0, 1, x, x, x, x, 1] ; .. Ii  arg[0, 1, 0, x, x, x, 0, 0] ; .- Aa  arg[0, 1, 0, x, x, x, 1, 0] ; -. Nn  arg[0, 1, 0, x, x, x, 0, 1] ; -- Mm  arg[0, 1, 0, x, x, x, 1, 1] ; ... Ss  arg[0, 1, 1, x, x, 0, 0, 0] ; ..- Uu  arg[0, 1, 1, x, x, 1, 0, 0] ; .-. Rr  arg[0, 1, 1, x, x, 0, 1, 0] ; .-- Ww  arg[0, 1, 1, x, x, 1, 1, 0] ; -.. Dd  arg[0, 1, 1, x, x, 0, 0, 1] ; -.- Kk  arg[0, 1, 1, x, x, 1, 0, 1] ; --. Gg  arg[0, 1, 1, x, x, 0, 1, 1] ; --- Oo  arg[0, 1, 1, x, x, 1, 1, 1] ; .... Hh  arg[1, 0, 0, x, 0, 0, 0, 0] ; ...- Vv  arg[1, 0, 0, x, 1, 0, 0, 0] ; ..-. Ff  arg[1, 0, 0, x, 0, 1, 0, 0] ; ..--  arg[1, 0, 0, x, 1, 1, 0, 0] ; .-.. Ll  arg[1, 0, 0, x, 0, 0, 1, 0] ; .-.-  arg[1, 0, 0, x, 1, 0, 1, 0] ; .--. Pp  arg[1, 0, 0, x, 0, 1, 1, 1] ; .--- Jj  arg[1, 0, 0, x, 1, 1, 1, 0] ; -... Bb  arg[1, 0, 0, x, 0, 0, 0, 1] ; -..- Xx   arg[1, 0, 0, x, 1, 0, 0, 1] ; -.-. Cc  arg[1, 0, 0, x, 0, 1, 0, 1] ; -.-- Yy  arg[1, 0, 0, x, 1, 1, 0, 1] ; --.. Zz  arg[1, 0, 0, x, 0, 0, 1, 1] ; --.- Qq  arg[1, 0, 0, x, 1, 0, 1, 1] ; ---.  arg[1, 0, 0, x, 0, 1, 1, 1] ; ----  arg[1, 0, 0, x, 1, 1, 1, 1] ; .---- 1 arg[1, 0, 1, 1, 1, 1, 1, 0] ; ..--- 2 arg[1, 0, 1, 1, 1, 1, 0, 0] ; ...-- 3 arg[1, 0, 1, 1, 1, 0, 0, 0] ; ....- 4 arg[1, 0, 1, 1, 0, 0, 0, 0] ; ..... 5 arg[1, 0, 1, 0, 0, 0, 0, 0] ; -.... 6 arg[1, 0, 1, 0, 0, 0, 0, 1] ; --... 7 arg[1, 0, 1, 0, 0, 0, 1, 1] ; ---.. 8 arg[1, 0, 1, 0, 0, 1, 1, 1] ; ----. 9 arg[1, 0, 1, 0, 1, 1, 1, 1] ; ----- 0 arg[1, 0, 1, 1, 1, 1, 1, 1] ; ..-..  arg[1, 0, 1, 0, 0, 1, 0, 0] ; ..-.- [INT] arg[1, 0, 1, 1, 0, 1, 0, 0] ; -..-. [/] arg[1, 0, 1, 0, 1, 0, 0, 1] ; -.--. Parenthesis arg[1, 0, 1, 1, 0, 1, 1, 0] ; .-... [&] arg[1, 0, 1, 0, 0, 0, 1, 0] ; -...- [=] arg[1, 0, 1, 1, 0, 0, 0, 1] ; .-.-. [+] arg[1, 0, 1, 0, 1, 0, 1, 0] ; -.-.- Starting Signal arg[1, 0, 1, 1, 0, 1, 0, 1] ; ...-. Understood arg[1, 0, 1, 0, 1, 0, 0, 0] ; .--.-.  arg[1, 1, 0, 1, 0, 1, 1, 0] ; .-.-.- [.] arg[1, 1, 1, 0, 1, 0, 1, 0] ; --..-- [,] arg[1, 1, 1, 1, 0, 0, 1, 1] ; ..--.. [?] arg[1, 1, 0, 0, 1, 1, 0, 0] ; .----. ['] arg[1, 1, 0, 1, 1, 1, 1, 0] ; -.-.-- [!] arg[1, 1, 1, 1, 0, 1, 0, 1] ; -.--.- Parenthesis arg[1, 1, 1, 0, 1, 1, 0, 1] ; ---... [:] arg[1, 1, 0, 0, 0, 1, 1, 1] ; -.-.-. [;] arg[1, 1, 0, 1, 0, 1, 0, 1] ; -....- [-] arg[1, 1, 1, 0, 0, 0, 0, 1] ; ..--.- [_] arg[1, 1, 1, 0, 1, 1, 0, 0] ; .-..-. ["] arg[1, 1, 0, 1, 0, 0, 1, 0] ; .--.-. [@] arg[1, 1, 0, 1, 0, 1, 1, 0] ; ...-.- End of work arg[1, 1, 1, 0, 1, 0, 0, 0] 

Si vous regardez attentivement ce qui reste dans le résidu sec:

 ; ...-..- Dollar sign [$] [SX] digraph ; ........ Error/correction [HH] digraph or [EEEEEEEE] ; ...---... [SOS] 

il serait logique d'introduire une fonction supplémentaire void dot3woPostPause () après quoi travailler [X] (-..-), [5] (.....) ou [:] (---...).

Pour être complet, considérez le chemin "difficile". Pour travailler les digraphes et trigraphes Morse avec une longueur de plus de 6 caractères, il est nécessaire de faire un ajout au codage afin de travailler sur les caractères "extra" sans pause intersymbole (sans post-pause de 2 intervalles après les caractères "extra").

Le nombre de caractères «supplémentaires» est de 1 à 3. La profondeur de bits du compteur 2. Nous plaçons le compteur dans les bits d'arg [4,3], et la séquence dans les bits d'arg [2,1,0]:

; arg [0, 0, 0, c1, c0, s3, s2, s1]

Avec arg [7,6,5] = 000, pour extraire le compteur, la fonction doit décaler la copie du contenu de l'arg vers la droite de 3 bits, appliquer le masque ET (00000011). Ensuite, étape par étape vers la droite pour extraire les caractères de l'argument d'origine. Si «0» est un point: 1 intervalle de bip, 1 intervalle de pause. Si «1» est un tiret: 3 intervalles de bip, 1 intervalle de pause. Après avoir travaillé le dernier caractère, aucune pause supplémentaire n'est ajoutée.

Maintenant, pour déterminer le symbole «long», vous devez d'abord traiter les caractères sans post-pause, puis les caractères avec une post-pause. Deux arguments 8 bits sont nécessaires pour cela. Le nombre total de caractères dans les arguments doit correspondre à la longueur du caractère:

 ; ...-..- Dollar sign [$] [SX] digraph ; arg1[0, 0, 0, 0, 1, x, x, 0] arg2[1, 1, 1, 0, 0, 1, 0, 0] ; arg1[0, 0, 0, 1, 0, x, 0, 0] arg2[1, 0, 1, 1, 0, 0, 1, 0] ; arg1[0, 0, 0, 1, 1, 0, 0, 0] arg2[1, 0, 0, x, 1, 0, 0, 1] ; ; ........ Error/correction [HH] digraph or [EEEEEEEE] ; arg1[0, 0, 0, 1, 0, x, 0, 0] arg2[1, 1, 0, 0, 0, 0, 0, 0] ; arg1[0, 0, 0, 1, 1, 0, 0, 0] arg2[1, 0, 1, 0, 0, 0, 0, 0] ; ; ...---... [SOS] ; arg1[0, 0, 0, 1, 1, 0, 0, 0] arg2[1, 1, 0, 0, 0, 1, 1, 1] 

L'intégration de caractères de code Morse dans du code 8 bits peut être implémentée dans différents langages de programmation et sur différentes plates-formes. Pour Max (amoureux des codes ) j'ai préparé le code source du "poisson" sur STM8 asm .

Encodage 8 bits alternatif de l'utilisateur "Akon32", vous permettant de vous débarrasser du deuxième argument:
 ; arg[0, 0, 0, 0, 0, 0, 0, 0] — [HH] +   2  ; arg[0, 0, 0, 0, 1, 0, 0, 1] — [$] +   2  ; arg[1, 0, s1, s2, s3, s4, s5, s6] — [6 ] +   2  ; arg[1, 1, 0, s1, s2, s3, s4, s5] — [5 ] +   2  ; arg[1, 1, 1, 0, s1, s2, s3, s4] — [4 ] +   2  ; arg[1, 1, 1, 1, 0, s1, s2, s3] — [3 ] +   2  ; arg[1, 1, 1, 1, 1, 0, s1, s2] — [2 ] +   2  ; arg[1, 1, 1, 1, 1, 1, 0, s1] — [1 ] +   2  ; arg[1, 1, 1, 1, 1, 1, 1, 0] —    4  ; arg[1, 1, 1, 1, 1, 1, 1, 1] — [SOS] +   2  ;     8 ;      Carry  ;   ('1')  ;   ('0')    (Carry) -      ;  0b00000000, 0b11111111, 0b11111110     


Contrairement à une séquence de lettres (par exemple [S], [O], [S]), les digraphes et les trigraphes (par exemple [SOS]) sont traités sans pause entre les lettres.

Source: https://habr.com/ru/post/fr473038/


All Articles