Dekodér morzeovky
Zo stránky SensorWiki
Záverečný projekt predmetu MIPS / LS2026 - Oleh Chuiko
Zadanie
Cieľom projektu bolo vytvoriť jednoduchý dekodér Morseovej abecedy pomocou mikrokontroléra ATmega328P na vývojovej doske ACROB.
Mikropočítač prijíma vstup z tlačidla, meria dĺžku jeho stlačenia a podľa času rozlišuje krátke a dlhé impulzy Morseovej abecedy. Krátke stlačenie predstavuje bodku (.) a dlhé stlačenie predstavuje čiarku (-).
Postupne zadané symboly sa ukladajú do buffera a následne sa dekódujú na jednotlivé písmená. Výsledok sa vypisuje cez UART do sériového terminálu.

Literatúra:
TOC
Analýza a opis riešenia
Projekt využíva tlačidlo ako vstupný prvok pre zadávanie Morseovej abecedy. Mikrokontrolér priebežne sleduje stav tlačidla a meria čas jeho stlačenia.
Ak je tlačidlo stlačené krátko, program zaznamená bodku. Pri dlhšom stlačení sa zaznamená čiarka. Takto vytvorená sekvencia sa uloží do textového buffera.
Po ukončení zadávania znaku program porovná prijatú sekvenciu s tabuľkou Morseových kódov a vyhľadá zodpovedajúce písmeno. Výsledný znak sa následne odošle cez UART do počítača.
Pri projekte bola použitá:
vývojová doska ACROB s ATmega328P
tlačidlo pripojené na vstupný pin mikrokontroléra
UART komunikácia
jednoduché časovanie na rozlíšenie bodky a čiarky
buffer pre ukladanie Morse sekvencie

Tlačidlo bolo pripojené medzi vstupný pin mikrokontroléra a GND. Program využíva interný pull-up rezistor mikrokontroléra.
Algoritmus a program
Program pracuje v nekonečnej slučke, v ktorej sleduje stav tlačidla. Počas stlačenia sa meria čas trvania impulzu. Podľa nameranej hodnoty program rozhodne, či ide o bodku alebo čiarku.
Dekódovanie Morseovej abecedy je realizované pomocou porovnávania prijatej sekvencie s uloženými Morse znakmi. Po úspešnom rozpoznaní sa výsledné písmeno odošle cez UART.
Hlavné časti programu:
čítanie tlačidla
meranie dĺžky stlačenia
rozlíšenie bodky a čiarky
ukladanie Morse sekvencie do buffera
dekódovanie znakov
výpis cez UART
- include "uart.h"
- define BUTTON_PIN PB3
int main(void) { uart_init();
while (1) {
/* Morse decoder logic */
}
}
- define set_bit(ADDRESS, BIT)(ADDRESS |= (1 << BIT))
- define clear_bit(ADDRESS, BIT)(ADDRESS &= ~(1 << BIT))
- ifndef UART_H_
- define UART_H_
- include <stdio.h>
void uart_init(void); int uart_putc(char c, FILE * stream); void uart_puts(const char * s); char uart_getc(void);
- endif
- include <avr/io.h>
- include <util/delay.h>
- include "uart.h"
void uart_init(void) {
- include <util/setbaud.h>
UBRR0H = UBRRH_VALUE; UBRR0L = UBRRL_VALUE;
- if USE_2X
UCSR0A |= (1 << U2X0);
- else
UCSR0A &= ~(1 << U2X0);
- endif
UCSR0C = _BV(UCSZ01) | _BV(UCSZ00); UCSR0B = _BV(RXEN0) | _BV(TXEN0);
}
int uart_putc(char c, FILE * stream) { if (c == '\n') { loop_until_bit_is_set(UCSR0A, UDRE0); UDR0 = '\r'; }
loop_until_bit_is_set(UCSR0A, UDRE0); UDR0 = c;
return 0;
}
Zdrojový kód: OlehChuiko_MorseDecoder.zip
Overenie
Funkčnosť projektu bola overená pomocou zadávania rôznych Morseových sekvencií cez tlačidlo. Program správne rozlišoval krátke a dlhé impulzy a dekódované znaky vypisoval cez UART do terminálu.
Počas testovania bolo sledované:
správne rozpoznávanie bodiek a čiarok
stabilita merania času stlačenia tlačidla
správne dekódovanie znakov
správny výpis cez UART
Video demonštruje reálnu funkčnosť zariadenia a proces dekódovania Morseovej abecedy.
Video:
Čo by som urobil inak
Na ďalšíkrát by som doplnil podporu väčšieho počtu znakov a presnejšie časovanie pomocou hardvérových timerov.
Taktiež by bolo zaujímavé doplniť LCD displej alebo zvukový výstup, aby bolo možné dekódovaný text zobrazovať priamo na zariadení.