Operácie

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.

Celkový pohľad na zariadenie.

Literatúra:

Dokumentácia k doske Acrob

Morse code

Dokumentácia ATmega328P

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

Zapojenie tlačidla na vývojovej doske ACROB.

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

  1. include "uart.h"
  1. define BUTTON_PIN PB3

int main(void) { uart_init();

while (1) {

   /* Morse decoder logic */

}

}


  1. define set_bit(ADDRESS, BIT)(ADDRESS |= (1 << BIT))
  2. define clear_bit(ADDRESS, BIT)(ADDRESS &= ~(1 << BIT))
  1. ifndef UART_H_
  2. define UART_H_
  1. include <stdio.h>

void uart_init(void); int uart_putc(char c, FILE * stream); void uart_puts(const char * s); char uart_getc(void);

  1. endif


  1. include <avr/io.h>
  2. include <util/delay.h>
  1. include "uart.h"

void uart_init(void) {

  1. include <util/setbaud.h>

UBRR0H = UBRRH_VALUE; UBRR0L = UBRRL_VALUE;

  1. if USE_2X

UCSR0A |= (1 << U2X0);

  1. else

UCSR0A &= ~(1 << U2X0);

  1. 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í.